diff --git a/tools/android/eclipse/.classpath b/tools/android/eclipse/.classpath
index 4c075c2b..393bd67c 100644
--- a/tools/android/eclipse/.classpath
+++ b/tools/android/eclipse/.classpath
@@ -52,6 +52,7 @@
     <classpathentry kind="src" path="components/invalidation/impl/android/java/src"/>
     <classpathentry kind="src" path="components/invalidation/impl/android/javatests/src"/>
     <classpathentry kind="src" path="components/invalidation/impl/android/junit/src"/>
+    <classpathentry kind="src" path="components/location/android/java/src"/>
     <classpathentry kind="src" path="components/navigation_interception/android/java/src"/>
     <classpathentry kind="src" path="components/ntp_tiles/android/java/src"/>
     <classpathentry kind="src" path="components/policy/android/java/src"/>
@@ -108,6 +109,8 @@
     <classpathentry kind="src" path="third_party/gif_player/src"/>
     <classpathentry kind="src" path="third_party/jmake/src"/>
     <classpathentry kind="src" path="third_party/junit/src/src/main/java"/>
+    <classpathentry kind="src" path="third_party/leakcanary/src/leakcanary-android/src/main/java"/>
+    <classpathentry kind="src" path="third_party/leakcanary/src/leakcanary-watcher/src/main/java"/>
     <classpathentry kind="src" path="third_party/mockito/src/src/main/java"/>
     <classpathentry kind="src" path="third_party/robolectric/robolectric/robolectric/src/main/java"/>
     <classpathentry kind="src" path="third_party/robolectric/robolectric/robolectric/src/main/java"/>
diff --git a/tools/cfi/blacklist.txt b/tools/cfi/blacklist.txt
index 7cd0b41..fee115d8 100644
--- a/tools/cfi/blacklist.txt
+++ b/tools/cfi/blacklist.txt
@@ -133,26 +133,6 @@
 fun:*LayoutTreeBuilderForElement*createLayoutObject*
 fun:*EventTarget*hasEventListeners*
 fun:*HTMLCollection*invalidateCacheForAttribute*
-fun:*InlineBox*destroy*
-fun:*InlineBox*moveInLogicalDirection*
-fun:*InlineFlowBox*setConstructed*
-fun:*LayoutBlock*createsNewFormattingContext*
-fun:*LayoutBlock*computeChildPreferredLogicalWidth*
-fun:*LayoutBlock*computePreferredLogicalWidths*
-fun:*LayoutBlock*computeOverflow*
-fun:*LayoutBlock*logicalLeftOffsetForContent*
-fun:*LayoutBlock*marginAfterForChild*
-fun:*LayoutBlock*marginBeforeForChild*
-fun:*LayoutBlock*marginStartForChild*
-fun:*LayoutBlock*updateLogicalWidthAndColumnWidth*
-fun:*LayoutBlockFlow*computeInlinePreferredLogicalWidths*
-fun:*LayoutBlockFlow*determineLogicalLeftPositionForChild*
-fun:*LayoutBlockFlow*layoutBlockFlow*
-fun:*LayoutBlockFlow*layoutInlineChildren*
-fun:*LayoutBlockFlow*marginBeforeEstimateForChild*
-fun:*LayoutBlockFlow*rebuildFloatsFromIntruding*
-fun:*LayoutBlockFlow*yPositionForFloatIncludingMargin*
-fun:*LayoutBlockFlow*styleDidChange*
 fun:*LayoutBoxModelObject*borderAndPaddingHeight*
 fun:*LayoutBoxModelObject*borderAndPaddingWidth*
 fun:*LayoutBoxModelObject*borderAndPaddingBefore*
diff --git a/tools/checkbins/checkbins.py b/tools/checkbins/checkbins.py
index ec95578..98eef13 100755
--- a/tools/checkbins/checkbins.py
+++ b/tools/checkbins/checkbins.py
@@ -29,10 +29,8 @@
 # Please do not add your file here without confirming that it indeed doesn't
 # require /NXCOMPAT and /DYNAMICBASE.  Contact cpu@chromium.org or your local
 # Windows guru for advice.
-EXCLUDED_FILES = ['chrome_frame_mini_installer.exe',
-                  'mini_installer.exe',
-                  'next_version_mini_installer.exe',
-                  'wow_helper.exe'
+EXCLUDED_FILES = ['mini_installer.exe',
+                  'next_version_mini_installer.exe'
                   ]
 
 def IsPEFile(path):
diff --git a/tools/checklicenses/checklicenses.py b/tools/checklicenses/checklicenses.py
index 957f4ae..3d27b0f2 100755
--- a/tools/checklicenses/checklicenses.py
+++ b/tools/checklicenses/checklicenses.py
@@ -231,11 +231,6 @@
         'UNKNOWN',
     ],
 
-    # https://mail.python.org/pipermail/cython-devel/2014-July/004062.html
-    'third_party/cython': [
-        'UNKNOWN',
-    ],
-
     'third_party/devscripts': [
         'GPL (v2 or later)',
     ],
diff --git a/tools/chrome_proxy/integration_tests/chrome_proxy_pagesets/lo_fi.py b/tools/chrome_proxy/integration_tests/chrome_proxy_pagesets/lo_fi.py
index ab154b7f..456d219 100644
--- a/tools/chrome_proxy/integration_tests/chrome_proxy_pagesets/lo_fi.py
+++ b/tools/chrome_proxy/integration_tests/chrome_proxy_pagesets/lo_fi.py
@@ -10,6 +10,8 @@
   """
   A test page for the chrome proxy Lo-Fi tests.
   Checks that the compressed image is below a certain threshold.
+  The test page is uncacheable otherwise a cached page may be served that
+  doesn't have the correct via headers.
   """
 
   def __init__(self, url, page_set):
@@ -23,7 +25,7 @@
     super(LoFiStorySet, self).__init__()
 
     urls_list = [
-      'http://check.googlezip.net/cacheable/test.html',
+      'http://check.googlezip.net/static/index.html',
     ]
 
     for url in urls_list:
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
index ca6bb18a..ba5ba4a 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
+++ b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
@@ -177,13 +177,6 @@
   if (!info)
     return;
 
-  // Check consistency of stack-allocated hierarchies.
-  if (info->IsStackAllocated()) {
-    for (auto& base : info->GetBases())
-      if (!base.second.info()->IsStackAllocated())
-        reporter_.DerivesNonStackAllocated(info, &base.second);
-  }
-
   if (CXXMethodDecl* trace = info->GetTraceMethod()) {
     if (trace->isPure())
       reporter_.ClassDeclaresPureVirtualTrace(info, trace);
@@ -206,6 +199,17 @@
   }
 
   if (info->IsGCDerived()) {
+    // It is illegal for a class to be both stack allocated and garbage
+    // collected.
+    if (info->IsStackAllocated()) {
+      for (auto& base : info->GetBases()) {
+        RecordInfo* base_info = base.second.info();
+        if (Config::IsGCBase(base_info->name()) || base_info->IsGCDerived()) {
+          reporter_.StackAllocatedDerivesGarbageCollected(info, &base.second);
+        }
+      }
+    }
+
     if (!info->IsGCMixin()) {
       CheckLeftMostDerived(info);
       CheckDispatch(info);
diff --git a/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp b/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
index ef3a37d..bd46f2c 100644
--- a/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
+++ b/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
@@ -127,9 +127,9 @@
 const char kManualDispatchMethodNote[] =
     "[blink-gc] Manual dispatch %0 declared here:";
 
-const char kDerivesNonStackAllocated[] =
+const char kStackAllocatedDerivesGarbageCollected[] =
     "[blink-gc] Stack-allocated class %0 derives class %1"
-    " which is not stack allocated.";
+    " which is garbage collected.";
 
 const char kClassOverridesNew[] =
     "[blink-gc] Garbage collected class %0"
@@ -197,8 +197,8 @@
       diagnostic_.getCustomDiagID(getErrorLevel(), kMissingTraceDispatch);
   diag_missing_finalize_dispatch_ =
       diagnostic_.getCustomDiagID(getErrorLevel(), kMissingFinalizeDispatch);
-  diag_derives_non_stack_allocated_ =
-      diagnostic_.getCustomDiagID(getErrorLevel(), kDerivesNonStackAllocated);
+  diag_stack_allocated_derives_gc_ = diagnostic_.getCustomDiagID(
+      getErrorLevel(), kStackAllocatedDerivesGarbageCollected);
   diag_class_overrides_new_ =
       diagnostic_.getCustomDiagID(getErrorLevel(), kClassOverridesNew);
   diag_class_declares_pure_virtual_trace_ = diagnostic_.getCustomDiagID(
@@ -453,11 +453,11 @@
   ReportDiagnostic(dispatch->getLocStart(), error) << receiver->record();
 }
 
-void DiagnosticsReporter::DerivesNonStackAllocated(
+void DiagnosticsReporter::StackAllocatedDerivesGarbageCollected(
     RecordInfo* info,
     BasePoint* base) {
   ReportDiagnostic(base->spec().getLocStart(),
-                   diag_derives_non_stack_allocated_)
+                   diag_stack_allocated_derives_gc_)
       << info->record() << base->info()->record();
 }
 
diff --git a/tools/clang/blink_gc_plugin/DiagnosticsReporter.h b/tools/clang/blink_gc_plugin/DiagnosticsReporter.h
index 5bb94d7..ae4fd00 100644
--- a/tools/clang/blink_gc_plugin/DiagnosticsReporter.h
+++ b/tools/clang/blink_gc_plugin/DiagnosticsReporter.h
@@ -54,7 +54,7 @@
                             RecordInfo* receiver);
   void MissingFinalizeDispatch(const clang::FunctionDecl* dispatch,
                                RecordInfo* receiver);
-  void DerivesNonStackAllocated(RecordInfo* info, BasePoint* base);
+  void StackAllocatedDerivesGarbageCollected(RecordInfo* info, BasePoint* base);
   void ClassOverridesNew(RecordInfo* info, clang::CXXMethodDecl* newop);
   void ClassDeclaresPureVirtualTrace(RecordInfo* info,
                                      clang::CXXMethodDecl* trace);
@@ -107,7 +107,7 @@
   unsigned diag_virtual_and_manual_dispatch_;
   unsigned diag_missing_trace_dispatch_;
   unsigned diag_missing_finalize_dispatch_;
-  unsigned diag_derives_non_stack_allocated_;
+  unsigned diag_stack_allocated_derives_gc_;
   unsigned diag_class_overrides_new_;
   unsigned diag_class_declares_pure_virtual_trace_;
   unsigned diag_left_most_base_must_be_polymorphic_;
diff --git a/tools/clang/blink_gc_plugin/tests/stack_allocated.h b/tools/clang/blink_gc_plugin/tests/stack_allocated.h
index 88c01ab1..10d8f41 100644
--- a/tools/clang/blink_gc_plugin/tests/stack_allocated.h
+++ b/tools/clang/blink_gc_plugin/tests/stack_allocated.h
@@ -23,12 +23,6 @@
     Member<HeapObject> m_obj; // Does not need tracing.
 };
 
-class AnotherStackObject : public PartObject { // Invalid base.
-    STACK_ALLOCATED();
-private:
-    StackObject m_part; // Can embed a stack allocated object.
-};
-
 class HeapObject : public GarbageCollected<HeapObject> {
 public:
     void trace(Visitor*);
@@ -36,10 +30,19 @@
     StackObject m_part; // Cannot embed a stack allocated object.
 };
 
+// Cannot derive from both heap- and stack-allocated objects.
+class DerivedHeapObject : public HeapObject, public StackObject {
+};
+
+// Cannot be stack-allocated and derive from a heap-allocated object.
+class DerivedHeapObject2 : public HeapObject {
+  STACK_ALLOCATED();
+};
+
 // STACK_ALLOCATED is inherited.
 class DerivedStackObject : public StackObject {
 private:
-    AnotherStackObject m_anotherPart; // Also fine.
+    StackObject m_anotherPart; // Also fine.
 };
 
 }
diff --git a/tools/clang/blink_gc_plugin/tests/stack_allocated.txt b/tools/clang/blink_gc_plugin/tests/stack_allocated.txt
index 7fecd12f..c6bb373 100644
--- a/tools/clang/blink_gc_plugin/tests/stack_allocated.txt
+++ b/tools/clang/blink_gc_plugin/tests/stack_allocated.txt
@@ -5,19 +5,28 @@
 ./stack_allocated.h:17:5: note: [blink-gc] Untraced field 'm_obj' declared here:
     Member<HeapObject> m_obj; // Needs tracing.
     ^
-./stack_allocated.h:26:28: warning: [blink-gc] Stack-allocated class 'AnotherStackObject' derives class 'PartObject' which is not stack allocated.
-class AnotherStackObject : public PartObject { // Invalid base.
-                           ^
-./stack_allocated.h:32:1: warning: [blink-gc] Class 'HeapObject' contains invalid fields.
+./stack_allocated.h:26:1: warning: [blink-gc] Class 'HeapObject' contains invalid fields.
 class HeapObject : public GarbageCollected<HeapObject> {
 ^
-./stack_allocated.h:36:5: note: [blink-gc] Stack-allocated field 'm_part' declared here:
+./stack_allocated.h:30:5: note: [blink-gc] Stack-allocated field 'm_part' declared here:
     StackObject m_part; // Cannot embed a stack allocated object.
     ^
+./stack_allocated.h:34:27: warning: [blink-gc] Stack-allocated class 'DerivedHeapObject' derives class 'HeapObject' which is garbage collected.
+class DerivedHeapObject : public HeapObject, public StackObject {
+                          ^
+./stack_allocated.h:38:28: warning: [blink-gc] Stack-allocated class 'DerivedHeapObject2' derives class 'HeapObject' which is garbage collected.
+class DerivedHeapObject2 : public HeapObject {
+                           ^
+./stack_allocated.h:39:3: warning: [blink-gc] Garbage collected class 'DerivedHeapObject2' is not permitted to override its new operator.
+  STACK_ALLOCATED();
+  ^
+./heap/stubs.h:149:5: note: expanded from macro 'STACK_ALLOCATED'
+    __attribute__((annotate("blink_stack_allocated")))      \
+    ^
 stack_allocated.cpp:12:1: warning: [blink-gc] Class 'AnonStackObject' contains invalid fields.
 class AnonStackObject : public StackObject {
 ^
 stack_allocated.cpp:14:5: note: [blink-gc] Raw pointer field 'm_obj' to a GC managed class declared here:
     HeapObject* m_obj;
     ^
-4 warnings generated.
+6 warnings generated.
diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp
index cd508068..b0cc3db 100644
--- a/tools/clang/plugins/ChromeClassTester.cpp
+++ b/tools/clang/plugins/ChromeClassTester.cpp
@@ -16,6 +16,9 @@
 #ifdef LLVM_ON_UNIX
 #include <sys/param.h>
 #endif
+#if defined(LLVM_ON_WIN32)
+#include <windows.h>
+#endif
 
 using namespace clang;
 using chrome_checker::Options;
@@ -130,16 +133,31 @@
 #endif
 
 #if defined(LLVM_ON_WIN32)
-  std::replace(filename.begin(), filename.end(), '\\', '/');
+  // Make path absolute.
+  if (options_.no_realpath) {
+    // This turns e.g. "gen/dir/file.cc" to "/gen/dir/file.cc" which lets the
+    // "/gen/" banned_dir work.
+    filename.insert(filename.begin(), '/');
+  } else {
+    // The Windows dance: Convert to UTF-16, call GetFullPathNameW, convert back
+    DWORD size_needed =
+        MultiByteToWideChar(CP_UTF8, 0, filename.data(), -1, nullptr, 0);
+    std::wstring utf16(size_needed, L'\0');
+    MultiByteToWideChar(CP_UTF8, 0, filename.data(), -1,
+                        &utf16[0], size_needed);
 
-  // On Posix, realpath() has made the path absolute.  On Windows, this isn't
-  // necessarily true, so prepend a '/' to the path to make sure the
-  // banned_directories_ loop below works correctly.
-  // This turns e.g. "gen/dir/file.cc" to "/gen/dir/file.cc" which lets the
-  // "/gen/" banned_dir work.
-  // This seems simpler than converting to utf16, calling GetFullPathNameW(),
-  // and converting back to utf8.
-  filename.insert(filename.begin(), '/');
+    size_needed = GetFullPathNameW(utf16.data(), 0, nullptr, nullptr);
+    std::wstring full_utf16(size_needed, L'\0');
+    GetFullPathNameW(utf16.data(), full_utf16.size(), &full_utf16[0], nullptr);
+
+    size_needed = WideCharToMultiByte(CP_UTF8, 0, full_utf16.data(), -1,
+                                      nullptr, 0, nullptr, nullptr);
+    filename.resize(size_needed);
+    WideCharToMultiByte(CP_UTF8, 0, full_utf16.data(), -1, &filename[0],
+                        size_needed, nullptr, nullptr);
+  }
+
+  std::replace(filename.begin(), filename.end(), '\\', '/');
 #endif
 
   for (const std::string& allowed_dir : allowed_directories_) {
diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp
index df9b57a..25382ec0 100644
--- a/tools/clang/plugins/FindBadConstructsAction.cpp
+++ b/tools/clang/plugins/FindBadConstructsAction.cpp
@@ -59,8 +59,6 @@
       options_.check_ipc = true;
     } else if (args[i] == "check-auto-raw-pointer") {
       options_.check_auto_raw_pointer = true;
-    } else if (args[i] == "check-implicit-copy-ctors") {
-      // This is deprecated and will be removed once the flag is not used.
     } else {
       parsed = false;
       llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n";
diff --git a/tools/clang/rewrite_to_chrome_style/OWNERS b/tools/clang/rewrite_to_chrome_style/OWNERS
new file mode 100644
index 0000000..cc9ab9f
--- /dev/null
+++ b/tools/clang/rewrite_to_chrome_style/OWNERS
@@ -0,0 +1,3 @@
+danakj@chromium.org
+dcheng@chromium.org
+lukasza@chromium.org
diff --git a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
index 5d6d0b9..3b42fc28 100644
--- a/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
+++ b/tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp
@@ -59,6 +59,10 @@
   return Node.isOverloadedOperator();
 }
 
+AST_MATCHER(clang::CXXMethodDecl, isInstanceMethod) {
+  return Node.isInstance();
+}
+
 AST_MATCHER_P(clang::FunctionTemplateDecl,
               templatedDecl,
               clang::ast_matchers::internal::Matcher<clang::FunctionDecl>,
@@ -178,8 +182,8 @@
   clang::StringRef name = decl.getName();
 
   // These methods should never be renamed.
-  static const char* kBlacklistMethods[] = {"trace", "lock", "unlock",
-                                            "try_lock"};
+  static const char* kBlacklistMethods[] = {"trace", "traceImpl", "lock",
+                                            "unlock", "try_lock"};
   for (const auto& b : kBlacklistMethods) {
     if (name == b)
       return true;
@@ -286,16 +290,39 @@
   return initializer->isEvaluatable(context);
 }
 
+AST_MATCHER_P(clang::QualType, hasString, std::string, ExpectedString) {
+  return ExpectedString == Node.getAsString();
+}
+
 bool GetNameForDecl(const clang::FunctionDecl& decl,
                     clang::ASTContext& context,
                     std::string& name) {
   name = decl.getName().str();
   name[0] = clang::toUppercase(name[0]);
 
-  // https://crbug.com/582312: Prepend "Get" if method name conflicts with type.
-  const clang::IdentifierInfo* return_type =
-      decl.getReturnType().getBaseTypeIdentifier();
-  if (return_type && return_type->getName() == name)
+  // Given
+  //   class Foo {};
+  //   using Bar = Foo;
+  //   Bar f1();  // <- |Bar| would be matched by hasString("Bar") below.
+  //   Bar f2();  // <- |Bar| would be matched by hasName("Foo") below.
+  // |type_with_same_name_as_function| matcher matches Bar and Foo return types.
+  auto type_with_same_name_as_function = qualType(anyOf(
+      hasString(name),  // hasString matches the type as spelled (Bar above).
+      hasDeclaration(namedDecl(hasName(name)))));  // hasDeclaration matches
+                                                   // resolved type (Foo above).
+  // |type_containing_same_name_as_function| matcher will match all of the
+  // return types below:
+  // - Foo foo()  // Direct application of |type_with_same_name_as_function|.
+  // - Foo* foo()  // |hasDescendant| traverses references/pointers.
+  // - RefPtr<Foo> foo()  // |hasDescendant| traverses template arguments.
+  auto type_containing_same_name_as_function =
+      qualType(anyOf(type_with_same_name_as_function,
+                     hasDescendant(type_with_same_name_as_function)));
+  // https://crbug.com/582312: Prepend "Get" if method name conflicts with
+  // return type.
+  auto conflict_matcher =
+      functionDecl(returns(type_containing_same_name_as_function));
+  if (!match(conflict_matcher, decl, context).empty())
     name = "Get" + name;
 
   return true;
@@ -642,8 +669,10 @@
   auto field_decl_matcher = id("decl", fieldDecl(in_blink_namespace));
   auto is_type_trait_value =
       varDecl(hasName("value"), hasStaticStorageDuration(), isPublic(),
-              hasType(isConstQualified()), hasType(booleanType()),
-              unless(hasAncestor(recordDecl(has(functionDecl())))));
+              hasType(isConstQualified()), hasType(type(anyOf(
+                  booleanType(), enumType()))),
+              unless(hasAncestor(recordDecl(
+                  has(cxxMethodDecl(isUserProvided(), isInstanceMethod()))))));
   auto var_decl_matcher =
       id("decl", varDecl(in_blink_namespace, unless(is_type_trait_value)));
   auto enum_member_decl_matcher =
diff --git a/tools/clang/rewrite_to_chrome_style/tests/fields-expected.cc b/tools/clang/rewrite_to_chrome_style/tests/fields-expected.cc
index a739b7d..faef4ec 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/fields-expected.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/fields-expected.cc
@@ -75,13 +75,14 @@
 namespace WTF {
 
 // We don't want to capitalize fields in type traits
-// (i.e. no |value| -> |kValue| rename is undesirable below).
+// (i.e. the |value| -> |kValue| rename is undesirable below).
 struct TypeTrait1 {
   static const bool value = true;
 };
 
 // Some type traits are implemented as classes, not structs
 // (e.g. WTF::IsGarbageCollectedType or WTF::IsAssignable).
+// We should not perform a |value| -> |kValue| rename in the type trait below.
 template <typename T>
 class TypeTrait2 {
  public:
@@ -93,6 +94,57 @@
   static const bool value = false;
 };
 
+// Some type traits have static methods.  We should not perform
+// a |value| -> |kValue| rename in the type trait below.
+template <typename T, typename U>
+struct IsSubclass {
+ private:
+  typedef char YesType;
+  struct NoType {
+    char padding[8];
+  };
+
+  static YesType SubclassCheck(U*);
+  static NoType SubclassCheck(...);
+  static T* t_;
+
+ public:
+  static const bool value = sizeof(SubclassCheck(t_)) == sizeof(YesType);
+};
+
+// Some type traits have deleted instance methods.  We should not perform
+// a |value| -> |kValue| rename in the type trait below.
+template <typename U = void>
+struct IsTraceableInCollection {
+  // Expanded from STATIC_ONLY(IsTraceableInCollection) macro:
+ private:
+  IsTraceableInCollection() = delete;
+  IsTraceableInCollection(const IsTraceableInCollection&) = delete;
+  IsTraceableInCollection& operator=(const IsTraceableInCollection&) = delete;
+  void* operator new(unsigned long) = delete;
+  void* operator new(unsigned long, void*) = delete;
+
+ public:
+  static const bool value = true;
+};
+
+// Some type traits have a non-boolean value.
+enum LifetimeManagementType {
+  kRefCountedLifetime,
+  kGarbageCollectedLifetime,
+};
+template <typename T>
+struct LifetimeOf {
+ private:
+  // Okay to rename |isGarbageCollected| to |kIsGarbageCollected|.
+  static const bool kIsGarbageCollected = true;
+
+ public:
+  // Expecting no rename of |value|.
+  static const LifetimeManagementType value =
+      !kIsGarbageCollected ? kRefCountedLifetime : kGarbageCollectedLifetime;
+};
+
 };  // namespace WTF
 
 void F() {
diff --git a/tools/clang/rewrite_to_chrome_style/tests/fields-original.cc b/tools/clang/rewrite_to_chrome_style/tests/fields-original.cc
index 52dd12e0..726c521 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/fields-original.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/fields-original.cc
@@ -72,13 +72,14 @@
 namespace WTF {
 
 // We don't want to capitalize fields in type traits
-// (i.e. no |value| -> |kValue| rename is undesirable below).
+// (i.e. the |value| -> |kValue| rename is undesirable below).
 struct TypeTrait1 {
   static const bool value = true;
 };
 
 // Some type traits are implemented as classes, not structs
 // (e.g. WTF::IsGarbageCollectedType or WTF::IsAssignable).
+// We should not perform a |value| -> |kValue| rename in the type trait below.
 template <typename T>
 class TypeTrait2 {
  public:
@@ -90,6 +91,57 @@
   static const bool value = false;
 };
 
+// Some type traits have static methods.  We should not perform
+// a |value| -> |kValue| rename in the type trait below.
+template <typename T, typename U>
+struct IsSubclass {
+ private:
+  typedef char YesType;
+  struct NoType {
+    char padding[8];
+  };
+
+  static YesType subclassCheck(U*);
+  static NoType subclassCheck(...);
+  static T* t;
+
+ public:
+  static const bool value = sizeof(subclassCheck(t)) == sizeof(YesType);
+};
+
+// Some type traits have deleted instance methods.  We should not perform
+// a |value| -> |kValue| rename in the type trait below.
+template <typename U = void>
+struct IsTraceableInCollection {
+  // Expanded from STATIC_ONLY(IsTraceableInCollection) macro:
+ private:
+  IsTraceableInCollection() = delete;
+  IsTraceableInCollection(const IsTraceableInCollection&) = delete;
+  IsTraceableInCollection& operator=(const IsTraceableInCollection&) = delete;
+  void* operator new(unsigned long) = delete;
+  void* operator new(unsigned long, void*) = delete;
+
+ public:
+  static const bool value = true;
+};
+
+// Some type traits have a non-boolean value.
+enum LifetimeManagementType {
+  RefCountedLifetime,
+  GarbageCollectedLifetime,
+};
+template <typename T>
+struct LifetimeOf {
+ private:
+  // Okay to rename |isGarbageCollected| to |kIsGarbageCollected|.
+  static const bool isGarbageCollected = true;
+
+ public:
+  // Expecting no rename of |value|.
+  static const LifetimeManagementType value =
+      !isGarbageCollected ? RefCountedLifetime : GarbageCollectedLifetime;
+};
+
 };  // namespace WTF
 
 void F() {
diff --git a/tools/clang/rewrite_to_chrome_style/tests/functions-expected.cc b/tools/clang/rewrite_to_chrome_style/tests/functions-expected.cc
index 304e3ef..792c3d89 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/functions-expected.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/functions-expected.cc
@@ -4,6 +4,19 @@
 
 namespace blink {
 
+namespace {
+
+// Naive renaming will break the build, by leaving return type the same name as
+// the function name - to avoid this "Get" prefix needs to be prepended as
+// suggested in https://crbug.com/582312#c17.
+class Foo582312 {};
+using Bar = Foo582312;
+static Bar* GetBar() {
+  return nullptr;
+}
+
+}  // namespace
+
 // Tests that the prototype for a function is updated.
 int TestFunctionThatTakesTwoInts(int x, int y);
 // Overload to test using declarations that introduce multiple shadow
diff --git a/tools/clang/rewrite_to_chrome_style/tests/functions-original.cc b/tools/clang/rewrite_to_chrome_style/tests/functions-original.cc
index eb5e0ec..5f246031 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/functions-original.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/functions-original.cc
@@ -4,6 +4,19 @@
 
 namespace blink {
 
+namespace {
+
+// Naive renaming will break the build, by leaving return type the same name as
+// the function name - to avoid this "Get" prefix needs to be prepended as
+// suggested in https://crbug.com/582312#c17.
+class Foo582312 {};
+using Bar = Foo582312;
+static Bar* bar() {
+  return nullptr;
+}
+
+}  // namespace
+
 // Tests that the prototype for a function is updated.
 int testFunctionThatTakesTwoInts(int x, int y);
 // Overload to test using declarations that introduce multiple shadow
diff --git a/tools/clang/rewrite_to_chrome_style/tests/methods-expected.cc b/tools/clang/rewrite_to_chrome_style/tests/methods-expected.cc
index 0b07aef..569e446 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/methods-expected.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/methods-expected.cc
@@ -177,16 +177,24 @@
   class OutOfLineBits {};
   enum Foo { kBlah };
   struct Bar {};
+  class Baz {};
+  class FooBar {};
+
+  template <typename T>
+  class MyRefPtr {};
 
   // Naive renaming will break the build, by leaving return type the same
-  // as method the name - to avoid this "Get" prefix needs to be prepended
+  // as the method name - to avoid this "Get" prefix needs to be prepended
   // as suggested in https://crbug.com/582312#c17.
   const OutOfLineBits* GetOutOfLineBits() const { return nullptr; }
   Foo GetFoo() { return kBlah; }
   const Bar& GetBar() const { return bar_; }
+  MyRefPtr<Baz> GetBaz() { return MyRefPtr<Baz>(); }
+  const MyRefPtr<FooBar>& GetFooBar() { return foobar_; }
 
  private:
   Bar bar_;
+  MyRefPtr<FooBar> foobar_;
 };
 
 }  // namespace blink
diff --git a/tools/clang/rewrite_to_chrome_style/tests/methods-original.cc b/tools/clang/rewrite_to_chrome_style/tests/methods-original.cc
index 734d759..bc9255b 100644
--- a/tools/clang/rewrite_to_chrome_style/tests/methods-original.cc
+++ b/tools/clang/rewrite_to_chrome_style/tests/methods-original.cc
@@ -181,16 +181,24 @@
   class OutOfLineBits {};
   enum Foo { Blah };
   struct Bar {};
+  class Baz {};
+  class FooBar {};
+
+  template <typename T>
+  class MyRefPtr {};
 
   // Naive renaming will break the build, by leaving return type the same
-  // as method the name - to avoid this "Get" prefix needs to be prepended
+  // as the method name - to avoid this "Get" prefix needs to be prepended
   // as suggested in https://crbug.com/582312#c17.
   const OutOfLineBits* outOfLineBits() const { return nullptr; }
   Foo foo() { return Blah; }
   const Bar& bar() const { return m_bar; }
+  MyRefPtr<Baz> baz() { return MyRefPtr<Baz>(); }
+  const MyRefPtr<FooBar>& fooBar() { return foobar_; }
 
  private:
   Bar m_bar;
+  MyRefPtr<FooBar> foobar_;
 };
 
 }  // namespace blink
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 9787537..05f8cde 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -27,7 +27,7 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '280106'
+CLANG_REVISION = '280836'
 
 use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ
 if use_head_revision:
@@ -333,7 +333,7 @@
     return
 
   gnuwin_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'gnuwin')
-  GNUWIN_VERSION = '4'
+  GNUWIN_VERSION = '5'
   GNUWIN_STAMP = os.path.join(gnuwin_dir, 'stamp')
   if ReadStampFile(GNUWIN_STAMP) == GNUWIN_VERSION:
     print 'GNU Win tools already up to date.'
@@ -754,21 +754,20 @@
 
   if args.with_android:
     make_toolchain = os.path.join(
-        ANDROID_NDK_DIR, 'build', 'tools', 'make-standalone-toolchain.sh')
+        ANDROID_NDK_DIR, 'build', 'tools', 'make_standalone_toolchain.py')
     for target_arch in ['aarch64', 'arm', 'i686']:
       # Make standalone Android toolchain for target_arch.
       toolchain_dir = os.path.join(
           LLVM_BUILD_DIR, 'android-toolchain-' + target_arch)
       RunCommand([
           make_toolchain,
-          '--platform=android-' + ('21' if target_arch == 'aarch64' else '19'),
-          '--install-dir="%s"' % toolchain_dir,
-          '--system=linux-x86_64',
+          '--api=' + ('21' if target_arch == 'aarch64' else '19'),
+          '--install-dir=%s' % toolchain_dir,
           '--stl=stlport',
-          '--toolchain=' + {
-              'aarch64': 'aarch64-linux-android-4.9',
-              'arm': 'arm-linux-androideabi-4.9',
-              'i686': 'x86-4.9',
+          '--arch=' + {
+              'aarch64': 'arm64',
+              'arm': 'arm',
+              'i686': 'x86',
           }[target_arch]])
       # Android NDK r9d copies a broken unwind.h into the toolchain, see
       # http://crbug.com/357890
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py
index b6331df6..8a7994e 100755
--- a/tools/clang/scripts/upload_revision.py
+++ b/tools/clang/scripts/upload_revision.py
@@ -21,9 +21,10 @@
 UPDATE_PY_PATH = os.path.join(THIS_DIR, "update.py")
 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
 
+is_win = sys.platform.startswith('win32')
 
 def PatchRevision(clang_revision, clang_sub_revision):
-  with open(UPDATE_PY_PATH, 'r') as f:
+  with open(UPDATE_PY_PATH, 'rb') as f:
     content = f.read()
   m = re.search("CLANG_REVISION = '([0-9]+)'", content)
   clang_old_revision = m.group(1)
@@ -33,13 +34,14 @@
   content = re.sub("CLANG_SUB_REVISION=[0-9]+",
                    "CLANG_SUB_REVISION={}".format(clang_sub_revision),
                    content, count=1)
-  with open(UPDATE_PY_PATH, 'w') as f:
+  with open(UPDATE_PY_PATH, 'wb') as f:
     f.write(content)
   return clang_old_revision
 
 
 def Git(args):
-  subprocess.check_call(["git"] + args)
+  # Needs shell=True on Windows due to git.bat in depot_tools.
+  subprocess.check_call(["git"] + args, shell=is_win)
 
 def main():
   parser = argparse.ArgumentParser(description='upload new clang revision')
@@ -54,8 +56,9 @@
 
   clang_revision = args.clang_revision[0]
   clang_sub_revision = args.clang_sub_revision
+  # Needs shell=True on Windows due to git.bat in depot_tools.
   git_revision = subprocess.check_output(
-      ["git", "rev-parse", "origin/master"]).strip()
+      ["git", "rev-parse", "origin/master"], shell=is_win).strip()
   print "Making a patch for Clang revision r{}-{}".format(
       clang_revision, clang_sub_revision)
   print "Chrome revision: {}".format(git_revision)
diff --git a/tools/determinism/compare_build_artifacts.py b/tools/determinism/compare_build_artifacts.py
index d486cb9..982ed3b 100755
--- a/tools/determinism/compare_build_artifacts.py
+++ b/tools/determinism/compare_build_artifacts.py
@@ -304,7 +304,6 @@
     'mojo_public_system_unittests.exe',
     'mojo_system_unittests.exe',
     'mus_clipboard_unittests.exe',
-    'mus_common_unittests.exe',
     'mus_demo_library.dll',
     'mus_demo_unittests.exe',
     'mus_gpu_unittests.exe',
@@ -445,6 +444,24 @@
   offset = 0
   with open(first_filepath, 'rb') as lhs:
     with open(second_filepath, 'rb') as rhs:
+      # Skip part of Win32 COFF header if timestamps are different.
+      #
+      # COFF header:
+      #   0 -  1: magic.
+      #   2 -  3: # sections.
+      #   4 -  7: timestamp.
+      #   ....
+      COFF_HEADER_TO_COMPARE_SIZE = 8
+      if (sys.platform == 'win32' and first_filepath.endswith('.obj')
+          and file_len > COFF_HEADER_TO_COMPARE_SIZE):
+        rhs_data = rhs.read(COFF_HEADER_TO_COMPARE_SIZE)
+        lhs_data = lhs.read(COFF_HEADER_TO_COMPARE_SIZE)
+        if lhs_data[0:4] == rhs_data[0:4] and lhs_data[4:8] != rhs_data[4:8]:
+          offset += COFF_HEADER_TO_COMPARE_SIZE
+        else:
+          lhs.seek(0)
+          rhs.seek(0)
+
       while True:
         lhs_data = lhs.read(CHUNK_SIZE)
         rhs_data = rhs.read(CHUNK_SIZE)
@@ -559,7 +576,7 @@
       second_file = os.path.join(second_dir, d)
       result = compare_files(first_file, second_file)
       if result:
-        print('%-*s: %s' % (max_filepath_len, d, result))
+        print('  %-*s: %s' % (max_filepath_len, d, result))
 
 
 def compare_build_artifacts(first_dir, second_dir, target_platform,
diff --git a/tools/gn/command_clean.cc b/tools/gn/command_clean.cc
index d14b22d..f0348d94 100644
--- a/tools/gn/command_clean.cc
+++ b/tools/gn/command_clean.cc
@@ -8,6 +8,7 @@
 #include "base/strings/stringprintf.h"
 #include "tools/gn/commands.h"
 #include "tools/gn/err.h"
+#include "tools/gn/filesystem_utils.h"
 #include "tools/gn/setup.h"
 
 namespace {
@@ -84,8 +85,9 @@
   base::FilePath build_ninja_d_file = build_dir.AppendASCII("build.ninja.d");
   if (!base::PathExists(build_ninja_d_file)) {
     Err(Location(),
-        base::StringPrintf("%s does not look like a build directory.\n",
-                           build_ninja_d_file.DirName().value().c_str()))
+        base::StringPrintf(
+            "%s does not look like a build directory.\n",
+            FilePathToUTF8(build_ninja_d_file.DirName().value()).c_str()))
         .PrintToStdout();
     return 1;
   }
diff --git a/tools/grit/grit/format/html_inline.py b/tools/grit/grit/format/html_inline.py
index 253632d..ca15413 100755
--- a/tools/grit/grit/format/html_inline.py
+++ b/tools/grit/grit/format/html_inline.py
@@ -239,12 +239,18 @@
           rewrite_function,
           filename_expansion_function=filename_expansion_function))
       return ""
-
-    return pattern % InlineToString(
-        filepath, grd_node, allow_external_script=allow_external_script,
+    # To recursively save inlined files, we need InlinedData instance returned
+    # by DoInline.
+    inlined_data_inst=DoInline(filepath, grd_node,
+        allow_external_script=allow_external_script,
         strip_whitespace=strip_whitespace,
         filename_expansion_function=filename_expansion_function)
 
+    inlined_files.update(inlined_data_inst.inlined_files)
+
+    return pattern % inlined_data_inst.inlined_data;
+
+
   def InlineIncludeFiles(src_match):
     """Helper function to directly inline generic external files (without
        wrapping them with any kind of tags).
@@ -286,10 +292,15 @@
     # Even if names_only is set, the CSS file needs to be opened, because it
     # can link to images that need to be added to the file set.
     inlined_files.add(filepath)
+
+    # Inline stylesheets included in this css file.
+    text = _INCLUDE_RE.sub(InlineIncludeFiles,
+                           util.ReadFile(filepath, util.BINARY))
     # When resolving CSS files we need to pass in the path so that relative URLs
     # can be resolved.
-    return pattern % InlineCSSText(util.ReadFile(filepath, util.BINARY),
-                                   filepath)
+
+    return pattern % InlineCSSText(text, filepath)
+
 
   def InlineCSSImages(text, filepath=input_filepath):
     """Helper function that inlines external images in CSS backgrounds."""
diff --git a/tools/grit/grit/format/html_inline_unittest.py b/tools/grit/grit/format/html_inline_unittest.py
index ea76d37..16674cf 100755
--- a/tools/grit/grit/format/html_inline_unittest.py
+++ b/tools/grit/grit/format/html_inline_unittest.py
@@ -179,6 +179,95 @@
 
     tmp_dir.CleanUp()
 
+  def testInlineCSSWithIncludeDirective(self):
+    '''Tests that include directive in external css files also inlined'''
+
+    files = {
+      'index.html': '''
+      <html>
+      <head>
+      <link rel="stylesheet" href="foo.css">
+      </head>
+      </html>
+      ''',
+
+      'foo.css': '''<include src="style.css">''',
+
+      'style.css': '''
+      <include src="style2.css">
+      blink {
+        display: none;
+      }
+      ''',
+      'style2.css': '''h1 {}''',
+    }
+
+    expected_inlined = '''
+      <html>
+      <head>
+      <style>
+      h1 {}
+      blink {
+        display: none;
+      }
+      </style>
+      </head>
+      </html>
+      '''
+
+    source_resources = set()
+    tmp_dir = util.TempDir(files)
+    for filename in files:
+      source_resources.add(tmp_dir.GetPath(filename))
+
+    result = html_inline.DoInline(tmp_dir.GetPath('index.html'), None)
+    resources = result.inlined_files
+    resources.add(tmp_dir.GetPath('index.html'))
+    self.failUnlessEqual(resources, source_resources)
+    self.failUnlessEqual(expected_inlined,
+                         util.FixLineEnd(result.inlined_data, '\n'))
+
+  def testCssIncludedFileNames(self):
+    '''Tests that all included files from css are returned'''
+
+    files = {
+      'index.html': '''
+      <!DOCTYPE HTML>
+      <html>
+        <head>
+          <link rel="stylesheet" href="test.css">
+        </head>
+        <body>
+        </body>
+      </html>
+      ''',
+
+      'test.css': '''
+      <include src="test2.css">
+      ''',
+
+      'test2.css': '''
+      <include src="test3.css">
+      .image {
+        background: url('test.png');
+      }
+      ''',
+
+      'test3.css': '''h1 {}''',
+
+      'test.png': 'PNG DATA'
+    }
+
+    source_resources = set()
+    tmp_dir = util.TempDir(files)
+    for filename in files:
+      source_resources.add(tmp_dir.GetPath(filename))
+
+    resources = html_inline.GetResourceFilenames(tmp_dir.GetPath('index.html'))
+    resources.add(tmp_dir.GetPath('index.html'))
+    self.failUnlessEqual(resources, source_resources)
+    tmp_dir.CleanUp()
+
   def testInlineCSSLinks(self):
     '''Tests that only CSS files referenced via relative URLs are inlined.'''
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 5c07baa..9dd7023 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -30,15 +30,18 @@
           'android_cronet_gn_debug_static_bot_arm64',
       'Android Cronet ARMv6 Builder':
           'android_cronet_gn_release_bot_minimal_symbols_armv6',
-      'Android Cronet Builder (dbg)': 'android_cronet_gn_debug_static_bot',
+      'Android Cronet Builder':
+          'android_cronet_gn_release_bot_minimal_symbols_arm_no_neon',
+      'Android Cronet Builder (dbg)':
+          'android_cronet_gn_debug_static_bot_arm_no_neon',
       'Android Cronet Builder Asan':
-          'android_cronet_gn_release_bot_minimal_symbols_clang_asan',
+          'android_cronet_gn_release_bot_minimal_symbols_arm_no_neon_clang_asan',
       'Android Cronet Data Reduction Proxy Builder':
-          'android_cronet_data_reduction_proxy_gn_release_bot_minimal_symbols',
+          'android_cronet_data_reduction_proxy_gn_release_bot_minimal_symbols_arm_no_neon',
       'Android Cronet KitKat Builder':
-          'android_cronet_gn_release_bot_minimal_symbols',
+          'android_cronet_gn_release_bot_minimal_symbols_arm_no_neon',
       'Android Cronet Lollipop Builder':
-          'android_cronet_gn_release_bot_minimal_symbols',
+          'android_cronet_gn_release_bot_minimal_symbols_arm_no_neon',
       'Android Cronet Marshmallow 64bit Builder':
           'android_cronet_gn_release_bot_minimal_symbols_arm64',
       'Android Cronet Marshmallow 64bit Perf':
@@ -327,6 +330,8 @@
       'Mac 10.10 Retina Debug (AMD)': 'none',
       'Mac 10.10 Retina Release (AMD)': 'none',
       'Mac 10.11 Retina Release (AMD)': 'none',
+      'Mac GPU ASAN Release':
+        'swarming_gpu_fyi_tests_gn_release_trybot_asan',
       'Mac Retina Debug': 'none',
       'Mac Retina Release': 'none',
       'Win7 Debug (ATI)': 'none',
@@ -791,9 +796,10 @@
       'android_compile_x64_dbg': 'android_gn_debug_trybot_x64',
       'android_compile_x86_dbg': 'android_gn_debug_trybot_x86',
       'android_coverage': 'android_gn_debug_trybot_java_coverage',
+      'android_cronet': 'android_cronet_gn_release_trybot_arm_no_neon',
       # TODO(crbug/597596): Switch this back to debug_trybot when cronet's
       # shared library loading is fixed.
-      'android_cronet_tester': 'android_cronet_gn_debug_static_bot',
+      'android_cronet_tester': 'android_cronet_gn_debug_static_bot_arm_no_neon',
       'android_n5x_swarming_rel': 'swarming_android_gn_release_trybot_arm64',
       'android_optional_gpu_tests_rel':
         'swarming_android_gn_release_trybot_arm64',
@@ -1056,12 +1062,12 @@
       'shared', 'debug', 'minimal_symbols',
     ],
 
-    'android_cronet_data_reduction_proxy_gn_release_bot_minimal_symbols': [
+    'android_cronet_data_reduction_proxy_gn_release_bot_minimal_symbols_arm_no_neon': [
       'android', 'cronet', 'data_reduction_proxy', 'gn',
       'release_bot_minimal_symbols', 'arm_no_neon'
     ],
 
-    'android_cronet_gn_debug_static_bot': [
+    'android_cronet_gn_debug_static_bot_arm_no_neon': [
       'android', 'cronet', 'gn', 'debug_static_bot', 'arm_no_neon'
     ],
 
@@ -1073,7 +1079,7 @@
       'android', 'cronet', 'gn', 'debug_static_bot', 'x86'
     ],
 
-    'android_cronet_gn_release_bot_minimal_symbols': [
+    'android_cronet_gn_release_bot_minimal_symbols_arm_no_neon': [
       'android', 'cronet', 'gn', 'release_bot_minimal_symbols', 'arm_no_neon'
     ],
 
@@ -1085,7 +1091,7 @@
       'android', 'cronet', 'gn', 'release_bot_minimal_symbols', 'armv6'
     ],
 
-    'android_cronet_gn_release_bot_minimal_symbols_clang_asan': [
+    'android_cronet_gn_release_bot_minimal_symbols_arm_no_neon_clang_asan': [
       'android', 'cronet', 'gn', 'release_bot_minimal_symbols', 'arm_no_neon',
       'clang', 'asan'
     ],
@@ -1098,6 +1104,10 @@
       'android', 'cronet', 'gn', 'release_bot_minimal_symbols', 'x86'
     ],
 
+    'android_cronet_gn_release_trybot_arm_no_neon': [
+      'android', 'cronet', 'gn', 'release_trybot', 'arm_no_neon'
+    ],
+
     'android_gn_debug_bot': [
       'android', 'gn', 'debug_bot',
     ],
@@ -1787,18 +1797,20 @@
     ],
 
     'swarming_gpu_fyi_tests_chromeos_gn_release_trybot': [
-      'swarming', 'gpu_tests', 'internal_gles2_conform_tests', 'gn',
-      'release_trybot', 'angle_deqp_tests', 'chromeos',
+      'swarming_gpu_fyi_tests_gn', 'release_trybot', 'chromeos',
     ],
 
     'swarming_gpu_fyi_tests_gn_debug_trybot': [
-      'swarming', 'gpu_tests', 'internal_gles2_conform_tests', 'gn',
-      'debug_trybot', 'angle_deqp_tests',
+      'swarming_gpu_fyi_tests_gn', 'debug_trybot',
     ],
 
     'swarming_gpu_fyi_tests_gn_release_trybot': [
-      'swarming', 'gpu_tests', 'internal_gles2_conform_tests', 'gn',
-      'release_trybot', 'angle_deqp_tests',
+      'swarming_gpu_fyi_tests_gn', 'release_trybot',
+    ],
+
+    'swarming_gpu_fyi_tests_gn_release_trybot_asan': [
+      'swarming_gpu_fyi_tests_gn', 'release_trybot',
+      'asan', 'full_symbols', 'disable_nacl',
     ],
 
     'swarming_gpu_fyi_tests_win_clang_debug_bot': [
@@ -1807,23 +1819,19 @@
     ],
 
     'swarming_gpu_tests_deqp_gles_gn_debug_trybot_x64': [
-      'swarming', 'gpu_tests', 'angle_deqp_tests',
-      'internal_gles2_conform_tests', 'gn', 'debug_trybot', 'x64',
+      'swarming_gpu_fyi_tests_gn', 'debug_trybot', 'x64',
     ],
 
     'swarming_gpu_tests_deqp_gles_gn_debug_trybot_x86': [
-      'swarming', 'gpu_tests', 'angle_deqp_tests',
-      'internal_gles2_conform_tests', 'gn', 'debug_trybot', 'x86',
+      'swarming_gpu_fyi_tests_gn', 'debug_trybot', 'x86',
     ],
 
     'swarming_gpu_tests_deqp_gles_gn_release_trybot_x64': [
-      'swarming', 'gpu_tests', 'angle_deqp_tests',
-      'internal_gles2_conform_tests', 'gn', 'release_trybot', 'x64',
+      'swarming_gpu_fyi_tests_gn', 'release_trybot', 'x64',
     ],
 
     'swarming_gpu_tests_deqp_gles_gn_release_trybot_x86': [
-      'swarming', 'gpu_tests', 'angle_deqp_tests',
-      'internal_gles2_conform_tests', 'gn', 'release_trybot', 'x86',
+      'swarming_gpu_fyi_tests_gn', 'release_trybot', 'x86',
     ],
 
     'swarming_gpu_tests_gn_debug_trybot': [
@@ -2416,6 +2424,11 @@
       'gyp_defines': 'test_isolation_mode=prepare',
     },
 
+    'swarming_gpu_fyi_tests_gn': {
+      'mixins': ['swarming', 'gpu_tests', 'internal_gles2_conform_tests', 'gn',
+                 'angle_deqp_tests'],
+    },
+
     # TODO(dpranke): Remove the symbolized config after the bots are  gone.
     'symbolized': {
       'gn_args': 'symbolized=true',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 7818331..9507377 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -12837,6 +12837,13 @@
   <description>A Physical Web URL was selected.</description>
 </action>
 
+<action name="PhysicalWeb.WebUI.Open">
+  <owner>cco3@chromium.org</owner>
+  <owner>mattreynolds@chromium.org</owner>
+  <owner>mmocny@chromium.org</owner>
+  <description>The Physical Web WebUI was opened or refreshed.</description>
+</action>
+
 <action name="PlatformVerificationAccepted">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index aa98ab4..aa083e8 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -13406,6 +13406,9 @@
 
 <histogram name="Event.Latency.X11EventSource.UpdateServerTime"
     units="microseconds">
+  <obsolete>
+    Deprecated 08/2016, and replaced by Linux.X11.ServerRTT.
+  </obsolete>
   <owner>thomasanderson@chromium.org</owner>
   <summary>Time to request a timestamp from the X server.</summary>
 </histogram>
@@ -14586,8 +14589,29 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.CorruptPolicyExtensionDetected" enum="BooleanHit">
+  <owner>asargent@chromium.org</owner>
+  <summary>
+    Fires when we detect corruption in an enterprise policy forced install
+    extension and begin the process of reinstalling it. Compare to
+    CorruptPolicyExtensionResolved to judge success rate.
+  </summary>
+</histogram>
+
+<histogram name="Extensions.CorruptPolicyExtensionResolved" units="ms">
+  <owner>asargent@chromium.org</owner>
+  <summary>
+    Fires when we've successfully resinstalled a corrupt enterprise policy
+    force-installed extension, with a value indicating how long it took
+    end-to-end to complete the reinstall (including download time).
+  </summary>
+</histogram>
+
 <histogram name="Extensions.CorruptPolicyExtensionWouldBeDisabled"
     enum="BooleanHit">
+  <obsolete>
+    Deprecated 9/2016 by fix for Issue 447040.
+  </obsolete>
   <owner>asargent@chromium.org</owner>
   <summary>
     Fires when we detect corruption in an enterprise policy forced install
@@ -15855,6 +15879,15 @@
   <summary>The manifest version of each loaded extension.</summary>
 </histogram>
 
+<histogram name="Extensions.Messaging.GetPortIdSyncTime" units="ms">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    The amount of synchronous time taken for the renderer to request an
+    extension message port id from the browser when a new channel is first
+    opened by an extension.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.NetworkDelay" units="ms">
   <owner>battre@chromium.org</owner>
   <summary>Time that network requests were blocked due to extensions.</summary>
@@ -16564,6 +16597,14 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.SyncGetMessageBundle" units="ms">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    The amount of synchronous time spent retrieving an extension's message
+    bundle (the collection of its i18n resources) from the browser.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.ThrottledNetworkRequestDelay" units="ms">
   <owner>rdevlin.cronin@chromium.org</owner>
   <summary>
@@ -19413,8 +19454,20 @@
   <owner>dominickn@chromium.org</owner>
   <summary>
     Records how many times a particular infobar was displayed in a hidden state
-    due to at least one other infobar existing or because it was auto-hidden.
-    Only recorded on Android.
+    due to at least one other infobar existing. If there are no existing
+    infobars, but the user scrolls at the exact moment a new infobar is added,
+    the infobar may be hidden, but not recorded in this metric. Reliably
+    triggering and detecting this combination is tricky so it isn't done. Only
+    recorded on Android.
+  </summary>
+</histogram>
+
+<histogram name="InfoBar.Shown.Hiding" enum="InfoBarIdentifier">
+  <owner>dfalcantara@chromium.org</owner>
+  <owner>dominickn@chromium.org</owner>
+  <summary>
+    Records how many times a particular infobar was visible and hiding a new
+    infobar behind it. Only recorded on Android.
   </summary>
 </histogram>
 
@@ -19423,8 +19476,10 @@
   <owner>dominickn@chromium.org</owner>
   <summary>
     Records how many times a particular infobar was displayed in a visible state
-    due to no other infobars existing and no auto-hiding. Only recorded on
-    Android.
+    due to no other infobars existing. If there are no existing infobars, but
+    the user scrolls at the exact moment a new infobar is added, the infobar may
+    be hidden, but recorded here as visible. Reliably triggering and detecting
+    this combination is tricky so it isn't done. Only recorded on Android.
   </summary>
 </histogram>
 
@@ -21253,6 +21308,14 @@
   </summary>
 </histogram>
 
+<histogram name="Linux.X11.ServerRTT" units="microseconds">
+  <owner>thomasanderson@chromium.org</owner>
+  <summary>
+    RTT between Chrome and the X11 server.  Tracked in X11EventSource by
+    measuring the latency to receive a property event after changing a property.
+  </summary>
+</histogram>
+
 <histogram name="LocalDiscovery.ClientRestartAttempts">
   <owner>noamsml@chromium.org</owner>
   <owner>vitalybuka@chromium.org</owner>
@@ -26198,6 +26261,15 @@
   </summary>
 </histogram>
 
+<histogram name="Navigation.DeferredDocumentLoading.StatesV1"
+    enum="DocumentStateForDeferredLoading">
+  <owner>dgrogan@chromium.org</owner>
+  <summary>
+    Why and if cross-origin documents would be loaded in a world where we defer
+    loading until they are visible.
+  </summary>
+</histogram>
+
 <histogram name="Navigation.EngagementTime.HTTP" units="ms">
   <owner>felt@chromium.org</owner>
   <summary>
@@ -36768,6 +36840,37 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.UserClassifier.AverageHoursToOpenNTP" units="hours">
+  <owner>jkrcal@chromium.org</owner>
+  <summary>
+    Android: The estimated average number of hours between two successive times
+    when a new tab page is opened. Recorded after each opening of a NTP (and
+    after updating the model used for the estimate).
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.UserClassifier.AverageHoursToShowSuggestions"
+    units="hours">
+  <owner>jkrcal@chromium.org</owner>
+  <summary>
+    Android: The estimated average number of hours between two successive times
+    when the list of content suggestions on a new tab page is shown (i.e. when
+    the user scrolls below the fold). Recorded after each time the suggestions
+    are shown (and after updating the model used for the estimate).
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.UserClassifier.AverageHoursToUseSuggestions"
+    units="hours">
+  <owner>jkrcal@chromium.org</owner>
+  <summary>
+    Android: The estimated average number of hours between two successive times
+    when the user opens a content suggestion or clicks on the &quot;More&quot;
+    button. Recorded after each time a suggestion or a More button is clicked
+    (and after updating the model used for the estimate).
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.VisibleScreenshots">
   <obsolete>
     Deprecated 2016-02 (and not recorded for some time before that).
@@ -39391,6 +39494,27 @@
   </summary>
 </histogram>
 
+<histogram name="PageLoad.ParseTiming.ParseBlockedOnScriptExecution" units="ms">
+  <owner>bmcquade@chromium.org</owner>
+  <owner>csharrison@chromium.org</owner>
+  <summary>
+    Measures the time that the HTML parser spent blocked on the execution of
+    scripts, for main frame documents that finished parsing.
+  </summary>
+</histogram>
+
+<histogram
+    name="PageLoad.ParseTiming.ParseBlockedOnScriptExecutionFromDocumentWrite"
+    units="ms">
+  <owner>bmcquade@chromium.org</owner>
+  <owner>csharrison@chromium.org</owner>
+  <summary>
+    Measures the time that the HTML parser spent blocked on the execution of
+    scripts inserted from document.write, for main frame documents that finished
+    parsing.
+  </summary>
+</histogram>
+
 <histogram name="PageLoad.ParseTiming.ParseBlockedOnScriptLoad" units="ms">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
@@ -43360,6 +43484,9 @@
 </histogram>
 
 <histogram name="PLT.NT_Connect" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bolian@chromium.org</owner>
   <summary>
     Time from connectStart to connectEnd based on Navigation Timing.
@@ -43442,6 +43569,9 @@
 </histogram>
 
 <histogram name="PLT.NT_DomainLookup" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bolian@chromium.org</owner>
   <summary>
     Time from domainLookupStart to domainLookupEnd based on Navigation Timing.
@@ -43449,6 +43579,11 @@
 </histogram>
 
 <histogram name="PLT.NT_DomContentLoaded" units="ms">
+  <obsolete>
+    Deprecated 09/2016. Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToDOMContentLoadedEventFired
+    instead.
+  </obsolete>
   <owner>bolian@chromium.org</owner>
   <summary>
     Time from domContentLoadedEventStart to domContentLoadedEventEnd based on
@@ -43457,6 +43592,9 @@
 </histogram>
 
 <histogram name="PLT.NT_DomInteractive" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bolian@chromium.org</owner>
   <summary>
     Time from domInteractive to domContentLoadEventStart based on Navigation
@@ -43465,6 +43603,9 @@
 </histogram>
 
 <histogram name="PLT.NT_DomLoading" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bolian@chromium.org</owner>
   <summary>
     Time from domLoading to domInteractive based on Navigation Timing.
@@ -43472,6 +43613,11 @@
 </histogram>
 
 <histogram name="PLT.NT_LoadEvent" units="ms">
+  <obsolete>
+    Deprecated 09/2016. Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToLoadEventFired
+    instead.
+  </obsolete>
   <owner>bolian@chromium.org</owner>
   <summary>
     Time from loadEventStart to loadEventEnd based on Navigation Timing.
@@ -43607,6 +43753,11 @@
 </histogram>
 
 <histogram name="PLT.PT_BeginToCommit_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 9/2016. Use Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToCommit
+    instead.
+  </obsolete>
   <owner>pmeenan@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
@@ -43631,6 +43782,11 @@
 </histogram>
 
 <histogram name="PLT.PT_BeginToFinish_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 9/2016. Use Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToLoadEventFired
+    instead.
+  </obsolete>
   <owner>pmeenan@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
@@ -43655,6 +43811,11 @@
 </histogram>
 
 <histogram name="PLT.PT_BeginToFinishDoc_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016. Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToLoadEventFired
+    instead.
+  </obsolete>
   <owner>pmeenan@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
@@ -43678,6 +43839,11 @@
 </histogram>
 
 <histogram name="PLT.PT_CommitToFinish_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016. Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToLoadEventFired
+    instead.
+  </obsolete>
   <owner>pmeenan@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
@@ -43701,6 +43867,11 @@
 </histogram>
 
 <histogram name="PLT.PT_CommitToFinishDoc_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016. Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToLoadEventFired
+    instead.
+  </obsolete>
   <owner>pmeenan@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
@@ -43725,6 +43896,9 @@
 </histogram>
 
 <histogram name="PLT.PT_FinishDocToFinish_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
   <summary>
@@ -43772,6 +43946,11 @@
 </histogram>
 
 <histogram name="PLT.PT_RequestToFinish_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016. Use
+    PageLoad.Clients.DataReductionProxy.DocumentTiming.NavigationToLoadEventFired
+    instead.
+  </obsolete>
   <owner>pmeenan@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
@@ -43805,6 +43984,9 @@
 </histogram>
 
 <histogram name="PLT.PT_RequestToStart_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
   <summary>
@@ -43824,6 +44006,9 @@
 </histogram>
 
 <histogram name="PLT.PT_StartToCommit_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
   <summary>
@@ -43842,6 +44027,9 @@
 </histogram>
 
 <histogram name="PLT.PT_StartToFinish_DataReductionProxy" units="ms">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <owner>bengr@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
   <summary>
@@ -45390,6 +45578,40 @@
   </summary>
 </histogram>
 
+<histogram name="Prerender.NoStatePrefetchMainResourceRedirects"
+    units="redirects">
+  <owner>droger@chromium.org</owner>
+  <owner>mattcary@chromium.org</owner>
+  <owner>pasko@chromium.org</owner>
+  <summary>
+    Length of the redirect chain for main resources loaded by NoStatePrefetch.
+    Recorded when the final response in the chain is received.
+  </summary>
+</histogram>
+
+<histogram name="Prerender.NoStatePrefetchResponseTypes"
+    enum="NoStatePrefetchResponseType">
+  <owner>droger@chromium.org</owner>
+  <owner>mattcary@chromium.org</owner>
+  <owner>pasko@chromium.org</owner>
+  <summary>
+    Type of responses received by NoStatePrefetch, distinguishing cacheable
+    resources from no-store resources, and main resources from sub-resources.
+    Recorded when a response is received, including on each redirect.
+  </summary>
+</histogram>
+
+<histogram name="Prerender.NoStatePrefetchSubResourceRedirects"
+    units="redirects">
+  <owner>droger@chromium.org</owner>
+  <owner>mattcary@chromium.org</owner>
+  <owner>pasko@chromium.org</owner>
+  <summary>
+    Length of the redirect chain for sub-resources loaded by NoStatePrefetch.
+    Recorded when the final response in the chain is received.
+  </summary>
+</histogram>
+
 <histogram name="Prerender.OmniboxNavigationsCouldPrerender">
   <owner>pasko@chromium.org</owner>
   <summary>
@@ -45940,6 +46162,56 @@
   </summary>
 </histogram>
 
+<histogram name="Previews.ContentLength" units="KB">
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The actual data used for a page load using a preview optimization.
+  </summary>
+</histogram>
+
+<histogram name="Previews.DataInflation" units="KB">
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The estimated amount that the content was inflated for a page load using a
+    previews optimization. Recorded when a page load using a previews
+    optimization inflates the data used.
+  </summary>
+</histogram>
+
+<histogram name="Previews.DataInflationPercent" units="%">
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The estimated percent of data used that a page load would have otherwise
+    cost for a page load using a previews optimization. Recorded when a page
+    load using a previews optimization inflates the data used.
+  </summary>
+</histogram>
+
+<histogram name="Previews.DataSavings" units="KB">
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The estimated data savings for a page load using a previews optimization.
+    Recorded when a page load using a previews optimization reduces the data
+    used.
+  </summary>
+</histogram>
+
+<histogram name="Previews.DataSavingsPercent" units="%">
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The estimated percent of data savings for a page load using a previews
+    optimization. Recorded when a page load using a previews optimization
+    reduces the data used.
+  </summary>
+</histogram>
+
+<histogram name="Previews.OriginalContentLength" units="KB">
+  <owner>ryansturm@chromium.org</owner>
+  <summary>
+    The estimated content length of a page load using a preview optimization.
+  </summary>
+</histogram>
+
 <histogram name="PrinterService.PrinterServiceEvent"
     enum="PrinterServiceEventType">
   <owner>vitalybuka@chromium.org</owner>
@@ -46831,6 +47103,25 @@
   </summary>
 </histogram>
 
+<histogram name="ProxyOverriddenBubble.ExtensionCount" units="Extensions">
+  <obsolete>
+    Deprecated 9/2016. Never added to histograms.xml and value is always 1.
+  </obsolete>
+  <summary>
+    The number of extensions overriding the proxy, triggering the proxy override
+    extension warning bubble.
+  </summary>
+</histogram>
+
+<histogram name="ProxyOverriddenBubble.UserSelection"
+    units="ExtensionBubbleAction">
+  <owner>rdevlin.cronin@chromium.org</owner>
+  <summary>
+    The action taken by the user when the &quot;proxy overridden&quot; extension
+    warning bubble is shown. Logged immediately after the action is taken.
+  </summary>
+</histogram>
+
 <histogram name="PushMessaging.BackgroundBudget">
   <owner>harkness@chromium.org</owner>
   <summary>
@@ -55081,6 +55372,16 @@
   </summary>
 </histogram>
 
+<histogram name="Setup.Install.SingletonAcquisitionResult"
+    enum="SetupSingletonAcquisitionResult">
+  <owner>fdoray@chromium.org</owner>
+  <summary>
+    The result of trying to acquire a setup singleton. On Windows, a setup.exe
+    process must hold the setup singleton of a Chrome installation when it makes
+    changes to it.
+  </summary>
+</histogram>
+
 <histogram name="Setup.Install.StrandedChromeIsUsed" enum="BooleanUsage">
   <owner>grt@chromium.org</owner>
   <summary>
@@ -57563,6 +57864,34 @@
   </summary>
 </histogram>
 
+<histogram name="Stability.Internals.DataDiscardCount" units="counts">
+  <owner>manzagop@chromium.org</owner>
+  <summary>
+    Number of times stability data was discarded. This is accumulated since the
+    last report, even across versions. This is logged during stability metric
+    recording for the following log sent.
+  </summary>
+</histogram>
+
+<histogram name="Stability.Internals.InitialStabilityLogDeferredCount"
+    units="counts">
+  <owner>manzagop@chromium.org</owner>
+  <summary>
+    Number of times the initial stability log upload was deferred to the next
+    startup. This is logged during stability metric recording for the following
+    log sent.
+  </summary>
+</histogram>
+
+<histogram name="Stability.Internals.VersionMismatchCount" units="counts">
+  <owner>manzagop@chromium.org</owner>
+  <summary>
+    Number of times the version number stored in prefs did not match the
+    serialized system profile version number. This is logged during stability
+    metric recording.
+  </summary>
+</histogram>
+
 <histogram name="Stability.MobileSessionShutdownType"
     enum="MobileSessionShutdownType">
   <owner>lpromero@chromium.org</owner>
@@ -61465,6 +61794,15 @@
   </summary>
 </histogram>
 
+<histogram name="Tabs.SadTab.Feedback.Event" enum="SadTabEvent">
+  <owner>sdy@chromium.org</owner>
+  <summary>
+    Counts of events from the style of sad tab which has a feedback button as
+    its primary action. Currently, events include being displayed (actually
+    visible in a window), and the actions a user can take on the page.
+  </summary>
+</histogram>
+
 <histogram name="Tabs.SadTab.KillCreated" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
@@ -61538,6 +61876,14 @@
   </summary>
 </histogram>
 
+<histogram name="Tabs.SadTab.Reload.Event" enum="SadTabEvent">
+  <owner>sdy@chromium.org</owner>
+  <summary>
+    Counts of events from the style of sad tab which has a reload button as its
+    primary action. Compare to Tabs.SadTab.Feedback.Event.
+  </summary>
+</histogram>
+
 <histogram name="Tabs.SadTab.ReloadCount" units="tabs">
   <owner>jamescook@chromium.org</owner>
   <summary>
@@ -61750,6 +62096,16 @@
   </summary>
 </histogram>
 
+<histogram name="TaskScheduler.TaskLatency" units="ms">
+  <owner>fdoray@chromium.org</owner>
+  <owner>gab@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>
+    Time elapsed between when a task is posted and when it starts to run.
+    Recorded for each task that runs inside the TaskScheduler.
+  </summary>
+</histogram>
+
 <histogram name="ThirdPartyModules.Modules.Signed" units="modules">
   <owner>chrisha@chromium.org</owner>
   <summary>
@@ -64229,6 +64585,11 @@
   <summary>Time spent in finalizing incremental marking.</summary>
 </histogram>
 
+<histogram name="V8.GCIncrementalMarkingReason" units="GarbageCollectionReason">
+  <owner>ulan@chromium.org</owner>
+  <summary>Reason an incremental marking was started in V8.</summary>
+</histogram>
+
 <histogram name="V8.GCIncrementalMarkingStart" units="ms">
   <owner>jochen@chromium.org</owner>
   <owner>hpayer@chromium.org</owner>
@@ -64241,12 +64602,22 @@
   <summary>Time spent in LowMemoryNotifications.</summary>
 </histogram>
 
+<histogram name="V8.GCMarkCompactReason" units="GarbageCollectionReason">
+  <owner>ulan@chromium.org</owner>
+  <summary>Reason a mark-compact garbage collection was started in V8.</summary>
+</histogram>
+
 <histogram name="V8.GCScavenger" units="ms">
   <owner>jochen@chromium.org</owner>
   <owner>hpayer@chromium.org</owner>
   <summary>Time spent in scavenging phase of GC.</summary>
 </histogram>
 
+<histogram name="V8.GCScavengeReason" units="GarbageCollectionReason">
+  <owner>ulan@chromium.org</owner>
+  <summary>Reason a scavenge garbage collection was started in V8.</summary>
+</histogram>
+
 <histogram name="V8.Initializer.LoadV8Snapshot.Result"
     enum="V8InitializerLoadV8SnapshotResult">
   <owner>oth@chromium.org</owner>
@@ -69392,6 +69763,7 @@
   <int value="14" label="Cloud provision flow was timed out"/>
   <int value="15" label="Cloud provision flow reporeted internal error"/>
   <int value="16" label="ARC instance is stopped before complete provisioning"/>
+  <int value="17" label="Overall sign in timeout"/>
 </enum>
 
 <enum name="AsyncDNSConfigParsePosix" type="int">
@@ -74622,6 +74994,11 @@
   <int value="3" label="Keyboard"/>
 </enum>
 
+<enum name="DocumentStateForDeferredLoading" type="int">
+  <int value="0" label="Created"/>
+  <int value="1" label="WouldLoadBecauseVisible"/>
+</enum>
+
 <enum name="DocumentWriteGatedEvaluation" type="int">
   <int value="0" label="Script too long"/>
   <int value="1" label="No likely external script write"/>
@@ -80411,6 +80788,12 @@
   <int value="1548" label="MetaRefresh"/>
   <int value="1549" label="MetaSetCookieWhenCSPBlocksInlineScript"/>
   <int value="1550" label="MetaRefreshWhenCSPBlocksInlineScript"/>
+  <int value="1551" label="MiddleClickAutoscrollStart"/>
+  <int value="1552" label="ClipCssOfFixedPositionElement"/>
+  <int value="1553" label="RTCPeerConnectionCreateOfferOptionsOfferToReceive"/>
+  <int value="1554" label="DragAndDropScrollStart"/>
+  <int value="1555"
+      label="PresentationConnectionListConnectionAvailableEventListener"/>
 </enum>
 
 <enum name="FetchRequestMode" type="int">
@@ -81434,6 +81817,31 @@
   <int value="10" label="GammaNamed"/>
 </enum>
 
+<enum name="GarbageCollectionReason" type="int">
+  <int value="0" label="kUnknown"/>
+  <int value="1" label="kAllocationFailure"/>
+  <int value="2" label="kAllocationLimit"/>
+  <int value="3" label="kContextDisposal"/>
+  <int value="4" label="kCountersExtension"/>
+  <int value="5" label="kDebugger"/>
+  <int value="6" label="kDeserializer"/>
+  <int value="7" label="kExternalMemoryPressure"/>
+  <int value="8" label="kFinalizeMarkingViaStackGuard"/>
+  <int value="9" label="kFinalizeMarkingViaTask"/>
+  <int value="10" label="kFullHashtable"/>
+  <int value="11" label="kHeapProfiler"/>
+  <int value="12" label="kIdleTask"/>
+  <int value="13" label="kLastResort"/>
+  <int value="14" label="kLowMemoryNotification"/>
+  <int value="15" label="kMakeHeapIterable"/>
+  <int value="16" label="kMemoryPressure"/>
+  <int value="17" label="kMemoryReducer"/>
+  <int value="18" label="kRuntime"/>
+  <int value="19" label="kSamplingProfiler"/>
+  <int value="20" label="kSnapshotCreator"/>
+  <int value="21" label="kTesting"/>
+</enum>
+
 <enum name="GATTCharacteristicHash" type="int">
 <!-- Hash values can be produced using tool: bluetooth_metrics_hash (Only built via GN, not GYP) -->
 
@@ -82349,7 +82757,7 @@
   <int value="7" label="SERVICE_UNAVAILABLE"/>
   <int value="8" label="TWO_FACTOR"/>
   <int value="9" label="REQUEST_CANCELED"/>
-  <int value="10" label="HOSTED_NOT_ALLOWED"/>
+  <int value="10" label="HOSTED_NOT_ALLOWED (deprecated)"/>
   <int value="11" label="UNEXPECTED_SERVICE_RESPONSE"/>
   <int value="12" label="SERVICE_ERROR"/>
   <int value="13" label="WEB_LOGIN_REQUIRED"/>
@@ -83747,6 +84155,7 @@
   <int value="57" label="UNPACKING_FAILED"/>
   <int value="58" label="IN_USE_DOWNGRADE"/>
   <int value="59" label="OLD_VERSION_DOWNGRADE"/>
+  <int value="60" label="SETUP_SINGLETON_ACQUISITION_FAILED"/>
 </enum>
 
 <enum name="InstantControllerEvent" type="int">
@@ -84624,6 +85033,7 @@
   <int value="40" label="SBOX_ERROR_CANNOT_SETUP_INTERCEPTION_THUNK"/>
   <int value="41" label="SBOX_ERROR_CANNOT_RESOLVE_INTERCEPTION_THUNK"/>
   <int value="42" label="SBOX_ERROR_CANNOT_WRITE_INTERCEPTION_THUNK"/>
+  <int value="43" label="SBOX_ERROR_CANNOT_FIND_BASE_ADDRESS"/>
   <int value="1002" label="LAUNCH_RESULT_SUCCESS"/>
   <int value="1003" label="LAUNCH_RESULT_FAILURE"/>
 </enum>
@@ -85192,6 +85602,7 @@
   <int value="-1107762575" label="enable-data-reduction-proxy-config-client"/>
   <int value="-1102212525" label="enable-tcp-fastopen"/>
   <int value="-1084055006" label="disable-web-notification-custom-layouts"/>
+  <int value="-1082302549" label="scan-cards-in-web-payments"/>
   <int value="-1078093206" label="ash-debug-shortcuts"/>
   <int value="-1077752943" label="enable-password-generation"/>
   <int value="-1075156797" label="enable-brotli"/>
@@ -85569,6 +85980,7 @@
   <int value="1421620678" label="simple-clear-browsing-data-support-string"/>
   <int value="1442798825" label="enable-quic"/>
   <int value="1454363479" label="disable-storage-manager"/>
+  <int value="1458583431" label="arc-use-auth-endpoint"/>
   <int value="1459529277" label="disable-text-input-focus-manager"/>
   <int value="1465624446" label="disable-zero-copy"/>
   <int value="1466380480" label="enable-device-discovery-notifications"/>
@@ -88195,6 +88607,7 @@
   <int value="6" label="Opened a foreign session (from other devices section)"/>
   <int value="7" label="Navigated to the webpage for a snippet"/>
   <int value="8" label="Clicked on an interest item"/>
+  <int value="9" label="Clicked on Learn More"/>
 </enum>
 
 <enum name="NewTabPageBookmarkActionAndroid" type="int">
@@ -88265,6 +88678,17 @@
   <int value="1" label="Timed out"/>
 </enum>
 
+<enum name="NoStatePrefetchResponseType" type="int">
+  <int value="0" label="Sub-resource, cacheable"/>
+  <int value="1" label="Sub-resource, no-store"/>
+  <int value="2" label="Sub-resource redirect, cacheable"/>
+  <int value="3" label="Sub-resource redirect, no-store"/>
+  <int value="4" label="Main resource, cacheable"/>
+  <int value="5" label="Main resource, no-store"/>
+  <int value="6" label="Main resource redirect, cacheable"/>
+  <int value="7" label="Main resource redirect, no-store"/>
+</enum>
+
 <enum name="NotificationActionType" type="int">
   <int value="0" label="Unknown"/>
   <int value="1" label="Notification added"/>
@@ -92453,6 +92877,12 @@
   <int value="1" label="Tabbed Mode"/>
 </enum>
 
+<enum name="SadTabEvent" type="int">
+  <int value="0" label="Displayed"/>
+  <int value="1" label="Button clicked"/>
+  <int value="2" label="Learn more clicked"/>
+</enum>
+
 <enum name="SadTabKind" type="int">
   <int value="0" label="Crash (Aw, Snap!)"/>
   <int value="1" label="Kill (He's dead, Jim!)"/>
@@ -93877,6 +94307,12 @@
       label="Unpacking the (possibly patched) uncompressed archive failed."/>
 </enum>
 
+<enum name="SetupSingletonAcquisitionResult" type="int">
+  <int value="0" label="The setup singleton was acquired successfully."/>
+  <int value="1" label="Acquisition of the exit event mutex timed out."/>
+  <int value="2" label="Acquisition of the setup mutex timed out."/>
+</enum>
+
 <enum name="SHA1Status" type="int">
   <summary>
     Whether or not SHA-1 was present in a certificate chain and, if it was, when
@@ -99387,6 +99823,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="DataReductionProxy">
+  <obsolete>
+    Deprecated 9/2016.
+  </obsolete>
   <suffix name="DataReductionProxy"
       label="Only page loads through the data reduction proxy are considered."/>
   <suffix name="HTTPS_DataReductionProxy"
@@ -99478,6 +99917,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="DataReductionProxy_AutoLoFi" separator="_">
+  <obsolete>
+    Deprecated 09/2016.
+  </obsolete>
   <suffix name="DataReductionProxy_AutoLoFiOn"
       label="Only page loads through the data reduction proxy with auto LoFi
              enabled are considered."/>
@@ -99694,7 +100136,7 @@
   <suffix name="MediumTriggeringRequest"
       label="Triggering request medium bypass"/>
   <suffix name="LongAll" label="Long bypass"/>
-  <suffix name="LongTriggering_Request" label="Triggering request long bypass"/>
+  <suffix name="LongTriggeringRequest" label="Triggering request long bypass"/>
   <suffix name="MissingViaHeader4xx"
       label="Bypass due to a 4xx missing via header"/>
   <suffix name="MissingViaHeaderOther"
@@ -99764,6 +100206,17 @@
       name="DataReductionProxy.RequestCompletionErrorCodes.MainFrame"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="DataSaverEnabled" separator=".">
+  <suffix name="DataSaverEnabled" label="Data Saver is enabled"/>
+  <suffix name="DataSaverDisabled" label="Data Saver is disabled"/>
+  <affected-histogram name="Previews.ContentLength"/>
+  <affected-histogram name="Previews.DataInflation"/>
+  <affected-histogram name="Previews.DataInflationPercent"/>
+  <affected-histogram name="Previews.DataSavings"/>
+  <affected-histogram name="Previews.DataSavingsPercent"/>
+  <affected-histogram name="Previews.OriginalContentLength"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="DataUsageReportSubmissionBytes" separator=".">
   <suffix name="Failed"
       label="Platform external data use observer reported the submission as
@@ -100314,6 +100767,13 @@
   <affected-histogram name="Extensions.Functions.SucceededTime"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="ExtensionMessagingPortType" separator=".">
+  <suffix name="Extension" label="A port opened to an extension context."/>
+  <suffix name="NativeApp" label="A port opened to a native application."/>
+  <suffix name="Tab" label="A port opened to a tab context."/>
+  <affected-histogram name="Extensions.Messaging.GetPortIdSyncTime"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="ExtensionsDatabaseOpen" separator=".">
   <suffix name="Rules" label="Rules backing stores"/>
   <suffix name="Settings" label="Settings backing stores"/>
@@ -101283,8 +101743,7 @@
   <affected-histogram name="Navigation.TimeToURLJobStart"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="Net.BidirectionalStreamExperiment" separator="."
-    ordering="prefix">
+<histogram_suffixes name="Net.BidirectionalStreamExperiment" separator=".">
   <owner>xunjieli@chromium.org</owner>
   <suffix name="QUIC" label="Bidirectional streams that use QUIC protocol"/>
   <suffix name="HTTP2" label="Bidirectional stream that use HTTP2 protocol"/>
@@ -103690,6 +104149,9 @@
   <affected-histogram name="Prerender.LocalPredictorTimeUntilUsed"/>
   <affected-histogram name="Prerender.NetworkBytesUsed"/>
   <affected-histogram name="Prerender.NetworkBytesWasted"/>
+  <affected-histogram name="Prerender.NoStatePrefetchMainResourceRedirects"/>
+  <affected-histogram name="Prerender.NoStatePrefetchResponseTypes"/>
+  <affected-histogram name="Prerender.NoStatePrefetchSubResourceRedirects"/>
   <affected-histogram name="Prerender.PageVisitedStatus"/>
   <affected-histogram name="Prerender.PerceivedPLT"/>
   <affected-histogram name="Prerender.PerceivedPLTFirstAfterMiss"/>
@@ -104238,7 +104700,11 @@
              loading and again for each redirect."/>
   <suffix name="Safe"
       label="Resources that were checked and deemed safe. Logged when the URL
-             check is completed."/>
+             check is completed.">
+    <obsolete>
+      Deprecated in 9/2016.
+    </obsolete>
+  </suffix>
   <suffix name="Skipped"
       label="Resources that were not checked because they are not active-ish
              content types. Only used on mobile. Logged before the resource
@@ -105051,14 +105517,28 @@
   <affected-histogram name="Tabs.SwitchFromUserLatency"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="TaskSchedulerTaskPriority" separator=".">
+  <suffix name="BackgroundTaskPriority"
+      label="Applies to tasks posted with a BACKGROUND priority."/>
+  <suffix name="UserVisibleTaskPriority"
+      label="Applies to tasks posted with a USER_VISIBLE priority."/>
+  <suffix name="UserBlockingTaskPriority"
+      label="Applies to tasks posted with a USER_BLOCKING priority."/>
+  <affected-histogram name="TaskScheduler.TaskLatency.BackgroundFileIOPool"/>
+  <affected-histogram name="TaskScheduler.TaskLatency.BackgroundPool"/>
+  <affected-histogram name="TaskScheduler.TaskLatency.ForegroundFileIOPool"/>
+  <affected-histogram name="TaskScheduler.TaskLatency.ForegroundPool"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="TaskSchedulerWorkerPool" separator=".">
-  <suffix name="BackgroundFileIO"
+  <suffix name="BackgroundFileIOPool"
       label="Applies to the BackgroundFileIO worker pool."/>
-  <suffix name="Background" label="Applies to the Background worker pool."/>
-  <suffix name="ForegroundFileIO"
+  <suffix name="BackgroundPool" label="Applies to the Background worker pool."/>
+  <suffix name="ForegroundFileIOPool"
       label="Applies to the ForegroundFileIO worker pool."/>
-  <suffix name="Foreground" label="Applies to the Foreground worker pool."/>
+  <suffix name="ForegroundPool" label="Applies to the Foreground worker pool."/>
   <affected-histogram name="TaskScheduler.DetachDuration"/>
+  <affected-histogram name="TaskScheduler.TaskLatency"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="ThreadWatcher" separator=".">
diff --git a/tools/metrics/rappor/rappor.xml b/tools/metrics/rappor/rappor.xml
index fdc32832e..ddb4a2b 100644
--- a/tools/metrics/rappor/rappor.xml
+++ b/tools/metrics/rappor/rappor.xml
@@ -830,6 +830,15 @@
   </summary>
 </rappor-metric>
 
+<rappor-metric name="ContentSettings.Plugins.AddedAllowException"
+    type="ETLD_PLUS_ONE">
+  <owner>tommycli@chromium.org</owner>
+  <summary>
+    The eTLD+1 of a URL that the user added to the ALLOW site exceptions for
+    the Plugins Content Setting.
+  </summary>
+</rappor-metric>
+
 <rappor-metric name="CustomTabs.ServiceClient.PackageName"
     type="UMA_RAPPOR_TYPE">
   <owner>yusufo@chromium.org</owner>
diff --git a/tools/nocompile_driver.py b/tools/nocompile_driver.py
index b144c900..1c48c4b 100755
--- a/tools/nocompile_driver.py
+++ b/tools/nocompile_driver.py
@@ -121,7 +121,7 @@
 
 
 def ExtractTestConfigs(sourcefile_path, suite_name):
-  """Parses the soruce file for test configurations.
+  """Parses the source file for test configurations.
 
   Each no-compile test in the file is separated by an ifdef macro.  We scan
   the source file with the NCTEST_CONFIG_RE to find all ifdefs that look like
diff --git a/tools/perf/OWNERS b/tools/perf/OWNERS
index cc44a561..49c2a9b 100644
--- a/tools/perf/OWNERS
+++ b/tools/perf/OWNERS
@@ -13,6 +13,9 @@
 # For system health & memory-infra related changes.
 petrcermak@chromium.org
 
+# For page_cycler benchmarks related changes.
+kouhei@chromium.org
+
 # emeritus:
 # marja@chromium.org
 # nduca@chromium.org
diff --git a/tools/perf/benchmarks/benchmark_smoke_unittest.py b/tools/perf/benchmarks/benchmark_smoke_unittest.py
index cfd8cdcf..7d17e75 100644
--- a/tools/perf/benchmarks/benchmark_smoke_unittest.py
+++ b/tools/perf/benchmarks/benchmark_smoke_unittest.py
@@ -143,19 +143,10 @@
     # test from the class. We should probably discover all of the tests
     # in a class, and then throw the ones we don't need away instead.
 
-    # TODO(aiolos): remove try after all telemetry-side changes land.
-    try:
-      decorators.IS_UPDATED_DECORATORS
-    except AttributeError:
-      enabled_benchmark_attr = '_enabled_strings'
-      enabled_method_attr = '_enabled_strings'
-      disabled_benchmark_attr = '_disabled_strings'
-      disabled_method_attr = '_disabled_strings'
-    else:
-      disabled_benchmark_attr = decorators.DisabledAttributeName(benchmark)
-      disabled_method_attr = decorators.DisabledAttributeName(method)
-      enabled_benchmark_attr = decorators.EnabledAttributeName(benchmark)
-      enabled_method_attr = decorators.EnabledAttributeName(method)
+    disabled_benchmark_attr = decorators.DisabledAttributeName(benchmark)
+    disabled_method_attr = decorators.DisabledAttributeName(method)
+    enabled_benchmark_attr = decorators.EnabledAttributeName(benchmark)
+    enabled_method_attr = decorators.EnabledAttributeName(method)
 
     MergeDecorators(method, disabled_method_attr, benchmark,
                     disabled_benchmark_attr)
diff --git a/tools/perf/benchmarks/memory_infra.py b/tools/perf/benchmarks/memory_infra.py
index ce8f3516..1e03843c 100644
--- a/tools/perf/benchmarks/memory_infra.py
+++ b/tools/perf/benchmarks/memory_infra.py
@@ -62,6 +62,10 @@
     return 'memory.top_10_mobile'
 
   @classmethod
+  def ShouldTearDownStateAfterEachStoryRun(cls):
+    return False
+
+  @classmethod
   def ShouldDisable(cls, possible_browser):
     # TODO(crbug.com/586148): Benchmark should not depend on DeskClock app.
     return not possible_browser.platform.CanLaunchApplication(
@@ -108,6 +112,10 @@
     return 'memory.dual_browser_test'
 
   @classmethod
+  def ShouldTearDownStateAfterEachStoryRun(cls):
+    return False
+
+  @classmethod
   def ValueCanBeAddedPredicate(cls, value, is_first_result):
     # TODO(crbug.com/610962): Remove this stopgap when the perf dashboard
     # is able to cope with the data load generated by TBMv2 metrics.
@@ -130,6 +138,10 @@
     return 'memory.long_running_dual_browser_test'
 
   @classmethod
+  def ShouldTearDownStateAfterEachStoryRun(cls):
+    return False
+
+  @classmethod
   def ShouldTearDownStateAfterEachStorySetRun(cls):
     return False
 
diff --git a/tools/perf/benchmarks/octane.py b/tools/perf/benchmarks/octane.py
index 4c7aa5e..02fb9bf4 100644
--- a/tools/perf/benchmarks/octane.py
+++ b/tools/perf/benchmarks/octane.py
@@ -80,9 +80,8 @@
     self._power_metric = power.PowerMetric(platform)
 
   def WillNavigateToPage(self, page, tab):
-    memory_stats = tab.browser.memory_stats
-    if ('SystemTotalPhysicalMemory' in memory_stats and
-        memory_stats['SystemTotalPhysicalMemory'] < 1 * _GB):
+    total_memory = tab.browser.platform.GetSystemTotalPhysicalMemory()
+    if total_memory is not None and total_memory < 1 * _GB:
       skipBenchmarks = '"zlib"'
     else:
       skipBenchmarks = ''
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py
index c650764..168e862 100644
--- a/tools/perf/benchmarks/smoothness.py
+++ b/tools/perf/benchmarks/smoothness.py
@@ -459,6 +459,12 @@
   def ShouldDisable(cls, possible_browser):
     return cls.IsSvelte(possible_browser)  # http://crbug.com/555089
 
+  @classmethod
+  def ValueCanBeAddedPredicate(cls, value, is_first_result):
+    del is_first_result  # unused
+    # These pages don't scroll so it's not necessary to measure input latency.
+    return value.name != 'first_gesture_scroll_update_latency'
+
 
 # http://crbug.com/522619 (mac/win)
 @benchmark.Disabled('win', 'mac')
diff --git a/tools/perf/benchmarks/system_health.py b/tools/perf/benchmarks/system_health.py
index e4f8725..75862ea 100644
--- a/tools/perf/benchmarks/system_health.py
+++ b/tools/perf/benchmarks/system_health.py
@@ -151,7 +151,10 @@
   markers recorded in atrace, Chrome tracing is not enabled for this
   benchmark.
   """
-  page_set = page_sets.BlankPageSet
+  options = {'pageset_repeat': 20}
+
+  def CreateStorySet(self, options):
+    return page_sets.SystemHealthStorySet(platform='mobile', case='blank')
 
   def CreateTimelineBasedMeasurementOptions(self):
     options = timeline_based_measurement.Options()
@@ -168,3 +171,21 @@
   @classmethod
   def Name(cls):
     return 'system_health.webview_startup'
+
+
+@benchmark.Enabled('android-webview')
+class WebviewMultiprocessStartupSystemHealthBenchmark(
+    WebviewStartupSystemHealthBenchmark):
+  """Webview multiprocess startup time benchmark
+
+  Benchmark that measures how long WebView takes to start up
+  and load a blank page with multiprocess enabled.
+  """
+
+  def SetExtraBrowserOptions(self, options):
+    options.AppendExtraBrowserArgs(
+        ['--webview-sandboxed-renderer'])
+
+  @classmethod
+  def Name(cls):
+    return 'system_health.webview_startup_multiprocess'
diff --git a/tools/perf/benchmarks/v8.py b/tools/perf/benchmarks/v8.py
index ed4f8d8..422580c 100644
--- a/tools/perf/benchmarks/v8.py
+++ b/tools/perf/benchmarks/v8.py
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 import os
-import re
 
 from core import path_util
 from core import perf_benchmark
@@ -15,7 +14,6 @@
 import page_sets
 from telemetry import benchmark
 from telemetry import story
-from telemetry.timeline import chrome_trace_config
 from telemetry.timeline import chrome_trace_category_filter
 from telemetry.web_perf import timeline_based_measurement
 
@@ -23,7 +21,6 @@
 def CreateV8TimelineBasedMeasurementOptions():
   category_filter = chrome_trace_category_filter.ChromeTraceCategoryFilter()
   category_filter.AddIncludedCategory('v8')
-  category_filter.AddIncludedCategory('blink')
   category_filter.AddIncludedCategory('blink.console')
   category_filter.AddDisabledByDefault('disabled-by-default-v8.compile')
   options = timeline_based_measurement.Options(category_filter)
@@ -117,9 +114,7 @@
   def ShouldTearDownStateAfterEachStoryRun(cls):
     return True
 
-# Disabled on reference builds as they are failing across multiple Android
-# devices. see http://crbug.com/636405
-@benchmark.Disabled('reference')
+
 class V8TodoMVC(perf_benchmark.PerfBenchmark):
   """Measures V8 Execution metrics on the TodoMVC examples."""
   page_set = page_sets.TodoMVCPageSet
@@ -199,91 +194,6 @@
               possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X')
 
 
-class _V8MemoryAndCodeSizeBenchmark(perf_benchmark.PerfBenchmark):
-  """Base class for benchmarks measuring code size."""
-
-  _IGNORED_V8_STATS_RE = re.compile(
-      r'(?<!dump)(?<!process)_(std|count|min|sum|pct_\d{4}(_\d+)?)$')
-
-  def CreateTimelineBasedMeasurementOptions(self):
-    category_filter = chrome_trace_category_filter.ChromeTraceCategoryFilter(
-        '-*, disabled-by-default-memory-infra,'
-        # TODO(crbug.com/616441, primiano): Remove this temporary workaround,
-        # which enables memory-infra V8 code stats in V8 code size benchmarks
-        # only (to not slow down detailed memory dumps in other benchmarks).
-        'disabled-by-default-memory-infra.v8.code_stats')
-    options = timeline_based_measurement.Options(category_filter)
-    # Trigger periodic light memory dumps every 20 ms.
-    memory_dump_config = chrome_trace_config.MemoryDumpConfig()
-    memory_dump_config.AddTrigger('light', 20)
-    options.config.chrome_trace_config.SetMemoryDumpConfig(memory_dump_config)
-    options.SetTimelineBasedMetrics(['memoryMetric'])
-    return options
-
-  page_set = page_sets.Top10MobileMemoryPageSet
-
-  @classmethod
-  def ShouldTearDownStateAfterEachStoryRun(cls):
-    return True
-
-  @classmethod
-  def ValueCanBeAddedPredicate(cls, value, is_first_result):
-    # TODO(crbug.com/610962): Remove this stopgap when the perf dashboard
-    # is able to cope with the data load generated by TBMv2 metrics.
-    if 'memory' not in value.name:
-      return True  # Keep all non-memory values.
-    # TODO(petrcermak): Remove the 'subsystem' disjunct once
-    # https://codereview.chromium.org/2018503002/ lands in Catapult and rolls
-    # into Chromium.
-    if (('subsystem' in value.name or 'reported_by_chrome' in value.name) and
-        'v8' not in value.name):
-      return False  # Drop non-V8 values reported by Chrome.
-    # Keep dump counts and average+max of process counts, vmstats and v8.
-    return not cls._IGNORED_V8_STATS_RE.search(value.name)
-
-
-@benchmark.Enabled('android')
-class V8MobileCodeSizeIgnition(_V8MemoryAndCodeSizeBenchmark):
-  """Measures V8 heap and code size with ignition enabled on mobile web pages.
-
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks
-  """
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8MobileCodeSizeIgnition, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableIgnition(options)
-
-  # crbug.com/639007
-  @classmethod
-  def ShouldDisable(cls, possible_browser):
-    if (possible_browser.browser_type == 'reference' and
-        possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X'):
-      return True
-
-  @classmethod
-  def Name(cls):
-    return 'top_10_mobile_memory_ignition'
-
-
-@benchmark.Enabled('android')
-class V8MobileCodeSize(_V8MemoryAndCodeSizeBenchmark):
-  """Measures V8 heap and code size on mobile web pages.
-
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks
-  """
-
-  # crbug.com/639007
-  @classmethod
-  def ShouldDisable(cls, possible_browser):
-    if (possible_browser.browser_type == 'reference' and
-        possible_browser.platform.GetDeviceTypeName() == 'Nexus 5X'):
-      return True
-
-  @classmethod
-  def Name(cls):
-    return 'top_10_mobile_memory'
-
-
 class V8Adword(perf_benchmark.PerfBenchmark):
   """Measures V8 Execution metrics on the Adword page."""
 
diff --git a/tools/perf/chrome_telemetry_build/BUILD.gn b/tools/perf/chrome_telemetry_build/BUILD.gn
index d5663bd..f344185 100644
--- a/tools/perf/chrome_telemetry_build/BUILD.gn
+++ b/tools/perf/chrome_telemetry_build/BUILD.gn
@@ -19,6 +19,47 @@
       "$root_out_dir/cdb/winext/uext.dll",
       "$root_out_dir/cdb/winxp/exts.dll",
       "$root_out_dir/cdb/winxp/ntsdexts.dll",
+      "$root_out_dir/cdb/api-ms-win-core-console-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-datetime-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-debug-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-errorhandling-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-file-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-file-l1-2-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-file-l2-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-handle-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-heap-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-interlocked-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-libraryloader-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-localization-l1-2-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-memory-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-namedpipe-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-processenvironment-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-processthreads-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-processthreads-l1-1-1.dll",
+      "$root_out_dir/cdb/api-ms-win-core-profile-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-rtlsupport-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-string-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-synch-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-synch-l1-2-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-sysinfo-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-timezone-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-core-util-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-conio-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-convert-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-environment-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-filesystem-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-heap-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-locale-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-math-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-multibyte-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-private-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-process-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-runtime-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-stdio-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-string-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-time-l1-1-0.dll",
+      "$root_out_dir/cdb/api-ms-win-crt-utility-l1-1-0.dll",
+      "$root_out_dir/cdb/ucrtbase.dll",
     ]
     args = [
       rebase_path("$root_out_dir/cdb", root_out_dir),
diff --git a/tools/perf/measurements/webrtc.py b/tools/perf/measurements/webrtc.py
index 9735e4a..90061f8 100644
--- a/tools/perf/measurements/webrtc.py
+++ b/tools/perf/measurements/webrtc.py
@@ -6,7 +6,6 @@
 
 from metrics import cpu
 from metrics import media
-from metrics import memory
 from metrics import power
 from metrics import webrtc_stats
 
@@ -18,7 +17,6 @@
     super(WebRTC, self).__init__()
     self._cpu_metric = None
     self._media_metric = None
-    self._memory_metric = None
     self._power_metric = None
     self._webrtc_stats_metric = None
 
@@ -27,19 +25,16 @@
 
   def DidStartBrowser(self, browser):
     self._cpu_metric = cpu.CpuMetric(browser)
-    self._memory_metric = memory.MemoryMetric(browser)
     self._webrtc_stats_metric = webrtc_stats.WebRtcStatisticsMetric()
 
   def DidNavigateToPage(self, page, tab):
     self._cpu_metric.Start(page, tab)
     self._media_metric = media.MediaMetric(tab)
     self._media_metric.Start(page, tab)
-    self._memory_metric.Start(page, tab)
     self._power_metric.Start(page, tab)
     self._webrtc_stats_metric.Start(page, tab)
 
   def CustomizeBrowserOptions(self, options):
-    memory.MemoryMetric.CustomizeBrowserOptions(options)
     options.AppendExtraBrowserArgs('--use-fake-device-for-media-stream')
     options.AppendExtraBrowserArgs('--use-fake-ui-for-media-stream')
     power.PowerMetric.CustomizeBrowserOptions(options)
@@ -55,9 +50,6 @@
     self._media_metric.Stop(page, tab)
     self._media_metric.AddResults(tab, results, exclude_metrics=exclude_metrics)
 
-    self._memory_metric.Stop(page, tab)
-    self._memory_metric.AddResults(tab, results)
-
     self._power_metric.Stop(page, tab)
     self._power_metric.AddResults(tab, results)
 
diff --git a/tools/perf/page_sets/system_health/blank_stories.py b/tools/perf/page_sets/system_health/blank_stories.py
new file mode 100644
index 0000000..ffe0ecc
--- /dev/null
+++ b/tools/perf/page_sets/system_health/blank_stories.py
@@ -0,0 +1,25 @@
+# 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.
+
+from page_sets.system_health import system_health_story
+
+
+class BlankAboutBlankStory(system_health_story.SystemHealthStory):
+  """Story that loads the about:blank page."""
+
+  NAME = 'blank:about:blank'
+  URL = 'about:blank'
+
+  def _DidLoadDocument(self, action_runner):
+    # Request a RAF and wait for it to be processed to ensure that the metric
+    # Startup.FirstWebContents.NonEmptyPaint2 is recorded.
+    action_runner.ExecuteJavaScript(
+        """
+        window.__hasRunRAF = false;
+        requestAnimationFrame(function() {
+          window.__hasRunRAF = true;
+        });
+        """
+    )
+    action_runner.WaitForJavaScriptCondition("window.__hasRunRAF")
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py
index e6441585..4107149 100644
--- a/tools/perf/page_sets/system_health/browsing_stories.py
+++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -5,6 +5,8 @@
 from page_sets.system_health import platforms
 from page_sets.system_health import system_health_story
 
+from telemetry import decorators
+
 
 class _BrowsingStory(system_health_story.SystemHealthStory):
   """Abstract base class for browsing stories.
@@ -79,15 +81,15 @@
         repeat_count=self.MAIN_PAGE_SCROLL_REPEAT)
 
 
+# TODO(ulan): Enable this story on mobile once it uses less memory and does not
+# crash with OOM.
+@decorators.Disabled('android')
 class CnnStory(_NewsBrowsingStory):
   """The second top website in http://www.alexa.com/topsites/category/News"""
   NAME = 'browse:news:cnn'
   URL = 'http://edition.cnn.com/'
   ITEM_SELECTOR = '.cd__content > h3 > a'
   ITEMS_TO_VISIT = 2
-  # TODO(ulan): Enable this story on mobile once it uses less memory and
-  # does not crash with OOM.
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
 
 
 class FacebookMobileStory(_NewsBrowsingStory):
@@ -151,14 +153,14 @@
   SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
 
 
+# Desktop qq.com opens a news item in a separate tab, for which the back button
+# does not work. Mobile qq.com is disabled due to crbug.com/627166.
+@decorators.Disabled('all')
 class QqMobileStory(_NewsBrowsingStory):
   NAME = 'browse:news:qq'
   URL = 'http://news.qq.com'
-  # Desktop qq.com opens a news item in a separate tab, for which the back
-  # button does not work.
-  # Mobile qq.com is disabled due to crbug.com/627166
   ITEM_SELECTOR = '.list .full a'
-  SUPPORTED_PLATFORMS = platforms.NO_PLATFORMS
+  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
 
 
 class RedditDesktopStory(_NewsBrowsingStory):
@@ -280,7 +282,7 @@
   ITEM_SELECTOR_INDEX = 3
 
 
-class FacebookPhotosMediaStory(_MediaBrowsingStory):
+class FacebookPhotosMobileStory(_MediaBrowsingStory):
   NAME = 'browse:media:facebook_photos'
   URL = (
       'https://m.facebook.com/rihanna/photos/a.207477806675.138795.10092511675/10153911739606676/?type=3&source=54&ref=page_internal')
diff --git a/tools/perf/page_sets/system_health/loading_stories.py b/tools/perf/page_sets/system_health/loading_stories.py
index 9db0b955..eae99f9 100644
--- a/tools/perf/page_sets/system_health/loading_stories.py
+++ b/tools/perf/page_sets/system_health/loading_stories.py
@@ -163,7 +163,7 @@
   SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
 
 
-class LoadSohuStory(_LoadingStory):
+class LoadSohuMobileStory(_LoadingStory):
   NAME = 'load:news:sohu'
   # Using "https://" leads to missing images and scripts on mobile (due to
   # mixed content).
@@ -389,12 +389,10 @@
   NAME = 'load:games:miniclip'
   # Using "https://" causes "404 Not Found" during WPR recording.
   URL = 'http://www.miniclip.com/games/en/'
-  # Desktop only (requires Flash).
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY  # Requires Flash.
 
 
 class LoadAlphabettyStory(_LoadingStory):
   NAME = 'load:games:alphabetty'
   URL = 'https://king.com/play/alphabetty'
-  # Desktop only (requires Flash).
-  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY  # Requires Flash.
diff --git a/tools/perf/page_sets/system_health/platforms.py b/tools/perf/page_sets/system_health/platforms.py
index cc6bb5b3..a54fc41 100644
--- a/tools/perf/page_sets/system_health/platforms.py
+++ b/tools/perf/page_sets/system_health/platforms.py
@@ -6,7 +6,10 @@
 MOBILE = 'mobile'
 
 ALL_PLATFORMS = frozenset({DESKTOP, MOBILE})
+
+# Use the constants below to mark on which platforms the story has WPR
+# recordings. To disable a story (e.g. because it crashes or takes too long),
+# use @decorators.Disabled instead.
 DESKTOP_ONLY = frozenset({DESKTOP})
 MOBILE_ONLY = frozenset({MOBILE})
-# This is used for disabling a story on all platforms.
 NO_PLATFORMS = frozenset()
diff --git a/tools/perf/page_sets/system_health/searching_stories.py b/tools/perf/page_sets/system_health/searching_stories.py
index 96dd713..19c64a6 100644
--- a/tools/perf/page_sets/system_health/searching_stories.py
+++ b/tools/perf/page_sets/system_health/searching_stories.py
@@ -2,15 +2,15 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-from page_sets.system_health import platforms
 from page_sets.system_health import system_health_story
 
+from telemetry import decorators
 
+
+@decorators.Disabled('win')  # http://crbug.com/642463
 class SearchGoogleStory(system_health_story.SystemHealthStory):
   NAME = 'search:portal:google'
   URL = 'https://www.google.co.uk/'
-  # Tap simulation doesn't fully work on Windows. http://crbug.com/634343
-  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
 
   _SEARCH_BOX_SELECTOR = 'input[aria-label="Search"]'
   _RESULT_SELECTOR = '.r > a[href*="wikipedia"]'
diff --git a/tools/perf/page_sets/system_health/system_health_story.py b/tools/perf/page_sets/system_health/system_health_story.py
index 394710d..78b9347b 100644
--- a/tools/perf/page_sets/system_health/system_health_story.py
+++ b/tools/perf/page_sets/system_health/system_health_story.py
@@ -4,7 +4,9 @@
 
 from page_sets.system_health import platforms
 
+from telemetry import decorators
 from telemetry.page import page
+from telemetry.page import shared_page_state
 
 
 # Extra wait time after the page has loaded required by the loading metric. We
@@ -13,6 +15,32 @@
 _WAIT_TIME_AFTER_LOAD = 10
 
 
+class _SystemHealthSharedState(shared_page_state.SharedPageState):
+  """Shared state which enables disabling stories on individual platforms.
+
+  This class adds support for enabling/disabling individual stories on
+  individual platforms using the same approaches as for benchmarks:
+
+    1. Disabled/Enabled decorator:
+
+       @decorators.Disabled('win')
+       class Story(system_health_story.SystemHealthStory):
+         ...
+
+    2. ShouldDisable method:
+
+       class Story(system_health_story.SystemHealthStory):
+         ...
+
+         @classmethod
+         def ShouldDisable(cls, possible_browser):
+           return possible_browser.platform.GetOSName() == 'win'
+  """
+
+  def CanRunStory(self, story):
+    return story.CanRun(self.possible_browser)
+
+
 class _MetaSystemHealthStory(type):
   """Metaclass for SystemHealthStory."""
 
@@ -41,11 +69,28 @@
   def __init__(self, story_set, take_memory_measurement):
     case, group, _ = self.NAME.split(':')
     super(SystemHealthStory, self).__init__(
-        page_set=story_set, name=self.NAME, url=self.URL,
+        shared_page_state_class=_SystemHealthSharedState, page_set=story_set,
+        name=self.NAME, url=self.URL,
         credentials_path='../data/credentials.json',
         grouping_keys={'case': case, 'group': group})
     self._take_memory_measurement = take_memory_measurement
 
+  @classmethod
+  def CanRun(cls, possible_browser):
+    if (decorators.ShouldSkip(cls, possible_browser)[0] or
+        cls.ShouldDisable(possible_browser)):
+      return False
+    return True
+
+  @classmethod
+  def ShouldDisable(cls, possible_browser):
+    """Override this method to disable a story under specific conditions.
+
+    This method is modelled after telemetry.benchmark.Benchmark.ShouldDisable().
+    """
+    del possible_browser
+    return False
+
   def _Measure(self, action_runner):
     if self._take_memory_measurement:
       action_runner.MeasureMemory(deterministic_mode=True)
diff --git a/tools/perf/page_sets/todomvc.py b/tools/perf/page_sets/todomvc.py
index 115b1a9c..4f095ec 100644
--- a/tools/perf/page_sets/todomvc.py
+++ b/tools/perf/page_sets/todomvc.py
@@ -39,13 +39,10 @@
         """
         this.becameIdle = false;
         this.idleCallback = function(deadline) {
-            let idletime = deadline.timeRemaining();
-            console.time("time remaining: " + idletime);
-            if (idletime > 20)
+            if (deadline.timeRemaining() > 20)
                 this.becameIdle = true;
             else
                 requestIdleCallback(this.idleCallback);
-            console.timeEnd("time remaining: " + idletime);
         };
         requestIdleCallback(this.idleCallback);
         """
diff --git a/tools/protoc_wrapper/protoc_wrapper.py b/tools/protoc_wrapper/protoc_wrapper.py
index 26f3e3d..8eac884 100755
--- a/tools/protoc_wrapper/protoc_wrapper.py
+++ b/tools/protoc_wrapper/protoc_wrapper.py
@@ -96,15 +96,15 @@
   options = parser.parse_args()
 
   proto_dir = os.path.relpath(options.proto_in_dir)
-  protoc_cmd = [
-    os.path.realpath(options.protoc),
-    "--proto_path", proto_dir
-  ]
+  protoc_cmd = [os.path.realpath(options.protoc)]
 
   protos = options.protos
   headers = []
   VerifyProtoNames(protos)
 
+  if options.py_out_dir:
+    protoc_cmd += ["--python_out", options.py_out_dir]
+
   if options.cc_out_dir:
     cc_out_dir = options.cc_out_dir
     cc_options = FormatGeneratorOptions(options.cc_options)
@@ -113,9 +113,6 @@
       stripped_name = StripProtoExtension(filename)
       headers.append(os.path.join(cc_out_dir, stripped_name + ".pb.h"))
 
-  if options.py_out_dir:
-    protoc_cmd += ["--python_out", options.py_out_dir]
-
   if options.plugin_out_dir:
     plugin_options = FormatGeneratorOptions(options.plugin_options)
     protoc_cmd += [
@@ -123,6 +120,7 @@
       "--plugin_out", plugin_options + options.plugin_out_dir
     ]
 
+  protoc_cmd += ["--proto_path", proto_dir]
   protoc_cmd += [os.path.join(proto_dir, name) for name in protos]
   ret = subprocess.call(protoc_cmd)
   if ret != 0:
diff --git a/tools/valgrind/gtest_exclude/content_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/content_unittests.gtest-drmemory_win32.txt
index 8cd7bb7..52ca2d14 100644
--- a/tools/valgrind/gtest_exclude/content_unittests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/content_unittests.gtest-drmemory_win32.txt
@@ -7,6 +7,3 @@
 # http://crbug.com/522049
 RenderWidgetCompositorOutputSurfaceTest.SucceedTwice
 RenderWidgetCompositorOutputSurfaceTest.FallbackSuccessNormalSuccess
-
-# https://crbug.com/604056
-CodecProfiles/RTCVideoDecoderTest.GetVDAErrorCounterForTesting*
diff --git a/tools/vim/chromium.ycm_extra_conf.py b/tools/vim/chromium.ycm_extra_conf.py
index e9397ce..a2f74a2 100644
--- a/tools/vim/chromium.ycm_extra_conf.py
+++ b/tools/vim/chromium.ycm_extra_conf.py
@@ -63,6 +63,10 @@
   'c++',
 ]
 
+_extension_flags = {
+  '.m': ['-x', 'objective-c'],
+  '.mm': ['-x', 'objective-c++'],
+}
 
 def PathExists(*args):
   return os.path.exists(os.path.join(*args))
@@ -80,7 +84,7 @@
     (String) Path of 'src/', or None if unable to find.
   """
   curdir = os.path.normpath(os.path.dirname(filename))
-  while not (os.path.basename(os.path.realpath(curdir)) == 'src'
+  while not (os.path.basename(curdir) == 'src'
              and PathExists(curdir, 'DEPS')
              and (PathExists(curdir, '..', '.gclient')
                   or PathExists(curdir, '.git'))):
@@ -159,7 +163,7 @@
   """
   # Ninja needs the path to the source file relative to the output build
   # directory.
-  rel_filename = os.path.relpath(os.path.realpath(filename), out_dir)
+  rel_filename = os.path.relpath(filename, out_dir)
 
   p = subprocess.Popen(['ninja', '-C', out_dir, '-t', 'query', rel_filename],
                        stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
@@ -320,7 +324,7 @@
 
   sys.path.append(os.path.join(chrome_root, 'tools', 'vim'))
   from ninja_output import GetNinjaOutputDirectory
-  out_dir = os.path.realpath(GetNinjaOutputDirectory(chrome_root))
+  out_dir = GetNinjaOutputDirectory(chrome_root)
 
   clang_line = GetClangCommandLineFromNinjaForSource(
       out_dir, GetBuildableSourceFile(chrome_root, filename))
@@ -348,6 +352,7 @@
       'flags': (List of Strings) Command line flags.
       'do_cache': (Boolean) True if the result should be cached.
   """
+  ext = os.path.splitext(filename)[1]
   abs_filename = os.path.abspath(filename)
   chrome_root = FindChromeSrcFromFilename(abs_filename)
   clang_flags = GetClangOptionsFromNinjaForFilename(chrome_root, abs_filename)
@@ -357,7 +362,7 @@
   # determine the flags again.
   should_cache_flags_for_file = bool(clang_flags)
 
-  final_flags = _default_flags + clang_flags
+  final_flags = _default_flags + _extension_flags.get(ext, []) + clang_flags
 
   return {
     'flags': final_flags,
diff --git a/tools/vim/ninja_output.py b/tools/vim/ninja_output.py
index e6add13..af30520 100644
--- a/tools/vim/ninja_output.py
+++ b/tools/vim/ninja_output.py
@@ -37,9 +37,8 @@
   if not output_dirs:
     for f in os.listdir(chrome_root):
       if re.match(r'out(\b|_)', f):
-        out = os.path.realpath(os.path.join(chrome_root, f))
-        if os.path.isdir(out):
-          output_dirs.append(os.path.relpath(out, start = chrome_root))
+        if os.path.isdir(os.path.join(chrome_root, f)):
+          output_dirs.append(f)
 
   def generate_paths():
     for out_dir in output_dirs:
diff --git a/tools/vim/tests/chromium.ycm_extra_conf_unittest.py b/tools/vim/tests/chromium.ycm_extra_conf_unittest.py
index bb3dca4..63aa5e1 100755
--- a/tools/vim/tests/chromium.ycm_extra_conf_unittest.py
+++ b/tools/vim/tests/chromium.ycm_extra_conf_unittest.py
@@ -53,6 +53,13 @@
     statinfo = os.stat(path)
     os.chmod(path, statinfo.st_mode | stat.S_IXUSR)
 
+def GetLastLangFlag(flags):
+  lastLang = None
+  for i, flag in enumerate(flags):
+      if flag =='-x':
+        lastLang = flags[i+1]
+  return lastLang
+
 class Chromium_ycmExtraConfTest(unittest.TestCase):
 
   def SetUpFakeChromeTreeBelowPath(self):
@@ -225,6 +232,18 @@
         '-I[OUT]/tag-default'
         ])
 
+  def testGetFlagsForFileForUnknownObjcFile(self):
+    result = self.ycm_extra_conf.FlagsForFile(
+        os.path.join(self.chrome_root, 'nonexistent.m'))
+    self.assertTrue(result)
+    self.assertEqual(GetLastLangFlag(result['flags']), 'objective-c')
+
+  def testGetFlagsForFileForUnknownObjcppFile(self):
+    result = self.ycm_extra_conf.FlagsForFile(
+        os.path.join(self.chrome_root, 'nonexistent.mm'))
+    self.assertTrue(result)
+    self.assertEqual(GetLastLangFlag(result['flags']), 'objective-c++')
+
   def testGetFlagsForFileForUnknownHeaderFile(self):
     result = self.ycm_extra_conf.FlagsForFile(
         os.path.join(self.chrome_root, 'nonexistent.h'))