diff --git a/DEPS b/DEPS
index d15ebe2..567719e 100644
--- a/DEPS
+++ b/DEPS
@@ -232,7 +232,7 @@
     Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067',
 
   'src/third_party/webrtc':
-    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '9c8feae48b530e67829cd753aefdaca958437402', # commit position 16974
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '59324a62dc4b926f3a3cd37fcbac0418ea6ab01a', # commit position 16996
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 59e5f97..f321c0c 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -249,6 +249,7 @@
     "//chrome:page_info_connection_type_javagen",
     "//chrome:website_settings_action_javagen",
     "//components/browsing_data/core:browsing_data_utils_java",
+    "//components/browsing_data/core:clear_browsing_data_tab_java",
     "//components/infobars/core:infobar_enums_java",
     "//components/ntp_snippets:ntp_snippets_java_enums_srcjar",
     "//components/ntp_tiles:ntp_tiles_enums_java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
index 9ae7199..94d9ee4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -523,7 +523,7 @@
     }
 
     /**
-     * @param Whether Contextual Search should be enabled.
+     * @param enabled Whether Contextual Search should be enabled.
      */
     public void setContextualSearchState(boolean enabled) {
         setContextualSearchPreference(enabled
@@ -545,7 +545,7 @@
     }
 
     /**
-     * @param Whether Safe Browsing Extended Reporting should be enabled.
+     * @param enabled Whether Safe Browsing Extended Reporting should be enabled.
      */
     public void setSafeBrowsingExtendedReportingEnabled(boolean enabled) {
         nativeSetSafeBrowsingExtendedReportingEnabled(enabled);
@@ -566,7 +566,7 @@
     }
 
     /**
-     * @param Whether Safe Browsing should be enabled.
+     * @param enabled Whether Safe Browsing should be enabled.
      */
     public void setSafeBrowsingEnabled(boolean enabled) {
         nativeSetSafeBrowsingEnabled(enabled);
@@ -663,38 +663,47 @@
      * Checks the state of deletion preference for a certain browsing data type.
      * @param dataType The requested browsing data type (from the shared enum
      *      {@link org.chromium.chrome.browser.browsing_data.BrowsingDataType}).
+     * @param clearBrowsingDataTab Indicates if this is a checkbox on the default, basic or advanced
+     *      tab to apply the right preference.
      * @return The state of the corresponding deletion preference.
      */
-    public boolean getBrowsingDataDeletionPreference(int dataType) {
-        return nativeGetBrowsingDataDeletionPreference(dataType);
+    public boolean getBrowsingDataDeletionPreference(int dataType, int clearBrowsingDataTab) {
+        return nativeGetBrowsingDataDeletionPreference(dataType, clearBrowsingDataTab);
     }
 
     /**
      * Sets the state of deletion preference for a certain browsing data type.
      * @param dataType The requested browsing data type (from the shared enum
      *      {@link org.chromium.chrome.browser.browsing_data.BrowsingDataType}).
+     * @param clearBrowsingDataTab Indicates if this is a checkbox on the default, basic or advanced
+     *      tab to apply the right preference.
      * @param value The state to be set.
      */
-    public void setBrowsingDataDeletionPreference(int dataType, boolean value) {
-        nativeSetBrowsingDataDeletionPreference(dataType, value);
+    public void setBrowsingDataDeletionPreference(
+            int dataType, int clearBrowsingDataTab, boolean value) {
+        nativeSetBrowsingDataDeletionPreference(dataType, clearBrowsingDataTab, value);
     }
 
     /**
      * Gets the time period for which browsing data will be deleted.
+     * @param clearBrowsingDataTab Indicates if this is a timeperiod on the default, basic or
+     *      advanced tab to apply the right preference.
      * @return The currently selected browsing data deletion time period (from the shared enum
      *      {@link org.chromium.chrome.browser.browsing_data.TimePeriod}).
      */
-    public int getBrowsingDataDeletionTimePeriod() {
-        return nativeGetBrowsingDataDeletionTimePeriod();
+    public int getBrowsingDataDeletionTimePeriod(int clearBrowsingDataTab) {
+        return nativeGetBrowsingDataDeletionTimePeriod(clearBrowsingDataTab);
     }
 
     /**
      * Sets the time period for which browsing data will be deleted.
+     * @param clearBrowsingDataTab Indicates if this is a timeperiod on the default, basic or
+     *      advanced tab to apply the right preference.
      * @param timePeriod The selected browsing data deletion time period (from the shared enum
      *      {@link org.chromium.chrome.browser.browsing_data.TimePeriod}).
      */
-    public void setBrowsingDataDeletionTimePeriod(int timePeriod) {
-        nativeSetBrowsingDataDeletionTimePeriod(timePeriod);
+    public void setBrowsingDataDeletionTimePeriod(int clearBrowsingDataTab, int timePeriod) {
+        nativeSetBrowsingDataDeletionTimePeriod(clearBrowsingDataTab, timePeriod);
     }
 
     /**
@@ -756,6 +765,14 @@
     }
 
     /**
+     * Migrate browsing data preferences when the new "clear browsing data" dialog with tabs is
+     * visited.
+     */
+    public void migrateBrowsingDataPreferences() {
+        nativeMigrateBrowsingDataPreferences();
+    }
+
+    /**
      * @return Whether browser history can be deleted by the user.
      */
     public boolean canDeleteBrowsingHistory() {
@@ -1112,15 +1129,19 @@
     private native void nativeSetTranslateEnabled(boolean enabled);
     private native void nativeResetTranslateDefaults();
     private native void nativeMigrateJavascriptPreference();
-    private native boolean nativeGetBrowsingDataDeletionPreference(int dataType);
-    private native void nativeSetBrowsingDataDeletionPreference(int dataType, boolean value);
-    private native int nativeGetBrowsingDataDeletionTimePeriod();
-    private native void nativeSetBrowsingDataDeletionTimePeriod(int timePeriod);
+    private native boolean nativeGetBrowsingDataDeletionPreference(
+            int dataType, int clearBrowsingDataTab);
+    private native void nativeSetBrowsingDataDeletionPreference(
+            int dataType, int clearBrowsingDataTab, boolean value);
+    private native int nativeGetBrowsingDataDeletionTimePeriod(int clearBrowsingDataTab);
+    private native void nativeSetBrowsingDataDeletionTimePeriod(
+            int clearBrowsingDataTab, int timePeriod);
     private native void nativeClearBrowsingData(int[] dataTypes, int timePeriod,
             String[] blacklistDomains, int[] blacklistedDomainReasons, String[] ignoredDomains,
             int[] ignoredDomainReasons);
     private native int nativeGetLastClearBrowsingDataTab();
     private native void nativeSetLastClearBrowsingDataTab(int lastTab);
+    private native void nativeMigrateBrowsingDataPreferences();
     private native void nativeRequestInfoAboutOtherFormsOfBrowsingHistory(
             OtherFormsOfBrowsingHistoryListener listener);
     private native boolean nativeCanDeleteBrowsingHistory();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java
index a5afb73..5042a3b2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java
@@ -29,11 +29,13 @@
      * Initializes BrowsingDataCounterBridge.
      * @param callback A callback to call with the result when the counter finishes.
      * @param dataType The browsing data type to be counted (from the shared enum
-     *      {@link org.chromium.chrome.browser.browsing_data.BrowsingDataType}).
+     * @param prefType The type of preference that should be handled (Default, Basic or Advanced
+     *     from {@link org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab}).
      */
-    public BrowsingDataCounterBridge(BrowsingDataCounterCallback callback, int dataType) {
+    public BrowsingDataCounterBridge(
+            BrowsingDataCounterCallback callback, int dataType, int prefType) {
         mCallback = callback;
-        mNativeBrowsingDataCounterBridge = nativeInit(dataType);
+        mNativeBrowsingDataCounterBridge = nativeInit(dataType, prefType);
     }
 
     /**
@@ -51,6 +53,6 @@
         mCallback.onCounterFinished(result);
     }
 
-    private native long nativeInit(int dataType);
+    private native long nativeInit(int dataType, int prefType);
     private native void nativeDestroy(long nativeBrowsingDataCounterBridge);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
index 4ca3e3e..3376737 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
@@ -19,6 +19,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
+import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.historyreport.AppIndexingReporter;
@@ -67,7 +68,8 @@
             mParent = parent;
             mOption = option;
             mCheckbox = checkbox;
-            mCounter = new BrowsingDataCounterBridge(this, mOption.getDataType());
+            mCounter = new BrowsingDataCounterBridge(
+                    this, mOption.getDataType(), mParent.getPreferenceType());
 
             mCheckbox.setOnPreferenceClickListener(this);
             mCheckbox.setEnabled(enabled);
@@ -99,7 +101,7 @@
             mParent.updateButtonState();
             mShouldAnnounceCounterResult = true;
             PrefServiceBridge.getInstance().setBrowsingDataDeletionPreference(
-                    mOption.getDataType(), mCheckbox.isChecked());
+                    mOption.getDataType(), mParent.getPreferenceType(), mCheckbox.isChecked());
             return true;
         }
 
@@ -303,6 +305,14 @@
     }
 
     /**
+     * Returns whether this preference page is a basic or advanced tab in order to use separate
+     * preferences.
+     */
+    protected int getPreferenceType() {
+        return ClearBrowsingDataTab.ADVANCED;
+    }
+
+    /**
      * Returns the Array of time periods. Options are displayed in the same order as they appear
      * in the array.
      */
@@ -332,7 +342,7 @@
      */
     private boolean isOptionSelectedByDefault(DialogOption option) {
         return PrefServiceBridge.getInstance().getBrowsingDataDeletionPreference(
-                option.getDataType());
+                option.getDataType(), getPreferenceType());
     }
 
     /**
@@ -420,7 +430,7 @@
             }
 
             PrefServiceBridge.getInstance().setBrowsingDataDeletionTimePeriod(
-                    ((TimePeriodSpinnerOption) value).getTimePeriod());
+                    getPreferenceType(), ((TimePeriodSpinnerOption) value).getTimePeriod());
             return true;
         }
         return false;
@@ -461,7 +471,11 @@
                     && !PrefServiceBridge.getInstance().canDeleteBrowsingHistory()) {
                 enabled = false;
                 PrefServiceBridge.getInstance().setBrowsingDataDeletionPreference(
-                        DialogOption.CLEAR_HISTORY.getDataType(), false);
+                        DialogOption.CLEAR_HISTORY.getDataType(), ClearBrowsingDataTab.BASIC,
+                        false);
+                PrefServiceBridge.getInstance().setBrowsingDataDeletionPreference(
+                        DialogOption.CLEAR_HISTORY.getDataType(), ClearBrowsingDataTab.ADVANCED,
+                        false);
             }
 
             mItems[i] = new Item(
@@ -484,8 +498,8 @@
         SpinnerPreference spinner = (SpinnerPreference) findPreference(PREF_TIME_RANGE);
         spinner.setOnPreferenceChangeListener(this);
         TimePeriodSpinnerOption[] spinnerOptions = getTimePeriodSpinnerOptions();
-        int selectedTimePeriod =
-                PrefServiceBridge.getInstance().getBrowsingDataDeletionTimePeriod();
+        int selectedTimePeriod = PrefServiceBridge.getInstance().getBrowsingDataDeletionTimePeriod(
+                getPreferenceType());
         int spinnerOptionIndex = -1;
         for (int i = 0; i < spinnerOptions.length; ++i) {
             if (spinnerOptions[i].getTimePeriod() == selectedTimePeriod) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java
index 76c7f1b..708bc62 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java
@@ -4,10 +4,17 @@
 
 package org.chromium.chrome.browser.preferences.privacy;
 
+import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
+
 /**
  * A more advanced version of {@link ClearBrowsingDataPreferences} with more dialog options and less
  * explanatory text.
  */
 public class ClearBrowsingDataPreferencesAdvanced extends ClearBrowsingDataPreferencesTab {
     // TODO(dullweber): Add more options.
+
+    @Override
+    protected int getPreferenceType() {
+        return ClearBrowsingDataTab.ADVANCED;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java
index 2a4cb11..8241c0a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.preferences.privacy;
 
+import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
+
 /**
  * A simpler version of {@link ClearBrowsingDataPreferences} with fewer dialog options and more
  * explanatory text.
@@ -11,9 +13,12 @@
 public class ClearBrowsingDataPreferencesBasic extends ClearBrowsingDataPreferencesTab {
     @Override
     protected DialogOption[] getDialogOptions() {
-        return new DialogOption[] {
-                DialogOption.CLEAR_HISTORY, DialogOption.CLEAR_COOKIES_AND_SITE_DATA,
-                DialogOption.CLEAR_CACHE
-        };
+        return new DialogOption[] {DialogOption.CLEAR_HISTORY,
+                DialogOption.CLEAR_COOKIES_AND_SITE_DATA, DialogOption.CLEAR_CACHE};
+    }
+
+    @Override
+    protected int getPreferenceType() {
+        return ClearBrowsingDataTab.BASIC;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
index 6fd0b20..c45923a9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
@@ -30,8 +30,14 @@
 public class ClearBrowsingDataTabsFragment extends Fragment {
     public static final int CBD_TAB_COUNT = 2;
 
-    public ClearBrowsingDataTabsFragment() {}
+    public ClearBrowsingDataTabsFragment() {
+        // TODO(dullweber): Remove this migration after after three milestones (probably M61)
+        PrefServiceBridge.getInstance().migrateBrowsingDataPreferences();
+    }
 
+    /**
+     * @return Returns whether the CBD dialog with tabs is enabled.
+     */
     public static boolean isFeatureEnabled() {
         return ChromeFeatureList.isEnabled(ChromeFeatureList.TABS_IN_CBD);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
index 355f597c..c119089 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
@@ -23,6 +23,7 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
 import org.chromium.chrome.browser.preferences.ButtonPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.Preferences;
@@ -605,7 +606,7 @@
                 for (DialogOption option : DialogOption.values()) {
                     boolean enabled = typesToClear.contains(option);
                     PrefServiceBridge.getInstance().setBrowsingDataDeletionPreference(
-                            option.getDataType(), enabled);
+                            option.getDataType(), ClearBrowsingDataTab.ADVANCED, enabled);
                 }
             }
         });
diff --git a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc
index ffd8e91..634d172 100644
--- a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc
+++ b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.cc
@@ -10,21 +10,31 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/pref_names.h"
-#include "components/browsing_data/core/browsing_data_utils.h"
 #include "jni/BrowsingDataCounterBridge_jni.h"
 
 using base::android::JavaParamRef;
 using base::android::ScopedJavaLocalRef;
 
 BrowsingDataCounterBridge::BrowsingDataCounterBridge(
-    JNIEnv* env, const JavaParamRef<jobject>& obj, jint data_type)
+    JNIEnv* env,
+    const JavaParamRef<jobject>& obj,
+    jint data_type,
+    jint clear_browsing_data_tab)
     : jobject_(obj) {
   DCHECK_GE(data_type, 0);
-  DCHECK_LT(data_type, browsing_data::NUM_TYPES);
+  DCHECK_LT(data_type,
+            static_cast<int>(browsing_data::BrowsingDataType::NUM_TYPES));
+  DCHECK_GE(clear_browsing_data_tab, 0);
+  DCHECK_LT(clear_browsing_data_tab,
+            static_cast<int>(browsing_data::ClearBrowsingDataTab::NUM_TYPES));
+
+  clear_browsing_data_tab_ =
+      static_cast<browsing_data::ClearBrowsingDataTab>(clear_browsing_data_tab);
 
   std::string pref;
   if (!browsing_data::GetDeletionPreferenceFromDataType(
-          static_cast<browsing_data::BrowsingDataType>(data_type), &pref)) {
+          static_cast<browsing_data::BrowsingDataType>(data_type),
+          clear_browsing_data_tab_, &pref)) {
     return;
   }
 
@@ -35,7 +45,7 @@
   if (!counter_)
     return;
 
-  counter_->Init(profile->GetPrefs(),
+  counter_->Init(profile->GetPrefs(), clear_browsing_data_tab_,
                  base::Bind(&BrowsingDataCounterBridge::onCounterFinished,
                             base::Unretained(this)));
   counter_->Restart();
@@ -64,8 +74,10 @@
                                                                result_string);
 }
 
-static jlong Init(
-    JNIEnv* env, const JavaParamRef<jobject>& obj, int data_type) {
-  return reinterpret_cast<intptr_t>(
-      new BrowsingDataCounterBridge(env, obj, data_type));
+static jlong Init(JNIEnv* env,
+                  const JavaParamRef<jobject>& obj,
+                  jint data_type,
+                  jint clear_browsing_data_tab) {
+  return reinterpret_cast<intptr_t>(new BrowsingDataCounterBridge(
+      env, obj, data_type, clear_browsing_data_tab));
 }
diff --git a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h
index 6c55f58..ba6a631 100644
--- a/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h
+++ b/chrome/browser/android/browsing_data/browsing_data_counter_bridge.h
@@ -7,6 +7,7 @@
 
 #include "base/android/jni_weak_ref.h"
 #include "base/android/scoped_java_ref.h"
+#include "components/browsing_data/core/browsing_data_utils.h"
 #include "components/browsing_data/core/counters/browsing_data_counter.h"
 
 // This class is a wrapper for BrowsingDataCounter (C++ backend) to be used by
@@ -15,10 +16,10 @@
  public:
   // Creates a BrowsingDataCounterBridge for a certain browsing data type.
   // The |data_type| is a value of the enum BrowsingDataType.
-  BrowsingDataCounterBridge(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint data_type);
+  BrowsingDataCounterBridge(JNIEnv* env,
+                            const base::android::JavaParamRef<jobject>& obj,
+                            jint data_type,
+                            jint clear_browsing_data_tab);
 
   ~BrowsingDataCounterBridge();
 
@@ -33,6 +34,7 @@
 
   base::android::ScopedJavaGlobalRef<jobject> jobject_;
   std::unique_ptr<browsing_data::BrowsingDataCounter> counter_;
+  browsing_data::ClearBrowsingDataTab clear_browsing_data_tab_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowsingDataCounterBridge);
 };
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
index c18908ba..01f7fd7f 100644
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -132,6 +132,15 @@
   return GetOriginalProfile()->GetPrefs();
 }
 
+browsing_data::ClearBrowsingDataTab ToTabEnum(jint clear_browsing_data_tab) {
+  DCHECK_GE(clear_browsing_data_tab, 0);
+  DCHECK_LT(clear_browsing_data_tab,
+            static_cast<int>(browsing_data::ClearBrowsingDataTab::NUM_TYPES));
+
+  return static_cast<browsing_data::ClearBrowsingDataTab>(
+      clear_browsing_data_tab);
+}
+
 }  // namespace
 
 // ----------------------------------------------------------------------------
@@ -539,9 +548,11 @@
 static jboolean GetBrowsingDataDeletionPreference(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
-    jint data_type) {
+    jint data_type,
+    jint clear_browsing_data_tab) {
   DCHECK_GE(data_type, 0);
-  DCHECK_LT(data_type, browsing_data::NUM_TYPES);
+  DCHECK_LT(data_type,
+            static_cast<int>(browsing_data::BrowsingDataType::NUM_TYPES));
 
   // If there is no corresponding preference for this |data_type|, pretend
   // that it's set to false.
@@ -549,43 +560,50 @@
   // data types for consistency.
   std::string pref;
   if (!browsing_data::GetDeletionPreferenceFromDataType(
-          static_cast<browsing_data::BrowsingDataType>(data_type), &pref)) {
+          static_cast<browsing_data::BrowsingDataType>(data_type),
+          ToTabEnum(clear_browsing_data_tab), &pref)) {
     return false;
   }
 
   return GetOriginalProfile()->GetPrefs()->GetBoolean(pref);
 }
 
-static void SetBrowsingDataDeletionPreference(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint data_type,
-    jboolean value) {
+static void SetBrowsingDataDeletionPreference(JNIEnv* env,
+                                              const JavaParamRef<jobject>& obj,
+                                              jint data_type,
+                                              jint clear_browsing_data_tab,
+                                              jboolean value) {
   DCHECK_GE(data_type, 0);
-  DCHECK_LT(data_type, browsing_data::NUM_TYPES);
+  DCHECK_LT(data_type,
+            static_cast<int>(browsing_data::BrowsingDataType::NUM_TYPES));
 
   std::string pref;
   if (!browsing_data::GetDeletionPreferenceFromDataType(
-          static_cast<browsing_data::BrowsingDataType>(data_type), &pref)) {
+          static_cast<browsing_data::BrowsingDataType>(data_type),
+          ToTabEnum(clear_browsing_data_tab), &pref)) {
     return;
   }
 
   GetOriginalProfile()->GetPrefs()->SetBoolean(pref, value);
 }
 
-static jint GetBrowsingDataDeletionTimePeriod(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
-  return GetPrefService()->GetInteger(browsing_data::prefs::kDeleteTimePeriod);
+static jint GetBrowsingDataDeletionTimePeriod(JNIEnv* env,
+                                              const JavaParamRef<jobject>& obj,
+                                              jint clear_browsing_data_tab) {
+  return GetPrefService()->GetInteger(
+      browsing_data::GetTimePeriodPreferenceName(
+          ToTabEnum(clear_browsing_data_tab)));
 }
 
-static void SetBrowsingDataDeletionTimePeriod(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint time_period) {
+static void SetBrowsingDataDeletionTimePeriod(JNIEnv* env,
+                                              const JavaParamRef<jobject>& obj,
+                                              jint clear_browsing_data_tab,
+                                              jint time_period) {
   DCHECK_GE(time_period, 0);
-  DCHECK_LE(time_period, browsing_data::TIME_PERIOD_LAST);
-  GetPrefService()->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
+  DCHECK_LE(time_period,
+            static_cast<int>(browsing_data::TimePeriod::TIME_PERIOD_LAST));
+  GetPrefService()->SetInteger(browsing_data::GetTimePeriodPreferenceName(
+                                   ToTabEnum(clear_browsing_data_tab)),
                                time_period);
 }
 
@@ -604,6 +622,11 @@
                                tab_index);
 }
 
+static void MigrateBrowsingDataPreferences(JNIEnv* env,
+                                           const JavaParamRef<jobject>& obj) {
+  browsing_data::MigratePreferencesToBasic(GetOriginalProfile()->GetPrefs());
+}
+
 static void ClearBrowsingData(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
@@ -622,27 +645,27 @@
   int remove_mask = 0;
   for (const int data_type : data_types_vector) {
     switch (static_cast<browsing_data::BrowsingDataType>(data_type)) {
-      case browsing_data::HISTORY:
+      case browsing_data::BrowsingDataType::HISTORY:
         remove_mask |= BrowsingDataRemover::REMOVE_HISTORY;
         break;
-      case browsing_data::CACHE:
+      case browsing_data::BrowsingDataType::CACHE:
         remove_mask |= BrowsingDataRemover::REMOVE_CACHE;
         break;
-      case browsing_data::COOKIES:
+      case browsing_data::BrowsingDataType::COOKIES:
         remove_mask |= BrowsingDataRemover::REMOVE_COOKIES;
         remove_mask |= BrowsingDataRemover::REMOVE_SITE_DATA;
         break;
-      case browsing_data::PASSWORDS:
+      case browsing_data::BrowsingDataType::PASSWORDS:
         remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS;
         break;
-      case browsing_data::FORM_DATA:
+      case browsing_data::BrowsingDataType::FORM_DATA:
         remove_mask |= BrowsingDataRemover::REMOVE_FORM_DATA;
         break;
-      case browsing_data::BOOKMARKS:
+      case browsing_data::BrowsingDataType::BOOKMARKS:
         // Bookmarks are deleted separately on the Java side.
         NOTREACHED();
         break;
-      case browsing_data::NUM_TYPES:
+      case browsing_data::BrowsingDataType::NUM_TYPES:
         NOTREACHED();
     }
   }
diff --git a/chrome/browser/browsing_data/autofill_counter_browsertest.cc b/chrome/browser/browsing_data/autofill_counter_browsertest.cc
index 6e3e1c6..d85c8896 100644
--- a/chrome/browser/browsing_data/autofill_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/autofill_counter_browsertest.cc
@@ -36,7 +36,7 @@
         browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS);
 
     SetAutofillDeletionPref(true);
-    SetDeletionPeriodPref(browsing_data::ALL_TIME);
+    SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   }
 
   // Autocomplete suggestions --------------------------------------------------
@@ -205,8 +205,9 @@
 IN_PROC_BROWSER_TEST_F(AutofillCounterTest, AutocompleteSuggestions) {
   Profile* profile = browser()->profile();
   browsing_data::AutofillCounter counter(GetWebDataService());
-  counter.Init(profile->GetPrefs(), base::Bind(&AutofillCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&AutofillCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
   WaitForCounting();
   EXPECT_EQ(0, GetNumSuggestions());
@@ -241,8 +242,9 @@
 IN_PROC_BROWSER_TEST_F(AutofillCounterTest, CreditCards) {
   Profile* profile = browser()->profile();
   browsing_data::AutofillCounter counter(GetWebDataService());
-  counter.Init(profile->GetPrefs(), base::Bind(&AutofillCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&AutofillCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
   WaitForCounting();
   EXPECT_EQ(0, GetNumCreditCards());
@@ -277,8 +279,9 @@
 IN_PROC_BROWSER_TEST_F(AutofillCounterTest, Addresses) {
   Profile* profile = browser()->profile();
   browsing_data::AutofillCounter counter(GetWebDataService());
-  counter.Init(profile->GetPrefs(), base::Bind(&AutofillCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&AutofillCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
   WaitForCounting();
   EXPECT_EQ(0, GetNumAddresses());
@@ -327,8 +330,9 @@
 
   Profile* profile = browser()->profile();
   browsing_data::AutofillCounter counter(GetWebDataService());
-  counter.Init(profile->GetPrefs(), base::Bind(&AutofillCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&AutofillCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
   WaitForCounting();
   EXPECT_EQ(5, GetNumSuggestions());
@@ -382,8 +386,9 @@
 
   Profile* profile = browser()->profile();
   browsing_data::AutofillCounter counter(GetWebDataService());
-  counter.Init(profile->GetPrefs(), base::Bind(&AutofillCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&AutofillCounterTest::Callback, base::Unretained(this)));
 
   for (const TestCase& test_case : test_cases) {
     counter.SetPeriodStartForTesting(test_case.period_start);
diff --git a/chrome/browser/browsing_data/browsing_data_counter_factory.cc b/chrome/browser/browsing_data/browsing_data_counter_factory.cc
index e9d0be0a..2cdc16c 100644
--- a/chrome/browser/browsing_data/browsing_data_counter_factory.cc
+++ b/chrome/browser/browsing_data/browsing_data_counter_factory.cc
@@ -46,7 +46,8 @@
   if (!AreCountersEnabled())
     return nullptr;
 
-  if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory) {
+  if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory ||
+      pref_name == browsing_data::prefs::kDeleteBrowsingHistoryBasic) {
     return base::MakeUnique<browsing_data::HistoryCounter>(
         HistoryServiceFactory::GetForProfile(
             profile, ServiceAccessType::EXPLICIT_ACCESS),
@@ -55,7 +56,8 @@
         ProfileSyncServiceFactory::GetForProfile(profile));
   }
 
-  if (pref_name == browsing_data::prefs::kDeleteCache)
+  if (pref_name == browsing_data::prefs::kDeleteCache ||
+      pref_name == browsing_data::prefs::kDeleteCacheBasic)
     return base::MakeUnique<CacheCounter>(profile);
 
   if (pref_name == browsing_data::prefs::kDeletePasswords) {
diff --git a/chrome/browser/browsing_data/browsing_data_counter_utils.cc b/chrome/browser/browsing_data/browsing_data_counter_utils.cc
index c28ccea..568b30e 100644
--- a/chrome/browser/browsing_data/browsing_data_counter_utils.cc
+++ b/chrome/browser/browsing_data/browsing_data_counter_utils.cc
@@ -61,7 +61,8 @@
     return l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING);
   }
 
-  if (pref_name == browsing_data::prefs::kDeleteCache) {
+  if (pref_name == browsing_data::prefs::kDeleteCache ||
+      pref_name == browsing_data::prefs::kDeleteCacheBasic) {
     // Cache counter.
     const auto* cache_result =
         static_cast<const CacheCounter::CacheResult*>(result);
diff --git a/chrome/browser/browsing_data/browsing_data_remover.h b/chrome/browser/browsing_data/browsing_data_remover.h
index 335844d..b811122 100644
--- a/chrome/browser/browsing_data/browsing_data_remover.h
+++ b/chrome/browser/browsing_data/browsing_data_remover.h
@@ -10,6 +10,7 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/browsing_data/browsing_data_remover_delegate.h"
+#include "components/keyed_service/core/keyed_service.h"
 
 namespace content {
 class BrowsingDataFilterBuilder;
@@ -50,7 +51,7 @@
 //
 // TODO(crbug.com/668114): BrowsingDataRemover does not currently support plugin
 // data deletion. Use PluginDataRemover instead.
-class BrowsingDataRemover {
+class BrowsingDataRemover : public KeyedService {
  public:
   // Mask used for Remove.
   enum RemoveDataMask {
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 69a1b303..cdde107 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -105,6 +105,7 @@
     Profile* profile = browser()->profile();
     CacheCounter counter(profile);
     counter.Init(profile->GetPrefs(),
+                 browsing_data::ClearBrowsingDataTab::ADVANCED,
                  base::Bind(&BrowsingDataRemoverBrowserTest::OnCacheSizeResult,
                             base::Unretained(this), base::Unretained(&run_loop),
                             base::Unretained(&size)));
diff --git a/chrome/browser/browsing_data/browsing_data_remover_factory.cc b/chrome/browser/browsing_data/browsing_data_remover_factory.cc
index b171158..d9edc87 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_factory.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_factory.cc
@@ -46,7 +46,7 @@
 // static
 BrowsingDataRemover* BrowsingDataRemoverFactory::GetForBrowserContext(
     content::BrowserContext* context) {
-  return static_cast<BrowsingDataRemoverImpl*>(
+  return static_cast<BrowsingDataRemover*>(
       GetInstance()->GetServiceForBrowserContext(context, true));
 }
 
diff --git a/chrome/browser/browsing_data/browsing_data_remover_impl.h b/chrome/browser/browsing_data/browsing_data_remover_impl.h
index 334c7f0..9015d1b 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_impl.h
+++ b/chrome/browser/browsing_data/browsing_data_remover_impl.h
@@ -19,7 +19,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/browsing_data/browsing_data_remover.h"
 #include "chrome/common/features.h"
-#include "components/keyed_service/core/keyed_service.h"
 #include "ppapi/features/features.h"
 #include "storage/common/quota/quota_types.h"
 #include "url/gurl.h"
@@ -32,9 +31,7 @@
 class StoragePartition;
 }
 
-class BrowsingDataRemoverImpl :
-    public BrowsingDataRemover,
-    public KeyedService {
+class BrowsingDataRemoverImpl : public BrowsingDataRemover {
  public:
   // The completion inhibitor can artificially delay completion of the browsing
   // data removal process. It is used during testing to simulate scenarios in
diff --git a/chrome/browser/browsing_data/cache_counter.cc b/chrome/browser/browsing_data/cache_counter.cc
index 1c2f5e80..557be8a3 100644
--- a/chrome/browser/browsing_data/cache_counter.cc
+++ b/chrome/browser/browsing_data/cache_counter.cc
@@ -26,7 +26,9 @@
 }
 
 const char* CacheCounter::GetPrefName() const {
-  return browsing_data::prefs::kDeleteCache;
+  return GetTab() == browsing_data::ClearBrowsingDataTab::BASIC
+             ? browsing_data::prefs::kDeleteCacheBasic
+             : browsing_data::prefs::kDeleteCache;
 }
 
 void CacheCounter::Count() {
diff --git a/chrome/browser/browsing_data/cache_counter_browsertest.cc b/chrome/browser/browsing_data/cache_counter_browsertest.cc
index 36204115..29fca83 100644
--- a/chrome/browser/browsing_data/cache_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/cache_counter_browsertest.cc
@@ -34,7 +34,7 @@
  public:
   void SetUpOnMainThread() override {
     SetCacheDeletionPref(true);
-    SetDeletionPeriodPref(browsing_data::ALL_TIME);
+    SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   }
 
   void SetCacheDeletionPref(bool value) {
@@ -183,7 +183,7 @@
 
   CacheCounter counter(profile);
   counter.Init(
-      profile->GetPrefs(),
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
   counter.Restart();
 
@@ -198,7 +198,7 @@
   Profile* profile = browser()->profile();
   CacheCounter counter(profile);
   counter.Init(
-      profile->GetPrefs(),
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
   counter.Restart();
 
@@ -214,7 +214,7 @@
   Profile* profile = browser()->profile();
   CacheCounter counter(profile);
   counter.Init(
-      profile->GetPrefs(),
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
 
   browsing_data::StoragePartitionHttpCacheDataRemover::CreateForRange(
@@ -236,7 +236,7 @@
   Profile* profile = browser()->profile();
   CacheCounter counter(profile);
   counter.Init(
-      profile->GetPrefs(),
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
   SetCacheDeletionPref(true);
 
@@ -251,26 +251,26 @@
   Profile* profile = browser()->profile();
   CacheCounter counter(profile);
   counter.Init(
-      profile->GetPrefs(),
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
       base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
 
-  SetDeletionPeriodPref(browsing_data::LAST_HOUR);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_HOUR);
   WaitForIOThread();
   browsing_data::BrowsingDataCounter::ResultInt result = GetResult();
 
-  SetDeletionPeriodPref(browsing_data::LAST_DAY);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_DAY);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_WEEK);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_WEEK);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::FOUR_WEEKS);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::FOUR_WEEKS);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::ALL_TIME);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
   EXPECT_FALSE(IsUpperLimit());
diff --git a/chrome/browser/browsing_data/downloads_counter_browsertest.cc b/chrome/browser/browsing_data/downloads_counter_browsertest.cc
index ec0da22d..fb1e2a1b 100644
--- a/chrome/browser/browsing_data/downloads_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/downloads_counter_browsertest.cc
@@ -46,7 +46,7 @@
         content::BrowserContext::GetDownloadManager(
             browser()->profile()->GetOffTheRecordProfile());
     SetDownloadsDeletionPref(true);
-    SetDeletionPeriodPref(browsing_data::ALL_TIME);
+    SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   }
 
   void TearDownOnMainThread() override {
@@ -248,6 +248,7 @@
   Profile* profile = browser()->profile();
   DownloadsCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&DownloadsCounterTest::ResultCallback,
                           base::Unretained(this)));
   counter.Restart();
@@ -277,6 +278,7 @@
   Profile* profile = browser()->profile();
   DownloadsCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&DownloadsCounterTest::ResultCallback,
                           base::Unretained(this)));
 
@@ -312,6 +314,7 @@
   Profile* profile = browser()->profile();
   DownloadsCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&DownloadsCounterTest::ResultCallback,
                           base::Unretained(this)));
 
@@ -361,22 +364,23 @@
   Profile* profile = browser()->profile();
   DownloadsCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&DownloadsCounterTest::ResultCallback,
                           base::Unretained(this)));
 
-  SetDeletionPeriodPref(browsing_data::LAST_HOUR);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_HOUR);
   EXPECT_EQ(2u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_DAY);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_DAY);
   EXPECT_EQ(5u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_WEEK);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_WEEK);
   EXPECT_EQ(7u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::FOUR_WEEKS);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::FOUR_WEEKS);
   EXPECT_EQ(8u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::ALL_TIME);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   EXPECT_EQ(11u, GetResult());
 }
 
diff --git a/chrome/browser/browsing_data/history_counter_browsertest.cc b/chrome/browser/browsing_data/history_counter_browsertest.cc
index 2fcb864..b5a0a32 100644
--- a/chrome/browser/browsing_data/history_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/history_counter_browsertest.cc
@@ -49,7 +49,7 @@
         browser()->profile()->GetRequestContext()));
 
     SetHistoryDeletionPref(true);
-    SetDeletionPeriodPref(browsing_data::ALL_TIME);
+    SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   }
 
   void AddVisit(const std::string url) {
@@ -181,8 +181,9 @@
                  base::Unretained(profile)),
       ProfileSyncServiceFactory::GetForProfile(profile));
 
-  counter.Init(profile->GetPrefs(), base::Bind(&HistoryCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HistoryCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
 
   WaitForCounting();
@@ -205,8 +206,9 @@
                  base::Unretained(profile)),
       ProfileSyncServiceFactory::GetForProfile(profile));
 
-  counter.Init(profile->GetPrefs(), base::Bind(&HistoryCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HistoryCounterTest::Callback, base::Unretained(this)));
   SetHistoryDeletionPref(true);
 
   WaitForCounting();
@@ -246,26 +248,27 @@
                  base::Unretained(profile)),
       ProfileSyncServiceFactory::GetForProfile(profile));
 
-  counter.Init(profile->GetPrefs(), base::Bind(&HistoryCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HistoryCounterTest::Callback, base::Unretained(this)));
 
-  SetDeletionPeriodPref(browsing_data::LAST_HOUR);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_HOUR);
   WaitForCounting();
   EXPECT_EQ(1u, GetLocalResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_DAY);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_DAY);
   WaitForCounting();
   EXPECT_EQ(1u, GetLocalResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_WEEK);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_WEEK);
   WaitForCounting();
   EXPECT_EQ(5u, GetLocalResult());
 
-  SetDeletionPeriodPref(browsing_data::FOUR_WEEKS);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::FOUR_WEEKS);
   WaitForCounting();
   EXPECT_EQ(8u, GetLocalResult());
 
-  SetDeletionPeriodPref(browsing_data::ALL_TIME);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   WaitForCounting();
   EXPECT_EQ(9u, GetLocalResult());
 }
@@ -284,8 +287,9 @@
                  false),
       ProfileSyncServiceFactory::GetForProfile(profile));
 
-  counter.Init(profile->GetPrefs(), base::Bind(&HistoryCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HistoryCounterTest::Callback, base::Unretained(this)));
 
   history::FakeWebHistoryService* service =
     static_cast<history::FakeWebHistoryService*>(GetFakeWebHistoryService(
@@ -300,7 +304,7 @@
 
   // No entries locally. There are some entries in Sync, but they are out of the
   // time range.
-  SetDeletionPeriodPref(browsing_data::LAST_HOUR);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_HOUR);
   service->AddSyncedVisit(
       "www.google.com", GetCurrentTime() - base::TimeDelta::FromHours(2));
   service->AddSyncedVisit(
@@ -375,8 +379,9 @@
                  true),
       sync_service);
 
-  counter.Init(profile->GetPrefs(), base::Bind(&HistoryCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HistoryCounterTest::Callback, base::Unretained(this)));
 
   // Note that some Sync operations notify observers immediately (and thus there
   // is no need to call |WaitForCounting()|; in fact, it would block the test),
diff --git a/chrome/browser/browsing_data/hosted_apps_counter_unittest.cc b/chrome/browser/browsing_data/hosted_apps_counter_unittest.cc
index c997eaf2..1aa7b6c 100644
--- a/chrome/browser/browsing_data/hosted_apps_counter_unittest.cc
+++ b/chrome/browser/browsing_data/hosted_apps_counter_unittest.cc
@@ -35,7 +35,7 @@
     extension_registry_ = extensions::ExtensionRegistry::Get(profile_.get());
 
     SetHostedAppsDeletionPref(true);
-    SetDeletionPeriodPref(browsing_data::ALL_TIME);
+    SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   }
 
   // Adding and removing apps and extensions. ----------------------------------
@@ -152,8 +152,9 @@
 TEST_F(HostedAppsCounterTest, Count) {
   Profile* profile = GetProfile();
   HostedAppsCounter counter(profile);
-  counter.Init(profile->GetPrefs(), base::Bind(&HostedAppsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HostedAppsCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
   EXPECT_EQ(0u, GetNumHostedApps());
 
@@ -178,8 +179,9 @@
 TEST_F(HostedAppsCounterTest, OnlyHostedApps) {
   Profile* profile = GetProfile();
   HostedAppsCounter counter(profile);
-  counter.Init(profile->GetPrefs(), base::Bind(&HostedAppsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HostedAppsCounterTest::Callback, base::Unretained(this)));
 
   AddHostedApp();  // 1
   AddExtension();
@@ -215,8 +217,9 @@
 TEST_F(HostedAppsCounterTest, Examples) {
   Profile* profile = GetProfile();
   HostedAppsCounter counter(profile);
-  counter.Init(profile->GetPrefs(), base::Bind(&HostedAppsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&HostedAppsCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
   EXPECT_EQ(0u, GetExamples().size());
 
diff --git a/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc b/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc
index b638711..f96758f 100644
--- a/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc
@@ -156,6 +156,7 @@
   Profile* profile = browser()->profile();
   MediaLicensesCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&MediaLicensesCounterTest::CountingCallback,
                           base::Unretained(this)));
   counter.Restart();
@@ -174,6 +175,7 @@
   Profile* profile = browser()->profile();
   MediaLicensesCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&MediaLicensesCounterTest::CountingCallback,
                           base::Unretained(this)));
   counter.Restart();
@@ -193,6 +195,7 @@
   Profile* profile = browser()->profile();
   MediaLicensesCounter counter(profile);
   counter.Init(profile->GetPrefs(),
+               browsing_data::ClearBrowsingDataTab::ADVANCED,
                base::Bind(&MediaLicensesCounterTest::CountingCallback,
                           base::Unretained(this)));
   SetMediaLicenseDeletionPref(true);
diff --git a/chrome/browser/browsing_data/mock_browsing_data_remover.h b/chrome/browser/browsing_data/mock_browsing_data_remover.h
index e220a082..fa1f8bfa 100644
--- a/chrome/browser/browsing_data/mock_browsing_data_remover.h
+++ b/chrome/browser/browsing_data/mock_browsing_data_remover.h
@@ -8,7 +8,6 @@
 #include <list>
 
 #include "chrome/browser/browsing_data/browsing_data_remover.h"
-#include "components/keyed_service/core/keyed_service.h"
 
 namespace content {
 class BrowserContext;
@@ -17,8 +16,7 @@
 // A BrowsingDataRemover that only records Remove*() calls.
 // Some of the other methods are NOTIMPLEMENTED() as they are not needed for
 // existing testcases.
-class MockBrowsingDataRemover : public BrowsingDataRemover,
-                                public KeyedService {
+class MockBrowsingDataRemover : public BrowsingDataRemover {
  public:
   explicit MockBrowsingDataRemover(content::BrowserContext* context);
 
diff --git a/chrome/browser/browsing_data/passwords_counter_browsertest.cc b/chrome/browser/browsing_data/passwords_counter_browsertest.cc
index 01e7511..8f5b994 100644
--- a/chrome/browser/browsing_data/passwords_counter_browsertest.cc
+++ b/chrome/browser/browsing_data/passwords_counter_browsertest.cc
@@ -28,7 +28,7 @@
     store_ = PasswordStoreFactory::GetForProfile(
         browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS);
     SetPasswordsDeletionPref(true);
-    SetDeletionPeriodPref(browsing_data::ALL_TIME);
+    SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   }
 
   void AddLogin(const std::string& origin,
@@ -140,8 +140,9 @@
   Profile* profile = browser()->profile();
   browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile(
       profile, ServiceAccessType::EXPLICIT_ACCESS));
-  counter.Init(profile->GetPrefs(), base::Bind(&PasswordsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
 
   WaitForCounting();
@@ -159,8 +160,9 @@
   browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile(
       profile, ServiceAccessType::EXPLICIT_ACCESS));
 
-  counter.Init(profile->GetPrefs(), base::Bind(&PasswordsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
 
   WaitForCounting();
@@ -178,8 +180,9 @@
   Profile* profile = browser()->profile();
   browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile(
       profile, ServiceAccessType::EXPLICIT_ACCESS));
-  counter.Init(profile->GetPrefs(), base::Bind(&PasswordsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this)));
   SetPasswordsDeletionPref(true);
 
   WaitForCounting();
@@ -195,8 +198,9 @@
   Profile* profile = browser()->profile();
   browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile(
       profile, ServiceAccessType::EXPLICIT_ACCESS));
-  counter.Init(profile->GetPrefs(), base::Bind(&PasswordsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this)));
   counter.Restart();
 
   WaitForCounting();
@@ -226,26 +230,27 @@
   Profile* profile = browser()->profile();
   browsing_data::PasswordsCounter counter(PasswordStoreFactory::GetForProfile(
       profile, ServiceAccessType::EXPLICIT_ACCESS));
-  counter.Init(profile->GetPrefs(), base::Bind(&PasswordsCounterTest::Callback,
-                                               base::Unretained(this)));
+  counter.Init(
+      profile->GetPrefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&PasswordsCounterTest::Callback, base::Unretained(this)));
 
-  SetDeletionPeriodPref(browsing_data::LAST_HOUR);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_HOUR);
   WaitForCounting();
   EXPECT_EQ(1u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_DAY);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_DAY);
   WaitForCounting();
   EXPECT_EQ(1u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_WEEK);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_WEEK);
   WaitForCounting();
   EXPECT_EQ(3u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::FOUR_WEEKS);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::FOUR_WEEKS);
   WaitForCounting();
   EXPECT_EQ(3u, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::ALL_TIME);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   WaitForCounting();
   EXPECT_EQ(4u, GetResult());
 }
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc
index 84e26ca..4aad791 100644
--- a/chrome/browser/certificate_manager_model.cc
+++ b/chrome/browser/certificate_manager_model.cc
@@ -23,7 +23,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/resource_context.h"
 #include "crypto/nss_util.h"
-#include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
 #include "net/cert/x509_certificate.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc b/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc
index 755e86c..3c6cf43 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc
@@ -37,7 +37,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "crypto/nss_key_util.h"
 #include "crypto/scoped_nss_types.h"
-#include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_database.h"
 #include "net/cert/nss_cert_database.h"
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
index e8474db..36610d5 100644
--- a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
+++ b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
@@ -145,7 +145,7 @@
   browsing_data::TimePeriod period =
       static_cast<browsing_data::TimePeriod>(period_pref);
   double since = 0;
-  if (period != browsing_data::ALL_TIME) {
+  if (period != browsing_data::TimePeriod::ALL_TIME) {
     base::Time time = browsing_data::CalculateBeginDeleteTime(period);
     since = time.ToJsTime();
   }
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
index 10efc18..9a90887 100644
--- a/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
+++ b/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc
@@ -120,7 +120,8 @@
 
   void SetSinceAndVerify(browsing_data::TimePeriod since_pref) {
     PrefService* prefs = browser()->profile()->GetPrefs();
-    prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod, since_pref);
+    prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
+                      static_cast<int>(since_pref));
 
     scoped_refptr<BrowsingDataSettingsFunction> function =
         new BrowsingDataSettingsFunction();
@@ -136,7 +137,7 @@
     EXPECT_TRUE(options->GetDouble("since", &since));
 
     double expected_since = 0;
-    if (since_pref != browsing_data::ALL_TIME) {
+    if (since_pref != browsing_data::TimePeriod::ALL_TIME) {
       base::Time time = CalculateBeginDeleteTime(since_pref);
       expected_since = time.ToJsTime();
     }
@@ -456,11 +457,11 @@
 
 // Test the processing of the 'delete since' preference.
 IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionSince) {
-  SetSinceAndVerify(browsing_data::ALL_TIME);
-  SetSinceAndVerify(browsing_data::LAST_HOUR);
-  SetSinceAndVerify(browsing_data::LAST_DAY);
-  SetSinceAndVerify(browsing_data::LAST_WEEK);
-  SetSinceAndVerify(browsing_data::FOUR_WEEKS);
+  SetSinceAndVerify(browsing_data::TimePeriod::ALL_TIME);
+  SetSinceAndVerify(browsing_data::TimePeriod::LAST_HOUR);
+  SetSinceAndVerify(browsing_data::TimePeriod::LAST_DAY);
+  SetSinceAndVerify(browsing_data::TimePeriod::LAST_WEEK);
+  SetSinceAndVerify(browsing_data::TimePeriod::FOUR_WEEKS);
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionEmpty) {
diff --git a/chrome/browser/net/sdch_browsertest.cc b/chrome/browser/net/sdch_browsertest.cc
index 74ad70d..0966cc4 100644
--- a/chrome/browser/net/sdch_browsertest.cc
+++ b/chrome/browser/net/sdch_browsertest.cc
@@ -409,10 +409,12 @@
     BrowsingDataRemover* remover =
         BrowsingDataRemoverFactory::GetForBrowserContext(browser()->profile());
     BrowsingDataRemoverCompletionObserver completion_observer(remover);
-    remover->RemoveAndReply(
-        browsing_data::CalculateBeginDeleteTime(browsing_data::LAST_HOUR),
-        browsing_data::CalculateEndDeleteTime(browsing_data::LAST_HOUR),
-        remove_mask, BrowsingDataHelper::UNPROTECTED_WEB, &completion_observer);
+    remover->RemoveAndReply(browsing_data::CalculateBeginDeleteTime(
+                                browsing_data::TimePeriod::LAST_HOUR),
+                            browsing_data::CalculateEndDeleteTime(
+                                browsing_data::TimePeriod::LAST_HOUR),
+                            remove_mask, BrowsingDataHelper::UNPROTECTED_WEB,
+                            &completion_observer);
     completion_observer.BlockUntilCompletion();
   }
 
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 0375932..d45468b5 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -734,8 +734,9 @@
         !deleting_history_allowed) {
       prefs->SetBoolean(
           browsing_data::prefs::kDeleteBrowsingHistory, false);
-      prefs->SetBoolean(
-          browsing_data::prefs::kDeleteDownloadHistory, false);
+      prefs->SetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryBasic,
+                        false);
+      prefs->SetBoolean(browsing_data::prefs::kDeleteDownloadHistory, false);
     }
   }
 };
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index d72125b..4ccdbb0 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -95,6 +95,7 @@
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/bookmarks/common/bookmark_pref_names.h"
+#include "components/browsing_data/core/pref_names.h"
 #include "components/component_updater/component_updater_service.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
@@ -2219,6 +2220,54 @@
   EXPECT_EQ(url, enumerator2.urls()[0]);
 }
 
+IN_PROC_BROWSER_TEST_F(PolicyTest, DeletingBrowsingHistoryDisabled) {
+  // Verifies that deleting the browsing history can be disabled.
+
+  PrefService* prefs = browser()->profile()->GetPrefs();
+  EXPECT_FALSE(prefs->IsManagedPreference(prefs::kAllowDeletingBrowserHistory));
+  EXPECT_TRUE(prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory));
+
+  EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistory));
+  EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteDownloadHistory));
+  EXPECT_TRUE(
+      prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryBasic));
+
+  PolicyMap policies;
+  policies.Set(key::kAllowDeletingBrowserHistory, POLICY_LEVEL_MANDATORY,
+               POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
+               base::MakeUnique<base::Value>(true), nullptr);
+  UpdateProviderPolicy(policies);
+  EXPECT_TRUE(prefs->IsManagedPreference(prefs::kAllowDeletingBrowserHistory));
+  EXPECT_TRUE(prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory));
+
+  EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistory));
+  EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteDownloadHistory));
+  EXPECT_TRUE(
+      prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryBasic));
+
+  policies.Set(key::kAllowDeletingBrowserHistory, POLICY_LEVEL_MANDATORY,
+               POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
+               base::MakeUnique<base::Value>(false), nullptr);
+  UpdateProviderPolicy(policies);
+  EXPECT_TRUE(prefs->IsManagedPreference(prefs::kAllowDeletingBrowserHistory));
+  EXPECT_FALSE(prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory));
+
+  EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistory));
+  EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteDownloadHistory));
+  EXPECT_FALSE(
+      prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryBasic));
+
+  policies.Clear();
+  UpdateProviderPolicy(policies);
+  EXPECT_FALSE(prefs->IsManagedPreference(prefs::kAllowDeletingBrowserHistory));
+  EXPECT_TRUE(prefs->GetBoolean(prefs::kAllowDeletingBrowserHistory));
+
+  EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistory));
+  EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteDownloadHistory));
+  EXPECT_TRUE(
+      prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryBasic));
+}
+
 // TODO(port): Test corresponding bubble translate UX: http://crbug.com/383235
 #if !defined(USE_AURA)
 // http://crbug.com/241691 PolicyTest.TranslateEnabled is failing regularly.
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc
index 807a38e..d402584 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.cc
@@ -16,7 +16,11 @@
 #include "chrome/browser/profile_resetter/resettable_settings_snapshot.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_config.h"
+#include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/search_engines/template_url_service.h"
 #include "components/url_formatter/url_fixer.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_registry.h"
@@ -322,8 +326,24 @@
 
   InitExtensionData();
 
-  // TODO(alito): Figure out cases where settings cannot be reset, for example
-  // due to policy or extensions that cannot be disabled.
+  if (!SomeSettingRequiresReset())
+    return;
+
+  // For now, during the experimental phase, if policy controls any of the
+  // settings that we consider for reset (search, startup pages, homepage) or if
+  // an extension that needs to be disabled is managed by policy, then we do not
+  // show the reset prompt.
+  //
+  // TODO(alito): Consider how clients with policies should be prompted for
+  // reset.
+  if (SomeSettingIsManaged() || SomeExtensionMustRemainEnabled()) {
+    if (homepage_reset_state_ == RESET_REQUIRED)
+      homepage_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
+    if (default_search_reset_state_ == RESET_REQUIRED)
+      default_search_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
+    if (startup_urls_reset_state_ == RESET_REQUIRED)
+      startup_urls_reset_state_ = NO_RESET_REQUIRED_DUE_TO_POLICY;
+  }
 }
 
 void SettingsResetPromptModel::InitDefaultSearchData() {
@@ -458,4 +478,46 @@
          homepage_reset_state_ == RESET_REQUIRED;
 }
 
+bool SettingsResetPromptModel::SomeSettingIsManaged() const {
+  PrefService* prefs = profile_->GetPrefs();
+  DCHECK(prefs);
+
+  // Check if homepage is managed.
+  const PrefService::Preference* homepage =
+      prefs->FindPreference(prefs::kHomePage);
+  if (homepage && (homepage->IsManaged() || homepage->IsManagedByCustodian()))
+    return true;
+
+  // Check if startup pages are managed.
+  if (SessionStartupPref::TypeIsManaged(prefs) ||
+      SessionStartupPref::URLsAreManaged(prefs)) {
+    return true;
+  }
+
+  // Check if default search is managed.
+  TemplateURLService* service =
+      TemplateURLServiceFactory::GetForProfile(profile_);
+  if (service && service->is_default_search_managed())
+    return true;
+
+  return false;
+}
+
+bool SettingsResetPromptModel::SomeExtensionMustRemainEnabled() const {
+  extensions::ManagementPolicy* management_policy =
+      extensions::ExtensionSystem::Get(profile_)->management_policy();
+
+  if (management_policy) {
+    for (const auto& item : extensions_to_disable()) {
+      const extensions::ExtensionId& extension_id = item.first;
+      const extensions::Extension* extension =
+          GetExtension(profile_, extension_id);
+      if (extension && management_policy->MustRemainEnabled(extension, nullptr))
+        return true;
+    }
+  }
+
+  return false;
+}
+
 }  // namespace safe_browsing.
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h
index 207447e5..771531a 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model.h
@@ -47,6 +47,7 @@
     NO_RESET_REQUIRED_DUE_TO_ALREADY_PROMPTED_FOR_SETTING = 3,
     NO_RESET_REQUIRED_DUE_TO_RECENTLY_PROMPTED = 4,
     NO_RESET_REQUIRED_DUE_TO_OTHER_SETTING_REQUIRING_RESET = 5,
+    NO_RESET_REQUIRED_DUE_TO_POLICY = 6,
   };
 
   using ExtensionMap =
@@ -135,6 +136,9 @@
   // Return true if any setting's reset state is set to |RESET_REQUIRED|.
   bool SomeSettingRequiresReset() const;
 
+  bool SomeSettingIsManaged() const;
+  bool SomeExtensionMustRemainEnabled() const;
+
   Profile* const profile_;
 
   SettingsResetPromptPrefsManager prefs_manager_;
diff --git a/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc b/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc
index 3d6b219..c505b2c18 100644
--- a/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc
+++ b/chrome/browser/ssl/chrome_ssl_host_state_delegate_test.cc
@@ -619,11 +619,13 @@
     BrowsingDataRemover* remover =
         BrowsingDataRemoverFactory::GetForBrowserContext(profile);
     BrowsingDataRemoverCompletionObserver completion_observer(remover);
-    remover->RemoveAndReply(
-        browsing_data::CalculateBeginDeleteTime(browsing_data::LAST_HOUR),
-        browsing_data::CalculateEndDeleteTime(browsing_data::LAST_HOUR),
-        BrowsingDataRemover::REMOVE_HISTORY,
-        BrowsingDataHelper::UNPROTECTED_WEB, &completion_observer);
+    remover->RemoveAndReply(browsing_data::CalculateBeginDeleteTime(
+                                browsing_data::TimePeriod::LAST_HOUR),
+                            browsing_data::CalculateEndDeleteTime(
+                                browsing_data::TimePeriod::LAST_HOUR),
+                            BrowsingDataRemover::REMOVE_HISTORY,
+                            BrowsingDataHelper::UNPROTECTED_WEB,
+                            &completion_observer);
     completion_observer.BlockUntilCompletion();
   }
 };
diff --git a/chrome/browser/ssl/ssl_browser_tests.cc b/chrome/browser/ssl/ssl_browser_tests.cc
index 821b5ae..ad0ecec8 100644
--- a/chrome/browser/ssl/ssl_browser_tests.cc
+++ b/chrome/browser/ssl/ssl_browser_tests.cc
@@ -114,7 +114,6 @@
 
 #if defined(USE_NSS_CERTS)
 #include "chrome/browser/net/nss_context.h"
-#include "net/base/crypto_module.h"
 #include "net/cert/nss_cert_database.h"
 #endif  // defined(USE_NSS_CERTS)
 
diff --git a/chrome/browser/ui/crypto_module_password_dialog_nss.cc b/chrome/browser/ui/crypto_module_password_dialog_nss.cc
index b211d9f..d2438f8 100644
--- a/chrome/browser/ui/crypto_module_password_dialog_nss.cc
+++ b/chrome/browser/ui/crypto_module_password_dialog_nss.cc
@@ -10,7 +10,6 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "content/public/browser/browser_thread.h"
-#include "net/base/crypto_module.h"
 #include "net/cert/x509_certificate.h"
 
 using content::BrowserThread;
diff --git a/chrome/browser/ui/webui/options/certificate_manager_handler.cc b/chrome/browser/ui/webui/options/certificate_manager_handler.cc
index 5648100..799151c 100644
--- a/chrome/browser/ui/webui/options/certificate_manager_handler.cc
+++ b/chrome/browser/ui/webui/options/certificate_manager_handler.cc
@@ -36,7 +36,6 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
-#include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
 #include "net/cert/x509_certificate.h"
 #include "net/der/input.h"
diff --git a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
index 416515f..4037188 100644
--- a/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
+++ b/chrome/browser/ui/webui/options/clear_browser_data_handler.cc
@@ -375,6 +375,7 @@
   DCHECK(AreCountersEnabled());
 
   counter->Init(Profile::FromWebUI(web_ui())->GetPrefs(),
+                browsing_data::ClearBrowsingDataTab::ADVANCED,
                 base::Bind(&ClearBrowserDataHandler::UpdateCounterText,
                            base::Unretained(this)));
   counters_.push_back(std::move(counter));
diff --git a/chrome/browser/ui/webui/settings/certificates_handler.cc b/chrome/browser/ui/webui/settings/certificates_handler.cc
index d1bcacb..37922e3 100644
--- a/chrome/browser/ui/webui/settings/certificates_handler.cc
+++ b/chrome/browser/ui/webui/settings/certificates_handler.cc
@@ -35,7 +35,6 @@
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
-#include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
 #include "net/cert/x509_certificate.h"
 #include "net/der/input.h"
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index ea54ef4..dd8d078d 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -317,6 +317,7 @@
 void ClearBrowsingDataHandler::AddCounter(
     std::unique_ptr<browsing_data::BrowsingDataCounter> counter) {
   counter->Init(profile_->GetPrefs(),
+                browsing_data::ClearBrowsingDataTab::ADVANCED,
                 base::Bind(&ClearBrowsingDataHandler::UpdateCounterText,
                            base::Unretained(this)));
   counters_.push_back(std::move(counter));
@@ -325,8 +326,7 @@
 void ClearBrowsingDataHandler::UpdateCounterText(
     std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) {
   CallJavascriptFunction(
-      "cr.webUIListenerCallback",
-      base::StringValue("update-counter-text"),
+      "cr.webUIListenerCallback", base::StringValue("update-counter-text"),
       base::StringValue(result->source()->GetPrefName()),
       base::StringValue(GetChromeCounterTextFromResult(result.get())));
 }
diff --git a/chrome/install_static/install_util.cc b/chrome/install_static/install_util.cc
index 0def16a..5848021 100644
--- a/chrome/install_static/install_util.cc
+++ b/chrome/install_static/install_util.cc
@@ -501,7 +501,7 @@
   DWORD dummy = 0;
   DWORD length = ::GetFileVersionInfoSize(exe_path.c_str(), &dummy);
   if (length) {
-    std::unique_ptr<char> data(new char[length]);
+    std::unique_ptr<char[]> data(new char[length]);
     if (::GetFileVersionInfo(exe_path.c_str(), dummy, length, data.get())) {
       GetValueFromVersionResource(data.get(), L"ProductVersion", version);
 
diff --git a/chromeos/network/onc/onc_certificate_importer_impl.cc b/chromeos/network/onc/onc_certificate_importer_impl.cc
index 1f04a696..0542be3 100644
--- a/chromeos/network/onc/onc_certificate_importer_impl.cc
+++ b/chromeos/network/onc/onc_certificate_importer_impl.cc
@@ -22,7 +22,6 @@
 #include "chromeos/network/network_event_log.h"
 #include "chromeos/network/onc/onc_utils.h"
 #include "crypto/scoped_nss_types.h"
-#include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
 #include "net/cert/nss_cert_database.h"
 #include "net/cert/x509_certificate.h"
diff --git a/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc b/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc
index aa148e4..b8e1b0eb 100644
--- a/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc
+++ b/chromeos/network/onc/onc_certificate_importer_impl_unittest.cc
@@ -19,7 +19,6 @@
 #include "chromeos/network/onc/onc_test_utils.h"
 #include "components/onc/onc_constants.h"
 #include "crypto/scoped_test_nss_db.h"
-#include "net/base/crypto_module.h"
 #include "net/base/hash_value.h"
 #include "net/cert/cert_type.h"
 #include "net/cert/nss_cert_database_chromeos.h"
diff --git a/components/browsing_data/core/BUILD.gn b/components/browsing_data/core/BUILD.gn
index a0f40b11..dd140ce5 100644
--- a/components/browsing_data/core/BUILD.gn
+++ b/components/browsing_data/core/BUILD.gn
@@ -10,6 +10,7 @@
   sources = [
     "browsing_data_utils.cc",
     "browsing_data_utils.h",
+    "clear_browsing_data_tab.h",
     "counters/autofill_counter.cc",
     "counters/autofill_counter.h",
     "counters/browsing_data_counter.cc",
@@ -45,6 +46,11 @@
       "browsing_data_utils.h",
     ]
   }
+  java_cpp_enum("clear_browsing_data_tab_java") {
+    sources = [
+      "clear_browsing_data_tab.h",
+    ]
+  }
 }
 
 source_set("unit_tests") {
@@ -63,6 +69,7 @@
     "//components/signin/core/browser:test_support",
     "//components/sync",
     "//components/sync:test_support_driver",
+    "//components/sync_preferences:test_support",
     "//components/version_info:version_info",
     "//net",
     "//testing/gtest",
diff --git a/components/browsing_data/core/DEPS b/components/browsing_data/core/DEPS
index cd4abb34..a28b230 100644
--- a/components/browsing_data/core/DEPS
+++ b/components/browsing_data/core/DEPS
@@ -10,6 +10,7 @@
   "+components/strings/grit/components_strings.h",
   "+components/sync/base",
   "+components/sync/driver",
+  "+components/sync_preferences",
   "+components/version_info",
   "+components/webdata/common",
   "+net",
diff --git a/components/browsing_data/core/browsing_data_utils.cc b/components/browsing_data/core/browsing_data_utils.cc
index 8935742..d353f00 100644
--- a/components/browsing_data/core/browsing_data_utils.cc
+++ b/components/browsing_data/core/browsing_data_utils.cc
@@ -9,6 +9,7 @@
 #include "components/browsing_data/core/counters/history_counter.h"
 #include "components/browsing_data/core/counters/passwords_counter.h"
 #include "components/browsing_data/core/pref_names.h"
+#include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -18,19 +19,19 @@
   base::TimeDelta diff;
   base::Time delete_begin_time = base::Time::Now();
   switch (time_period) {
-    case LAST_HOUR:
+    case TimePeriod::LAST_HOUR:
       diff = base::TimeDelta::FromHours(1);
       break;
-    case LAST_DAY:
+    case TimePeriod::LAST_DAY:
       diff = base::TimeDelta::FromHours(24);
       break;
-    case LAST_WEEK:
+    case TimePeriod::LAST_WEEK:
       diff = base::TimeDelta::FromHours(7 * 24);
       break;
-    case FOUR_WEEKS:
+    case TimePeriod::FOUR_WEEKS:
       diff = base::TimeDelta::FromHours(4 * 7 * 24);
       break;
-    case ALL_TIME:
+    case TimePeriod::ALL_TIME:
       delete_begin_time = base::Time();
       break;
   }
@@ -44,20 +45,20 @@
 
 void RecordDeletionForPeriod(TimePeriod period) {
   switch (period) {
-    case browsing_data::LAST_HOUR:
+    case TimePeriod::LAST_HOUR:
       base::RecordAction(base::UserMetricsAction("ClearBrowsingData_LastHour"));
       break;
-    case browsing_data::LAST_DAY:
+    case TimePeriod::LAST_DAY:
       base::RecordAction(base::UserMetricsAction("ClearBrowsingData_LastDay"));
       break;
-    case browsing_data::LAST_WEEK:
+    case TimePeriod::LAST_WEEK:
       base::RecordAction(base::UserMetricsAction("ClearBrowsingData_LastWeek"));
       break;
-    case browsing_data::FOUR_WEEKS:
+    case TimePeriod::FOUR_WEEKS:
       base::RecordAction(
           base::UserMetricsAction("ClearBrowsingData_LastMonth"));
       break;
-    case browsing_data::ALL_TIME:
+    case TimePeriod::ALL_TIME:
       base::RecordAction(
           base::UserMetricsAction("ClearBrowsingData_Everything"));
       break;
@@ -85,7 +86,8 @@
             ? IDS_DEL_PASSWORDS_COUNTER
             : IDS_DEL_DOWNLOADS_COUNTER,
         count);
-  } else if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory) {
+  } else if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory ||
+             pref_name == browsing_data::prefs::kDeleteBrowsingHistoryBasic) {
     // History counter.
     const browsing_data::HistoryCounter::HistoryResult* history_result =
         static_cast<const browsing_data::HistoryCounter::HistoryResult*>(
@@ -169,30 +171,55 @@
   return text;
 }
 
+const char* GetTimePeriodPreferenceName(
+    ClearBrowsingDataTab clear_browsing_data_tab) {
+  return clear_browsing_data_tab == ClearBrowsingDataTab::BASIC
+             ? prefs::kDeleteTimePeriodBasic
+             : prefs::kDeleteTimePeriod;
+}
+
 bool GetDeletionPreferenceFromDataType(
     BrowsingDataType data_type,
+    ClearBrowsingDataTab clear_browsing_data_tab,
     std::string* out_pref) {
+  if (clear_browsing_data_tab == ClearBrowsingDataTab::BASIC) {
+    switch (data_type) {
+      case BrowsingDataType::HISTORY:
+        *out_pref = prefs::kDeleteBrowsingHistoryBasic;
+        return true;
+      case BrowsingDataType::CACHE:
+        *out_pref = prefs::kDeleteCacheBasic;
+        return true;
+      case BrowsingDataType::COOKIES:
+        *out_pref = prefs::kDeleteCookiesBasic;
+        return true;
+      default:
+        // This is not a valid type for the basic tab.
+        NOTREACHED();
+        return false;
+    }
+  }
   switch (data_type) {
-    case HISTORY:
+    case BrowsingDataType::HISTORY:
       *out_pref = prefs::kDeleteBrowsingHistory;
       return true;
-    case CACHE:
+    case BrowsingDataType::CACHE:
       *out_pref = prefs::kDeleteCache;
       return true;
-    case COOKIES:
+    case BrowsingDataType::COOKIES:
       *out_pref = prefs::kDeleteCookies;
       return true;
-    case PASSWORDS:
+    case BrowsingDataType::PASSWORDS:
       *out_pref = prefs::kDeletePasswords;
       return true;
-    case FORM_DATA:
+    case BrowsingDataType::FORM_DATA:
       *out_pref = prefs::kDeleteFormData;
       return true;
-    case BOOKMARKS:
+    case BrowsingDataType::BOOKMARKS:
       // Bookmarks are deleted on the Android side. No corresponding deletion
       // preference.
       return false;
-    case NUM_TYPES:
+    case BrowsingDataType::NUM_TYPES:
       // This is not an actual type.
       NOTREACHED();
       return false;
@@ -201,4 +228,18 @@
   return false;
 }
 
+void MigratePreferencesToBasic(PrefService* prefs) {
+  if (!prefs->GetBoolean(prefs::kPreferencesMigratedToBasic)) {
+    prefs->SetBoolean(prefs::kDeleteBrowsingHistoryBasic,
+                      prefs->GetBoolean(prefs::kDeleteBrowsingHistory));
+    prefs->SetBoolean(prefs::kDeleteCacheBasic,
+                      prefs->GetBoolean(prefs::kDeleteCache));
+    prefs->SetBoolean(prefs::kDeleteCookiesBasic,
+                      prefs->GetBoolean(prefs::kDeleteCookies));
+    prefs->SetInteger(prefs::kDeleteTimePeriodBasic,
+                      prefs->GetInteger(prefs::kDeleteTimePeriod));
+    prefs->SetBoolean(prefs::kPreferencesMigratedToBasic, true);
+  }
+}
+
 }  // namespace browsing_data
diff --git a/components/browsing_data/core/browsing_data_utils.h b/components/browsing_data/core/browsing_data_utils.h
index db0d7c2..97cc7b1 100644
--- a/components/browsing_data/core/browsing_data_utils.h
+++ b/components/browsing_data/core/browsing_data_utils.h
@@ -7,6 +7,7 @@
 
 #include "base/strings/string16.h"
 #include "base/time/time.h"
+#include "components/browsing_data/core/clear_browsing_data_tab.h"
 #include "components/browsing_data/core/counters/browsing_data_counter.h"
 
 namespace browsing_data {
@@ -17,7 +18,7 @@
 //
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.browsing_data
-enum BrowsingDataType {
+enum class BrowsingDataType {
   HISTORY,
   CACHE,
   COOKIES,
@@ -31,7 +32,7 @@
 //
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.browsing_data
-enum TimePeriod {
+enum class TimePeriod {
   LAST_HOUR = 0,
   LAST_DAY,
   LAST_WEEK,
@@ -53,14 +54,24 @@
 // Currently this can only be used for counters for which the Result is defined
 // in components/browsing_data/core/counters.
 base::string16 GetCounterTextFromResult(
-    const browsing_data::BrowsingDataCounter::Result* result);
+    const BrowsingDataCounter::Result* result);
+
+// Returns the preference that stores the time period.
+const char* GetTimePeriodPreferenceName(
+    ClearBrowsingDataTab clear_browsing_data_tab);
 
 // Copies the name of the deletion preference corresponding to the given
 // |data_type| to |out_pref|. Returns false if no such preference exists.
 bool GetDeletionPreferenceFromDataType(
     BrowsingDataType data_type,
+    ClearBrowsingDataTab clear_browsing_data_tab,
     std::string* out_pref);
 
+// Copies the deletion preferences for timeperiod, cache, history and cookies
+// to a separate preferences that are used to on the basic CBD tab.
+// This only happens the first time this method is called.
+void MigratePreferencesToBasic(PrefService* prefs);
+
 }  // namespace browsing_data
 
 #endif  // COMPONENTS_BROWSING_DATA_CORE_BROWSING_DATA_UTILS_H_
diff --git a/components/browsing_data/core/browsing_data_utils_unittest.cc b/components/browsing_data/core/browsing_data_utils_unittest.cc
index eaad13b4b..bd22d28 100644
--- a/components/browsing_data/core/browsing_data_utils_unittest.cc
+++ b/components/browsing_data/core/browsing_data_utils_unittest.cc
@@ -12,6 +12,9 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/browsing_data/core/counters/autofill_counter.h"
+#include "components/browsing_data/core/pref_names.h"
+#include "components/prefs/pref_service.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -33,8 +36,15 @@
   BrowsingDataUtilsTest() {}
   ~BrowsingDataUtilsTest() override {}
 
+  void SetUp() override {
+    browsing_data::prefs::RegisterBrowserUserPrefs(prefs_.registry());
+  }
+
+  PrefService* prefs() { return &prefs_; }
+
  private:
   base::MessageLoop loop_;
+  sync_preferences::TestingPrefServiceSyncable prefs_;
 };
 
 // Tests the complex output of the Autofill counter.
@@ -77,3 +87,32 @@
     EXPECT_EQ(output, base::ASCIIToUTF16(test_case.expected_output));
   }
 }
+
+TEST_F(BrowsingDataUtilsTest, MigratePreferencesToBasic) {
+  using namespace browsing_data::prefs;
+
+  prefs()->SetBoolean(kDeleteBrowsingHistory, true);
+  prefs()->SetBoolean(kDeleteCookies, false);
+  prefs()->SetBoolean(kDeleteCache, false);
+  prefs()->SetInteger(kDeleteTimePeriod, 42);
+
+  // History, cookies and cache should be migrated to their basic counterpart.
+  browsing_data::MigratePreferencesToBasic(prefs());
+  EXPECT_TRUE(prefs()->GetBoolean(kDeleteBrowsingHistoryBasic));
+  EXPECT_FALSE(prefs()->GetBoolean(kDeleteCookiesBasic));
+  EXPECT_FALSE(prefs()->GetBoolean(kDeleteCacheBasic));
+  EXPECT_EQ(42, prefs()->GetInteger(kDeleteTimePeriodBasic));
+
+  prefs()->SetBoolean(kDeleteBrowsingHistory, true);
+  prefs()->SetBoolean(kDeleteCookies, true);
+  prefs()->SetBoolean(kDeleteCache, true);
+  prefs()->SetInteger(kDeleteTimePeriod, 100);
+
+  // After the first migration all settings should stay the same if the
+  // migration is executed again.
+  browsing_data::MigratePreferencesToBasic(prefs());
+  EXPECT_TRUE(prefs()->GetBoolean(kDeleteBrowsingHistoryBasic));
+  EXPECT_FALSE(prefs()->GetBoolean(kDeleteCookiesBasic));
+  EXPECT_FALSE(prefs()->GetBoolean(kDeleteCacheBasic));
+  EXPECT_EQ(42, prefs()->GetInteger(kDeleteTimePeriodBasic));
+}
diff --git a/components/browsing_data/core/clear_browsing_data_tab.h b/components/browsing_data/core/clear_browsing_data_tab.h
new file mode 100644
index 0000000..c6c0b5bc
--- /dev/null
+++ b/components/browsing_data/core/clear_browsing_data_tab.h
@@ -0,0 +1,21 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_BROWSING_DATA_CORE_CLEAR_BROWSING_DATA_TAB_H_
+#define COMPONENTS_BROWSING_DATA_CORE_CLEAR_BROWSING_DATA_TAB_H_
+
+namespace browsing_data {
+
+// This enum is used to differentiate CBD preferences from the basic and
+// advanced tab and manage their state separately. It is important that all
+// preferences and the timeperiod selection have the same type. The default
+// value for dialogs without separate tabs is advanced.
+//
+// A Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.browsing_data
+enum class ClearBrowsingDataTab { BASIC, ADVANCED, NUM_TYPES };
+
+}  // namespace browsing_data
+
+#endif  // COMPONENTS_BROWSING_DATA_CORE_CLEAR_BROWSING_DATA_TAB_H_
diff --git a/components/browsing_data/core/counters/browsing_data_counter.cc b/components/browsing_data/core/counters/browsing_data_counter.cc
index af4fcc9..48a8018 100644
--- a/components/browsing_data/core/counters/browsing_data_counter.cc
+++ b/components/browsing_data/core/counters/browsing_data_counter.cc
@@ -25,14 +25,15 @@
 BrowsingDataCounter::~BrowsingDataCounter() {}
 
 void BrowsingDataCounter::Init(PrefService* pref_service,
+                               ClearBrowsingDataTab clear_browsing_data_tab,
                                const Callback& callback) {
   DCHECK(!initialized_);
   callback_ = callback;
-  pref_service_ = pref_service;
-  pref_.Init(GetPrefName(), pref_service_,
+  clear_browsing_data_tab_ = clear_browsing_data_tab;
+  pref_.Init(GetPrefName(), pref_service,
              base::Bind(&BrowsingDataCounter::Restart, base::Unretained(this)));
   period_.Init(
-      browsing_data::prefs::kDeleteTimePeriod, pref_service_,
+      GetTimePeriodPreferenceName(GetTab()), pref_service,
       base::Bind(&BrowsingDataCounter::Restart, base::Unretained(this)));
 
   initialized_ = true;
@@ -104,8 +105,8 @@
   return state_transitions_;
 }
 
-PrefService* BrowsingDataCounter::GetPrefs() const {
-  return pref_service_;
+ClearBrowsingDataTab BrowsingDataCounter::GetTab() const {
+  return clear_browsing_data_tab_;
 }
 
 void BrowsingDataCounter::TransitionToShowCalculating() {
diff --git a/components/browsing_data/core/counters/browsing_data_counter.h b/components/browsing_data/core/counters/browsing_data_counter.h
index 529d24e8..d7fbb95 100644
--- a/components/browsing_data/core/counters/browsing_data_counter.h
+++ b/components/browsing_data/core/counters/browsing_data_counter.h
@@ -13,6 +13,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/timer/timer.h"
+#include "components/browsing_data/core/clear_browsing_data_tab.h"
 #include "components/prefs/pref_member.h"
 
 class PrefService;
@@ -85,15 +86,13 @@
   virtual ~BrowsingDataCounter();
 
   // Should be called once to initialize this class.
-  void Init(PrefService* pref_service, const Callback& callback);
+  void Init(PrefService* pref_service,
+            ClearBrowsingDataTab clear_browsing_data_tab,
+            const Callback& callback);
 
   // Name of the preference associated with this counter.
   virtual const char* GetPrefName() const = 0;
 
-  // PrefService that manages the preferences for the user profile
-  // associated with this counter.
-  PrefService* GetPrefs() const;
-
   // Restarts the counter. Will be called automatically if the counting needs
   // to be restarted, e.g. when the deletion preference changes state or when
   // we are notified of data changes.
@@ -121,6 +120,10 @@
   // Calculates the beginning of the counting period as |period_| before now.
   base::Time GetPeriodStart();
 
+  // Returns if this counter belongs to a preference on the default, basic or
+  // advanced CBD tab.
+  ClearBrowsingDataTab GetTab() const;
+
  private:
   // Called after the class is initialized by calling |Init|.
   virtual void OnInitialized();
@@ -132,9 +135,8 @@
   void TransitionToShowCalculating();
   void TransitionToReadyToReportResult();
 
-  // Pointer to the PrefService that manages the preferences for the user
-  // profile associated with this counter.
-  PrefService* pref_service_;
+  // Indicates if this counter belongs to a preference on the basic CBD tab.
+  ClearBrowsingDataTab clear_browsing_data_tab_;
 
   // The callback that will be called when the UI should be updated with a new
   // counter value.
diff --git a/components/browsing_data/core/counters/browsing_data_counter_unittest.cc b/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
index e7455b3..370a5a8 100644
--- a/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
+++ b/components/browsing_data/core/counters/browsing_data_counter_unittest.cc
@@ -87,7 +87,9 @@
     pref_service_->registry()->RegisterIntegerPref(prefs::kDeleteTimePeriod, 0);
 
     counter_.reset(new MockBrowsingDataCounter());
-    counter_->Init(pref_service_.get(), base::Bind(&IgnoreResult));
+    counter_->Init(pref_service_.get(),
+                   browsing_data::ClearBrowsingDataTab::ADVANCED,
+                   base::Bind(&IgnoreResult));
   }
 
   void TearDown() override {
diff --git a/components/browsing_data/core/counters/history_counter.cc b/components/browsing_data/core/counters/history_counter.cc
index daf8010..6fcb1c17e 100644
--- a/components/browsing_data/core/counters/history_counter.cc
+++ b/components/browsing_data/core/counters/history_counter.cc
@@ -46,7 +46,9 @@
 }
 
 const char* HistoryCounter::GetPrefName() const {
-  return browsing_data::prefs::kDeleteBrowsingHistory;
+  return GetTab() == ClearBrowsingDataTab::BASIC
+             ? browsing_data::prefs::kDeleteBrowsingHistoryBasic
+             : browsing_data::prefs::kDeleteBrowsingHistory;
 }
 
 void HistoryCounter::Count() {
diff --git a/components/browsing_data/core/pref_names.cc b/components/browsing_data/core/pref_names.cc
index 87a39cb..59113a8 100644
--- a/components/browsing_data/core/pref_names.cc
+++ b/components/browsing_data/core/pref_names.cc
@@ -12,12 +12,17 @@
 
 // Clear browsing data deletion time period.
 const char kDeleteTimePeriod[] = "browser.clear_data.time_period";
+const char kDeleteTimePeriodBasic[] = "browser.clear_data.time_period_basic";
 
 // Clear Browsing Data dialog datatype preferences.
 const char kDeleteBrowsingHistory[] = "browser.clear_data.browsing_history";
+const char kDeleteBrowsingHistoryBasic[] =
+    "browser.clear_data.browsing_history_basic";
 const char kDeleteDownloadHistory[] = "browser.clear_data.download_history";
 const char kDeleteCache[] = "browser.clear_data.cache";
+const char kDeleteCacheBasic[] = "browser.clear_data.cache_basic";
 const char kDeleteCookies[] = "browser.clear_data.cookies";
+const char kDeleteCookiesBasic[] = "browser.clear_data.cookies_basic";
 const char kDeletePasswords[] = "browser.clear_data.passwords";
 const char kDeleteFormData[] = "browser.clear_data.form_data";
 const char kDeleteHostedAppsData[] = "browser.clear_data.hosted_apps_data";
@@ -29,26 +34,35 @@
 const char kClearBrowsingDataHistoryNoticeShownTimes[] =
   "browser.clear_data.history_notice_shown_times";
 const char kLastClearBrowsingDataTab[] = "browser.last_clear_browsing_data_tab";
+const char kPreferencesMigratedToBasic[] =
+    "browser.clear_data.preferences_migrated_to_basic";
 
 void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry) {
   registry->RegisterIntegerPref(
       kDeleteTimePeriod, 0,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+  registry->RegisterIntegerPref(
+      kDeleteTimePeriodBasic, 0,
+      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterBooleanPref(
       kDeleteBrowsingHistory, true,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      kDeleteCache, true,
+      kDeleteBrowsingHistoryBasic, true,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      kDeleteCookies, true,
+      kDeleteCache, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+  registry->RegisterBooleanPref(
+      kDeleteCacheBasic, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+  registry->RegisterBooleanPref(
+      kDeleteCookies, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+  registry->RegisterBooleanPref(
+      kDeleteCookiesBasic, true,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      kDeletePasswords, false,
-      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+      kDeletePasswords, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterBooleanPref(
-      kDeleteFormData, false,
-      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+      kDeleteFormData, false, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterIntegerPref(
       kClearBrowsingDataHistoryNoticeShownTimes, 0);
 
@@ -70,6 +84,10 @@
       kLastClearBrowsingDataTab, 0,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
 #endif
+
+  registry->RegisterBooleanPref(
+      kPreferencesMigratedToBasic, false,
+      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
 }
 
 }  // namespace prefs
diff --git a/components/browsing_data/core/pref_names.h b/components/browsing_data/core/pref_names.h
index 560948e..a8af566 100644
--- a/components/browsing_data/core/pref_names.h
+++ b/components/browsing_data/core/pref_names.h
@@ -14,11 +14,15 @@
 namespace prefs {
 
 extern const char kDeleteTimePeriod[];
+extern const char kDeleteTimePeriodBasic[];
 
 extern const char kDeleteBrowsingHistory[];
+extern const char kDeleteBrowsingHistoryBasic[];
 extern const char kDeleteDownloadHistory[];
 extern const char kDeleteCache[];
+extern const char kDeleteCacheBasic[];
 extern const char kDeleteCookies[];
+extern const char kDeleteCookiesBasic[];
 extern const char kDeletePasswords[];
 extern const char kDeleteFormData[];
 extern const char kDeleteHostedAppsData[];
@@ -28,6 +32,7 @@
 extern const char kClearBrowsingDataHistoryNoticeShownTimes[];
 
 extern const char kLastClearBrowsingDataTab[];
+extern const char kPreferencesMigratedToBasic[];
 
 // Registers the Clear Browsing Data UI prefs.
 void RegisterBrowserUserPrefs(user_prefs::PrefRegistrySyncable* registry);
diff --git a/components/doodle/doodle_fetcher.h b/components/doodle/doodle_fetcher.h
index f5ef780..e7a5d26 100644
--- a/components/doodle/doodle_fetcher.h
+++ b/components/doodle/doodle_fetcher.h
@@ -9,6 +9,10 @@
 #include "base/optional.h"
 #include "components/doodle/doodle_types.h"
 
+namespace base {
+class TimeDelta;
+}
+
 namespace doodle {
 
 // Interface for fetching the current doodle from the network.
@@ -19,9 +23,11 @@
 class DoodleFetcher {
  public:
   // Callback that is invoked when the fetching is done.
-  // |doodle_config| will only contain a value if |state| is AVAILABLE.
+  // |time_to_live| will only be meaningful, and |doodle_config| will only
+  // contain a value, if |state| is AVAILABLE.
   using FinishedCallback = base::OnceCallback<void(
       DoodleState state,
+      base::TimeDelta time_to_live,
       const base::Optional<DoodleConfig>& doodle_config)>;
 
   virtual ~DoodleFetcher() = default;
diff --git a/components/doodle/doodle_fetcher_impl.cc b/components/doodle/doodle_fetcher_impl.cc
index f7954a4..2d37cf5a 100644
--- a/components/doodle/doodle_fetcher_impl.cc
+++ b/components/doodle/doodle_fetcher_impl.cc
@@ -112,7 +112,8 @@
   if (!(source->GetStatus().is_success() &&
         source->GetResponseCode() == net::HTTP_OK &&
         source->GetResponseAsString(&json_string))) {
-    RespondToAllCallbacks(DoodleState::DOWNLOAD_ERROR, base::nullopt);
+    RespondToAllCallbacks(DoodleState::DOWNLOAD_ERROR, base::TimeDelta(),
+                          base::nullopt);
     return;
   }
 
@@ -128,43 +129,51 @@
       base::DictionaryValue::From(std::move(json));
   if (!config.get()) {
     DLOG(WARNING) << "Doodle JSON is not valid.";
-    RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::nullopt);
+    RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::TimeDelta(),
+                          base::nullopt);
     return;
   }
 
   const base::DictionaryValue* ddljson = nullptr;
   if (!config->GetDictionary("ddljson", &ddljson)) {
     DLOG(WARNING) << "Doodle JSON response did not contain 'ddljson' key.";
-    RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::nullopt);
+    RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::TimeDelta(),
+                          base::nullopt);
     return;
   }
 
-  base::Optional<DoodleConfig> doodle = ParseDoodle(*ddljson);
+  base::TimeDelta time_to_live;
+  base::Optional<DoodleConfig> doodle =
+      ParseDoodleConfigAndTimeToLive(*ddljson, &time_to_live);
   if (!doodle.has_value()) {
-    RespondToAllCallbacks(DoodleState::NO_DOODLE, base::nullopt);
+    RespondToAllCallbacks(DoodleState::NO_DOODLE, base::TimeDelta(),
+                          base::nullopt);
     return;
   }
 
-  RespondToAllCallbacks(DoodleState::AVAILABLE, std::move(doodle));
+  RespondToAllCallbacks(DoodleState::AVAILABLE, time_to_live,
+                        std::move(doodle));
 }
 
 void DoodleFetcherImpl::OnJsonParseFailed(const std::string& error_message) {
   DLOG(WARNING) << "JSON parsing failed: " << error_message;
-  RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::nullopt);
+  RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::TimeDelta(),
+                        base::nullopt);
 }
 
-base::Optional<DoodleConfig> DoodleFetcherImpl::ParseDoodle(
-    const base::DictionaryValue& ddljson) const {
+base::Optional<DoodleConfig> DoodleFetcherImpl::ParseDoodleConfigAndTimeToLive(
+    const base::DictionaryValue& ddljson,
+    base::TimeDelta* time_to_live) const {
   DoodleConfig doodle;
   // The |large_image| field is required (it's the "default" representation for
   // the doodle).
   if (!ParseImage(ddljson, "large_image", &doodle.large_image)) {
     return base::nullopt;
   }
+  ParseBaseInformation(ddljson, &doodle, time_to_live);
   ParseImage(ddljson, "transparent_large_image",
              &doodle.transparent_large_image);
   ParseImage(ddljson, "large_cta_image", &doodle.large_cta_image);
-  ParseBaseInformation(ddljson, &doodle);
   return doodle;
 }
 
@@ -190,7 +199,8 @@
 
 void DoodleFetcherImpl::ParseBaseInformation(
     const base::DictionaryValue& ddljson,
-    DoodleConfig* config) const {
+    DoodleConfig* config,
+    base::TimeDelta* time_to_live) const {
   config->search_url = ParseRelativeUrl(ddljson, "search_url");
   config->target_url = ParseRelativeUrl(ddljson, "target_url");
   config->fullpage_interactive_url =
@@ -211,7 +221,7 @@
     ttl = kMaxTimeToLiveMS;
     DLOG(WARNING) << "Clamping Doodle TTL to 30 days!";
   }
-  config->time_to_live = base::TimeDelta::FromMillisecondsD(ttl);
+  *time_to_live = base::TimeDelta::FromMillisecondsD(ttl);
 }
 
 GURL DoodleFetcherImpl::ParseRelativeUrl(
@@ -227,9 +237,10 @@
 
 void DoodleFetcherImpl::RespondToAllCallbacks(
     DoodleState state,
+    base::TimeDelta time_to_live,
     const base::Optional<DoodleConfig>& config) {
   for (auto& callback : callbacks_) {
-    std::move(callback).Run(state, config);
+    std::move(callback).Run(state, time_to_live, config);
   }
   callbacks_.clear();
 }
diff --git a/components/doodle/doodle_fetcher_impl.h b/components/doodle/doodle_fetcher_impl.h
index 3f3eb19a..ad38992 100644
--- a/components/doodle/doodle_fetcher_impl.h
+++ b/components/doodle/doodle_fetcher_impl.h
@@ -25,6 +25,7 @@
 
 namespace base {
 class DictionaryValue;
+class TimeDelta;
 class Value;
 }
 
@@ -62,18 +63,23 @@
   // ParseJSONCallback Failure callback
   void OnJsonParseFailed(const std::string& error_message);
 
-  base::Optional<DoodleConfig> ParseDoodle(
-      const base::DictionaryValue& ddljson) const;
+  base::Optional<DoodleConfig> ParseDoodleConfigAndTimeToLive(
+      const base::DictionaryValue& ddljson,
+      base::TimeDelta* time_to_live) const;
+
   bool ParseImage(const base::DictionaryValue& image_dict,
                   const std::string& image_name,
                   DoodleImage* image) const;
   void ParseBaseInformation(const base::DictionaryValue& ddljson,
-                            DoodleConfig* config) const;
+                            DoodleConfig* config,
+                            base::TimeDelta* time_to_live) const;
   GURL ParseRelativeUrl(const base::DictionaryValue& dict_value,
                         const std::string& key) const;
 
   void RespondToAllCallbacks(DoodleState state,
+                             base::TimeDelta time_to_live,
                              const base::Optional<DoodleConfig>& config);
+
   GURL GetGoogleBaseUrl() const;
 
   // Returns whether a fetch is still in progress. A fetch begins when a
diff --git a/components/doodle/doodle_fetcher_impl_unittest.cc b/components/doodle/doodle_fetcher_impl_unittest.cc
index 785936d..939b7b8 100644
--- a/components/doodle/doodle_fetcher_impl_unittest.cc
+++ b/components/doodle/doodle_fetcher_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/json/json_reader.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
+#include "base/time/time.h"
 #include "base/values.h"
 #include "components/google/core/browser/google_switches.h"
 #include "components/google/core/browser/google_url_tracker.h"
@@ -106,20 +107,27 @@
     return url_fetcher;
   }
 
+  // TODO(treib): Replace with a MockCallback plus testing::SaveArgs?
   DoodleFetcherImpl::FinishedCallback CreateResponseSavingCallback(
       DoodleState* state_out,
+      base::TimeDelta* time_to_live_out,
       base::Optional<DoodleConfig>* config_out) {
     return base::BindOnce(
-        [](DoodleState* state_out, base::Optional<DoodleConfig>* config_out,
-           DoodleState state, const base::Optional<DoodleConfig>& config) {
+        [](DoodleState* state_out, base::TimeDelta* time_to_live_out,
+           base::Optional<DoodleConfig>* config_out, DoodleState state,
+           base::TimeDelta time_to_live,
+           const base::Optional<DoodleConfig>& config) {
           if (state_out) {
             *state_out = state;
           }
+          if (time_to_live_out) {
+            *time_to_live_out = time_to_live;
+          }
           if (config_out) {
             *config_out = config;
           }
         },
-        state_out, config_out);
+        state_out, time_to_live_out, config_out);
   }
 
   DoodleFetcherImpl* doodle_fetcher() { return &doodle_fetcher_; }
@@ -139,7 +147,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithData(R"json({"ddljson": {
         "time_to_live_ms":55000,
         "large_image": {"url":"/logos/doodles/2015/some.gif"}
@@ -154,7 +162,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithError(net::ERR_FILE_NOT_FOUND);
 
   EXPECT_THAT(state, Eq(DoodleState::DOWNLOAD_ERROR));
@@ -166,7 +174,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithData("}");
 
   EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR));
@@ -178,7 +186,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithData("{}");
 
   EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR));
@@ -187,10 +195,11 @@
 
 TEST_F(DoodleFetcherImplTest, ResponseContainsValidBaseInformation) {
   DoodleState state(DoodleState::NO_DOODLE);
+  base::TimeDelta time_to_live;
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, &time_to_live, &response));
   RespondWithData(R"json()]}'{
       "ddljson": {
         "alt_text":"Mouseover Text",
@@ -220,59 +229,59 @@
   EXPECT_THAT(config.interactive_html,
               Eq("\u003cstyle\u003e\u003c/style\u003e"));
 
-  EXPECT_THAT(config.time_to_live,
-              Eq(base::TimeDelta::FromMilliseconds(55000)));
+  EXPECT_THAT(time_to_live, Eq(base::TimeDelta::FromMilliseconds(55000)));
 }
 
 TEST_F(DoodleFetcherImplTest, DoodleExpiresWithinThirtyDaysForTooLargeTTL) {
   DoodleState state(DoodleState::NO_DOODLE);
+  base::TimeDelta time_to_live;
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, &time_to_live, &response));
   RespondWithData(R"json({"ddljson": {
       "time_to_live_ms":5184000000,
       "large_image": {"url":"/logos/doodles/2015/some.gif"}
     }})json");  // 60 days
 
   EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
-  ASSERT_TRUE(response.has_value());
-  EXPECT_THAT(response.value().time_to_live,
+  EXPECT_TRUE(response.has_value());
+  EXPECT_THAT(time_to_live,
               Eq(base::TimeDelta::FromMilliseconds(30ul * 24 * 60 * 60 *
                                                    1000)));  // 30 days
 }
 
 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithNegativeTTL) {
   DoodleState state(DoodleState::NO_DOODLE);
+  base::TimeDelta time_to_live;
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, &time_to_live, &response));
   RespondWithData(R"json({"ddljson": {
       "time_to_live_ms":-1,
       "large_image": {"url":"/logos/doodles/2015/some.gif"}
     }})json");
 
   EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
-  ASSERT_TRUE(response.has_value());
-  EXPECT_THAT(response.value().time_to_live,
-              Eq(base::TimeDelta::FromMilliseconds(0)));
+  EXPECT_TRUE(response.has_value());
+  EXPECT_THAT(time_to_live, Eq(base::TimeDelta::FromMilliseconds(0)));
 }
 
 TEST_F(DoodleFetcherImplTest, DoodleExpiresImmediatelyWithoutValidTTL) {
   DoodleState state(DoodleState::NO_DOODLE);
+  base::TimeDelta time_to_live;
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, &time_to_live, &response));
   RespondWithData(R"json({"ddljson": {
         "large_image": {"url":"/logos/doodles/2015/some.gif"}
       }})json");
 
   EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
-  ASSERT_TRUE(response.has_value());
-  EXPECT_THAT(response.value().time_to_live,
-              Eq(base::TimeDelta::FromMilliseconds(0)));
+  EXPECT_TRUE(response.has_value());
+  EXPECT_THAT(time_to_live, Eq(base::TimeDelta::FromMilliseconds(0)));
 }
 
 TEST_F(DoodleFetcherImplTest, ReturnsNoDoodleForMissingLargeImageUrl) {
@@ -280,7 +289,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithData(R"json({"ddljson": {
         "time_to_live_ms":55000,
         "large_image": {}
@@ -295,7 +304,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithData("{\"ddljson\":{}}");
 
   EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE));
@@ -307,7 +316,7 @@
   base::Optional<DoodleConfig> response;
 
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state, &response));
+      CreateResponseSavingCallback(&state, nullptr, &response));
   RespondWithData(R"json()]}'{
       "ddljson": {
         "time_to_live_ms":55000,
@@ -374,10 +383,10 @@
 
   // Trigger two requests.
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state1, &response1));
+      CreateResponseSavingCallback(&state1, nullptr, &response1));
   net::URLFetcher* first_created_fetcher = GetRunningFetcher();
   doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(&state2, &response2));
+      CreateResponseSavingCallback(&state2, nullptr, &response2));
   net::URLFetcher* second_created_fetcher = GetRunningFetcher();
 
   // Expect that only one fetcher handles both requests.
@@ -396,8 +405,8 @@
 }
 
 TEST_F(DoodleFetcherImplTest, ReceivesBaseUrlFromTracker) {
-  doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr));
+  doodle_fetcher()->FetchDoodle(CreateResponseSavingCallback(
+      /*state=*/nullptr, nullptr, /*response=*/nullptr));
 
   EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(),
               Eq(GetGoogleBaseURL().Resolve(kDoodleConfigPath)));
@@ -407,8 +416,8 @@
   base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
       switches::kGoogleBaseURL, "http://www.google.kz");
 
-  doodle_fetcher()->FetchDoodle(
-      CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr));
+  doodle_fetcher()->FetchDoodle(CreateResponseSavingCallback(
+      /*state=*/nullptr, nullptr, /*response=*/nullptr));
 
   EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(),
               Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath)));
diff --git a/components/doodle/doodle_service.cc b/components/doodle/doodle_service.cc
index fee586c..c5cb9137 100644
--- a/components/doodle/doodle_service.cc
+++ b/components/doodle/doodle_service.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/time/time.h"
 
 namespace doodle {
 
@@ -32,30 +33,19 @@
 
 void DoodleService::DoodleFetched(
     DoodleState state,
+    base::TimeDelta time_to_live,
     const base::Optional<DoodleConfig>& doodle_config) {
-  if (!cached_config_.has_value() && !doodle_config.has_value()) {
-    // There was no config before and we didn't get a new one, so there's
-    // nothing to do.
+  // If nothing changed, then there's nothing to do. Note that this checks both
+  // for existence changes as well as changes of the configs themselves.
+  if (cached_config_ == doodle_config) {
+    // TODO(treib): Once we support expiry, update the time to live here.
     return;
   }
 
-  bool notify = false;
-  if (cached_config_.has_value() != doodle_config.has_value()) {
-    // We got a new config, or an existing one went away.
-    notify = true;
-  } else {
-    // There was a config both before and after the update. Notify observers
-    // only if something relevant changed.
-    notify = !cached_config_.value().IsEquivalent(doodle_config.value());
-  }
-
-  // In any case, update the cache.
+  // Update the cache and notify observers.
   cached_config_ = doodle_config;
-
-  if (notify) {
-    for (auto& observer : observers_) {
-      observer.OnDoodleConfigUpdated(cached_config_);
-    }
+  for (auto& observer : observers_) {
+    observer.OnDoodleConfigUpdated(cached_config_);
   }
 }
 
diff --git a/components/doodle/doodle_service.h b/components/doodle/doodle_service.h
index 09e1ae1f..f1265e7 100644
--- a/components/doodle/doodle_service.h
+++ b/components/doodle/doodle_service.h
@@ -13,6 +13,10 @@
 #include "components/doodle/doodle_fetcher.h"
 #include "components/doodle/doodle_types.h"
 
+namespace base {
+class TimeDelta;
+}
+
 namespace doodle {
 
 class DoodleService {
@@ -43,6 +47,7 @@
 
  private:
   void DoodleFetched(DoodleState state,
+                     base::TimeDelta time_to_live,
                      const base::Optional<DoodleConfig>& doodle_config);
 
   // The fetcher for getting fresh DoodleConfigs from the network.
diff --git a/components/doodle/doodle_service_unittest.cc b/components/doodle/doodle_service_unittest.cc
index 48b3a10..41ebe7d5a 100644
--- a/components/doodle/doodle_service_unittest.cc
+++ b/components/doodle/doodle_service_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
+#include "base/time/time.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -32,9 +33,10 @@
   size_t num_pending_callbacks() const { return callbacks_.size(); }
 
   void ServeAllCallbacks(DoodleState state,
+                         base::TimeDelta time_to_live,
                          const base::Optional<DoodleConfig>& config) {
     for (auto& callback : callbacks_) {
-      std::move(callback).Run(state, config);
+      std::move(callback).Run(state, time_to_live, config);
     }
     callbacks_.clear();
   }
@@ -51,12 +53,6 @@
 
 }  // namespace
 
-// Equality operator for DoodleConfigs, for use by testing::Eq.
-// Note: This must be outside of the anonymous namespace.
-bool operator==(const DoodleConfig& lhs, const DoodleConfig& rhs) {
-  return lhs.IsEquivalent(rhs);
-}
-
 class DoodleServiceTest : public testing::Test {
  public:
   DoodleServiceTest() : fetcher_(nullptr) {
@@ -84,7 +80,8 @@
   // Serve it (with an arbitrary config).
   DoodleConfig config;
   config.doodle_type = DoodleType::SIMPLE;
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), config);
 
   // The config should be available.
   EXPECT_THAT(service()->config(), Eq(config));
@@ -97,8 +94,9 @@
   // Serve it with a different config.
   DoodleConfig other_config;
   other_config.doodle_type = DoodleType::SLIDESHOW;
-  DCHECK(!config.IsEquivalent(other_config));
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, other_config);
+  DCHECK(config != other_config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), other_config);
 
   // The config should have been updated.
   EXPECT_THAT(service()->config(), Eq(other_config));
@@ -119,7 +117,8 @@
   DoodleConfig config;
   config.doodle_type = DoodleType::SIMPLE;
   EXPECT_CALL(observer, OnDoodleConfigUpdated(Eq(config)));
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), config);
 
   // Remove the observer before the service gets destroyed.
   service()->RemoveObserver(&observer);
@@ -130,7 +129,8 @@
   service()->Refresh();
   DoodleConfig config;
   config.doodle_type = DoodleType::SIMPLE;
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), config);
   ASSERT_THAT(service()->config(), Eq(config));
 
   // Register an observer and request a refresh.
@@ -142,7 +142,8 @@
   // Serve the request with an empty doodle config. The observer should get
   // notified.
   EXPECT_CALL(observer, OnDoodleConfigUpdated(Eq(base::nullopt)));
-  fetcher()->ServeAllCallbacks(DoodleState::NO_DOODLE, base::nullopt);
+  fetcher()->ServeAllCallbacks(DoodleState::NO_DOODLE, base::TimeDelta(),
+                               base::nullopt);
 
   // Remove the observer before the service gets destroyed.
   service()->RemoveObserver(&observer);
@@ -153,7 +154,8 @@
   service()->Refresh();
   DoodleConfig config;
   config.doodle_type = DoodleType::SIMPLE;
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), config);
   ASSERT_THAT(service()->config(), Eq(config));
 
   // Register an observer and request a refresh.
@@ -166,9 +168,10 @@
   // notified.
   DoodleConfig other_config;
   other_config.doodle_type = DoodleType::SLIDESHOW;
-  DCHECK(!config.IsEquivalent(other_config));
+  DCHECK(config != other_config);
   EXPECT_CALL(observer, OnDoodleConfigUpdated(Eq(other_config)));
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, other_config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), other_config);
 
   // Remove the observer before the service gets destroyed.
   service()->RemoveObserver(&observer);
@@ -179,7 +182,8 @@
   service()->Refresh();
   DoodleConfig config;
   config.doodle_type = DoodleType::SIMPLE;
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, config);
+  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE,
+                               base::TimeDelta::FromHours(1), config);
   ASSERT_THAT(service()->config(), Eq(config));
 
   // Register an observer and request a refresh.
@@ -192,8 +196,9 @@
   // *not* get notified.
   DoodleConfig equivalent_config;
   equivalent_config.doodle_type = DoodleType::SIMPLE;
-  DCHECK(config.IsEquivalent(equivalent_config));
-  fetcher()->ServeAllCallbacks(DoodleState::AVAILABLE, equivalent_config);
+  DCHECK(config == equivalent_config);
+  fetcher()->ServeAllCallbacks(
+      DoodleState::AVAILABLE, base::TimeDelta::FromHours(1), equivalent_config);
 
   // Remove the observer before the service gets destroyed.
   service()->RemoveObserver(&observer);
diff --git a/components/doodle/doodle_types.cc b/components/doodle/doodle_types.cc
index 7468d2b8..d88221fc 100644
--- a/components/doodle/doodle_types.cc
+++ b/components/doodle/doodle_types.cc
@@ -15,10 +15,7 @@
   return !(*this == other);
 }
 
-bool DoodleConfig::IsEquivalent(const DoodleConfig& other) const {
-  // Note: This compares all fields except for |time_to_live|, which by
-  // definition isn't constant over time, and shouldn't be in DoodleConfig in
-  // the first place.
+bool DoodleConfig::operator==(const DoodleConfig& other) const {
   return doodle_type == other.doodle_type && alt_text == other.alt_text &&
          interactive_html == other.interactive_html &&
          search_url == other.search_url && target_url == other.target_url &&
@@ -28,4 +25,8 @@
          transparent_large_image == other.transparent_large_image;
 }
 
+bool DoodleConfig::operator!=(const DoodleConfig& other) const {
+  return !(*this == other);
+}
+
 }  // namespace doodle
diff --git a/components/doodle/doodle_types.h b/components/doodle/doodle_types.h
index 1317c80..d97b50b 100644
--- a/components/doodle/doodle_types.h
+++ b/components/doodle/doodle_types.h
@@ -5,7 +5,6 @@
 #ifndef COMPONENTS_DOODLE_DOODLE_TYPES_H_
 #define COMPONENTS_DOODLE_DOODLE_TYPES_H_
 
-#include "base/time/time.h"
 #include "url/gurl.h"
 
 namespace doodle {
@@ -52,9 +51,8 @@
   DoodleConfig(const DoodleConfig& config);  // = default;
   ~DoodleConfig();
 
-  // Checks whether this config is "equivalent" to the other. This compares all
-  // fields for equality, except for |expiry_date|.
-  bool IsEquivalent(const DoodleConfig& other) const;
+  bool operator==(const DoodleConfig& other) const;
+  bool operator!=(const DoodleConfig& other) const;
 
   DoodleType doodle_type;
   std::string alt_text;
@@ -68,9 +66,6 @@
   DoodleImage large_cta_image;
   DoodleImage transparent_large_image;
 
-  // TODO(treib,fhorschig): Don't expose this? Clients don't care about it.
-  base::TimeDelta time_to_live;
-
   // Copying and assignment allowed.
 };
 
diff --git a/components/network_session_configurator/network_session_configurator.cc b/components/network_session_configurator/network_session_configurator.cc
index fba5a01..91a2b15 100644
--- a/components/network_session_configurator/network_session_configurator.cc
+++ b/components/network_session_configurator/network_session_configurator.cc
@@ -324,13 +324,6 @@
       GetVariationParam(quic_trial_params, "quic_version"));
 }
 
-bool ShouldEnableServerPushCancelation(
-    const VariationParameters& quic_trial_params) {
-  return base::LowerCaseEqualsASCII(
-      GetVariationParam(quic_trial_params, "enable_server_push_cancellation"),
-      "true");
-}
-
 void ConfigureQuicParams(base::StringPiece quic_trial_group,
                          const VariationParameters& quic_trial_params,
                          bool is_quic_force_disabled,
@@ -342,8 +335,6 @@
       is_quic_force_enabled);
   params->disable_quic_on_timeout_with_open_streams =
       ShouldDisableQuicWhenConnectionTimesOutWithOpenStreams(quic_trial_params);
-  params->enable_server_push_cancellation =
-      ShouldEnableServerPushCancelation(quic_trial_params);
 
   params->enable_quic_alternative_service_with_different_host =
       ShouldQuicEnableAlternativeServicesForDifferentHost(quic_trial_params);
diff --git a/components/network_session_configurator/network_session_configurator_unittest.cc b/components/network_session_configurator/network_session_configurator_unittest.cc
index 4d24564..1832dfd 100644
--- a/components/network_session_configurator/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/network_session_configurator_unittest.cc
@@ -74,7 +74,6 @@
   EXPECT_FALSE(params_.quic_disable_connection_pooling);
   EXPECT_EQ(0.25f, params_.quic_load_server_info_timeout_srtt_multiplier);
   EXPECT_FALSE(params_.quic_enable_connection_racing);
-  EXPECT_FALSE(params_.enable_server_push_cancellation);
   EXPECT_FALSE(params_.quic_enable_non_blocking_io);
   EXPECT_FALSE(params_.quic_disable_disk_cache);
   EXPECT_FALSE(params_.quic_prefer_aes);
@@ -211,17 +210,6 @@
   EXPECT_TRUE(params_.quic_race_cert_verification);
 }
 
-TEST_F(NetworkSessionConfiguratorTest, EnableServerPushCancellation) {
-  std::map<std::string, std::string> field_trial_params;
-  field_trial_params["enable_server_push_cancellation"] = "true";
-  variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
-  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
-
-  ParseFieldTrials();
-
-  EXPECT_TRUE(params_.enable_server_push_cancellation);
-}
-
 TEST_F(NetworkSessionConfiguratorTest, QuicDoNotFragment) {
   std::map<std::string, std::string> field_trial_params;
   field_trial_params["do_not_fragment"] = "true";
diff --git a/components/ntp_tiles/icon_cacher.h b/components/ntp_tiles/icon_cacher.h
index e7456fd..bfea296 100644
--- a/components/ntp_tiles/icon_cacher.h
+++ b/components/ntp_tiles/icon_cacher.h
@@ -20,10 +20,10 @@
  public:
   virtual ~IconCacher() = default;
 
-  // Fetches the icon if necessary. It invokes |icon_available| if a new icon
-  // was fetched. This is the only required callback.
+  // Fetches the icon if necessary. If a new icon was fetched, the optional
+  // |icon_available| callback will be invoked.
   // If there are preliminary icons (e.g. provided by static resources), the
-  // |preliminary_icon_available| callback will be invoked additionally.
+  // optional |preliminary_icon_available| callback will be invoked in addition.
   // TODO(fhorschig): In case we keep these, make them OnceClosures.
   virtual void StartFetch(PopularSites::Site site,
                           const base::Closure& icon_available,
diff --git a/components/ntp_tiles/icon_cacher_impl.cc b/components/ntp_tiles/icon_cacher_impl.cc
index aa4e911..6c7076f8 100644
--- a/components/ntp_tiles/icon_cacher_impl.cc
+++ b/components/ntp_tiles/icon_cacher_impl.cc
@@ -49,7 +49,6 @@
     PopularSites::Site site,
     const base::Closure& icon_available,
     const base::Closure& preliminary_icon_available) {
-  DCHECK(!icon_available.is_null());
   favicon::GetFaviconImageForPageURL(
       favicon_service_, site.url, IconType(site),
       base::Bind(&IconCacherImpl::OnGetFaviconImageForPageURLFinished,
@@ -85,7 +84,9 @@
   }
 
   SaveIconForSite(site, fetched_image);
-  icon_available.Run();
+  if (icon_available) {
+    icon_available.Run();
+  }
 }
 
 void IconCacherImpl::SaveIconForSite(const PopularSites::Site& site,
diff --git a/components/ntp_tiles/icon_cacher_impl_unittest.cc b/components/ntp_tiles/icon_cacher_impl_unittest.cc
index 721aa00..bab8c30 100644
--- a/components/ntp_tiles/icon_cacher_impl_unittest.cc
+++ b/components/ntp_tiles/icon_cacher_impl_unittest.cc
@@ -275,6 +275,16 @@
   EXPECT_FALSE(IconIsCachedFor(site_.url, favicon_base::TOUCH_ICON));
 }
 
+TEST_F(IconCacherTest, HandlesEmptyCallbacksNicely) {
+  EXPECT_CALL(*image_fetcher_, SetDataUseServiceName(_));
+  EXPECT_CALL(*image_fetcher_, SetDesiredImageFrameSize(_));
+  ON_CALL(*image_fetcher_, StartOrQueueNetworkRequest(_, _, _))
+      .WillByDefault(PassFetch(128, 128));
+  IconCacherImpl cacher(&favicon_service_, std::move(image_fetcher_));
+  cacher.StartFetch(site_, base::Closure(), base::Closure());
+  WaitForTasksToFinish();
+}
+
 TEST_F(IconCacherTest, ProvidesDefaultIconAndSucceedsWithFetching) {
   // We are not interested which delegate function actually handles the call to
   // |GetNativeImageNamed| as long as we receive the right image.
diff --git a/components/omnibox/browser/in_memory_url_index_types.h b/components/omnibox/browser/in_memory_url_index_types.h
index 6d38a79f..d3e656c 100644
--- a/components/omnibox/browser/in_memory_url_index_types.h
+++ b/components/omnibox/browser/in_memory_url_index_types.h
@@ -8,9 +8,9 @@
 #include <stddef.h>
 
 #include <map>
-#include <set>
 #include <vector>
 
+#include "base/containers/flat_set.h"
 #include "base/containers/hash_tables.h"
 #include "base/strings/string16.h"
 #include "components/history/core/browser/history_types.h"
@@ -69,8 +69,8 @@
 // Convenience Types -----------------------------------------------------------
 
 typedef std::vector<base::string16> String16Vector;
-typedef std::set<base::string16> String16Set;
-typedef std::set<base::char16> Char16Set;
+typedef base::flat_set<base::string16> String16Set;
+typedef base::flat_set<base::char16> Char16Set;
 typedef std::vector<base::char16> Char16Vector;
 
 // A vector that contains the offsets at which each word starts within a string.
@@ -131,12 +131,12 @@
 typedef std::map<base::string16, WordID> WordMap;
 
 // A map from character to the word_ids of words containing that character.
-typedef std::set<WordID> WordIDSet;  // An index into the WordList.
+typedef base::flat_set<WordID> WordIDSet;  // An index into the WordList.
 typedef std::map<base::char16, WordIDSet> CharWordIDMap;
 
 // A map from word (by word_id) to history items containing that word.
 typedef history::URLID HistoryID;
-typedef std::set<HistoryID> HistoryIDSet;
+typedef base::flat_set<HistoryID> HistoryIDSet;
 typedef std::vector<HistoryID> HistoryIDVector;
 typedef std::map<WordID, HistoryIDSet> WordIDHistoryMap;
 typedef std::map<HistoryID, WordIDSet> HistoryIDWordMap;
diff --git a/components/omnibox/browser/url_index_private_data.cc b/components/omnibox/browser/url_index_private_data.cc
index e410239..63b41107 100644
--- a/components/omnibox/browser/url_index_private_data.cc
+++ b/components/omnibox/browser/url_index_private_data.cc
@@ -483,12 +483,10 @@
   // TODO(dyaroshev): write a generic algorithm(crbug.com/696167).
   for (String16Vector::iterator iter = words.begin(); iter != words.end();
        ++iter) {
-    base::string16 uni_word = *iter;
-    HistoryIDSet term_history_set = HistoryIDsForTerm(uni_word);
-    if (term_history_set.empty()) {
-      history_ids.clear();
-      break;
-    }
+    HistoryIDSet term_history_set = HistoryIDsForTerm(*iter);
+    if (term_history_set.empty())
+      return HistoryIDVector();
+
     if (iter == words.begin()) {
       history_ids = {term_history_set.begin(), term_history_set.end()};
     } else {
@@ -588,28 +586,30 @@
 
     // We must filter the word list because the resulting word set surely
     // contains words which do not have the search term as a proper subset.
-    for (WordIDSet::iterator word_set_iter = word_id_set.begin();
-         word_set_iter != word_id_set.end(); ) {
-      if (word_list_[*word_set_iter].find(term) == base::string16::npos)
-        word_set_iter = word_id_set.erase(word_set_iter);
-      else
-        ++word_set_iter;
-    }
+    word_id_set.erase(std::remove_if(word_id_set.begin(), word_id_set.end(),
+                                     [&](WordID word_id) {
+                                       return word_list_[word_id].find(term) ==
+                                              base::string16::npos;
+                                     }),
+                      word_id_set.end());
   } else {
     word_id_set = WordIDSetForTermChars(Char16SetFromString16(term));
   }
 
   // If any words resulted then we can compose a set of history IDs by unioning
   // the sets from each word.
-  HistoryIDSet history_id_set;
+  // We use |buffer| because it's more efficient to collect everything and then
+  // construct a flat_set than to insert elements one by one.
+  HistoryIDVector buffer;
   for (WordID word_id : word_id_set) {
     WordIDHistoryMap::iterator word_iter = word_id_history_map_.find(word_id);
     if (word_iter != word_id_history_map_.end()) {
       HistoryIDSet& word_history_id_set(word_iter->second);
-      history_id_set.insert(word_history_id_set.begin(),
-                            word_history_id_set.end());
+      buffer.insert(buffer.end(), word_history_id_set.begin(),
+                    word_history_id_set.end());
     }
   }
+  HistoryIDSet history_id_set(buffer.begin(), buffer.end());
 
   // Record a new cache entry for this word if the term is longer than
   // a single character.
@@ -627,24 +627,19 @@
   for (Char16Set::const_iterator c_iter = term_chars.begin();
        c_iter != term_chars.end(); ++c_iter) {
     CharWordIDMap::iterator char_iter = char_word_map_.find(*c_iter);
-    if (char_iter == char_word_map_.end()) {
-      // A character was not found so there are no matching results: bail.
-      word_id_set.clear();
-      break;
-    }
-    WordIDSet& char_word_id_set(char_iter->second);
+    // A character was not found so there are no matching results: bail.
+    if (char_iter == char_word_map_.end())
+      return WordIDSet();
+
+    const WordIDSet& char_word_id_set(char_iter->second);
     // It is possible for there to no longer be any words associated with
     // a particular character. Give up in that case.
-    if (char_word_id_set.empty()) {
-      word_id_set.clear();
-      break;
-    }
+    if (char_word_id_set.empty())
+      return WordIDSet();
 
     if (c_iter == term_chars.begin()) {
-      // First character results becomes base set of results.
       word_id_set = char_word_id_set;
     } else {
-      // Subsequent character results get intersected in.
       word_id_set =
           base::STLSetIntersection<WordIDSet>(word_id_set, char_word_id_set);
     }
@@ -709,7 +704,7 @@
         num_matches, now);
     // Filter new matches that ended up scoring 0. (These are usually matches
     // which didn't match the user's raw terms.)
-    if (new_scored_match.raw_score != 0)
+    if (new_scored_match.raw_score > 0)
       scored_items->push_back(std::move(new_scored_match));
   }
 }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 15aa3b1b..4662082 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -14012,7 +14012,11 @@
         std::string("can not be used with depth or stencil textures");
     return false;
   }
-  if (feature_info_->IsWebGL2OrES3Context()) {
+  if (feature_info_->IsWebGL2OrES3Context() ||
+      (feature_info_->feature_flags().chromium_color_buffer_float_rgb &&
+       internal_format == GL_RGB32F) ||
+      (feature_info_->feature_flags().chromium_color_buffer_float_rgba &&
+       internal_format == GL_RGBA32F)) {
     if (GLES2Util::IsSizedColorFormat(internal_format)) {
       int sr, sg, sb, sa;
       GLES2Util::GetColorFormatComponentSizes(
@@ -16355,12 +16359,20 @@
     case GL_RG16F:
     case GL_RG32F:
     case GL_RGB16F:
-    case GL_RGB32F:
     case GL_RGBA16F:
-    case GL_RGBA32F:
     case GL_R11F_G11F_B10F:
       valid_dest_format = feature_info_->ext_color_buffer_float_available();
       break;
+    case GL_RGB32F:
+      valid_dest_format =
+          feature_info_->ext_color_buffer_float_available() ||
+          feature_info_->feature_flags().chromium_color_buffer_float_rgb;
+      break;
+    case GL_RGBA32F:
+      valid_dest_format =
+          feature_info_->ext_color_buffer_float_available() ||
+          feature_info_->feature_flags().chromium_color_buffer_float_rgba;
+      break;
     default:
       valid_dest_format = false;
       break;
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
index 5be1671..94d904f8 100644
--- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -773,6 +773,56 @@
   }
 }
 
+TEST_P(GLCopyTextureCHROMIUMTest, InternalFormatRGBFloat) {
+  if (!GLTestHelper::HasExtension("GL_CHROMIUM_color_buffer_float_rgb")) {
+    LOG(INFO)
+        << "GL_CHROMIUM_color_buffer_float_rgb not supported. Skipping test...";
+    return;
+  }
+  // TODO(qiankun.miao@intel.com): since RunCopyTexture requires dest texture to
+  // be texture complete, skip this test if float texture is not color
+  // filterable. We should remove this limitation when we find a way doesn't
+  // require dest texture to be texture complete in RunCopyTexture.
+  if (!gl_.decoder()
+           ->GetFeatureInfo()
+           ->feature_flags()
+           .enable_texture_float_linear) {
+    LOG(INFO) << "RGB32F texture is not filterable. Skipping test...";
+    return;
+  }
+  CopyType copy_type = GetParam();
+  FormatType src_format_type = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE};
+  FormatType dest_format_type = {GL_RGB32F, GL_RGB, GL_FLOAT};
+
+  RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, 0, dest_format_type,
+                 0, false);
+}
+
+TEST_P(GLCopyTextureCHROMIUMTest, InternalFormatRGBAFloat) {
+  if (!GLTestHelper::HasExtension("GL_CHROMIUM_color_buffer_float_rgba")) {
+    LOG(INFO) << "GL_CHROMIUM_color_buffer_float_rgba not supported. Skipping "
+                 "test...";
+    return;
+  }
+  // TODO(qiankun.miao@intel.com): since RunCopyTexture requires dest texture to
+  // be texture complete, skip this test if float texture is not color
+  // filterable. We should remove this limitation when we find a way doesn't
+  // require dest texture to be texture complete in RunCopyTexture.
+  if (!gl_.decoder()
+           ->GetFeatureInfo()
+           ->feature_flags()
+           .enable_texture_float_linear) {
+    LOG(INFO) << "RGBA32F texture is not filterable. Skipping test...";
+    return;
+  }
+  CopyType copy_type = GetParam();
+  FormatType src_format_type = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE};
+  FormatType dest_format_type = {GL_RGBA32F, GL_RGBA, GL_FLOAT};
+
+  RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, 0, dest_format_type,
+                 0, false);
+}
+
 TEST_P(GLCopyTextureCHROMIUMTest, InternalFormatNotSupported) {
   CopyType copy_type = GetParam();
   CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D);
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index eb72f383..86e67ba 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -2613,7 +2613,7 @@
   callbackCounter->IncrementCount();
   [self removeBrowsingDataFromBrowserState:_mainBrowserState
                                       mask:removeAllMask
-                                timePeriod:browsing_data::ALL_TIME
+                                timePeriod:browsing_data::TimePeriod::ALL_TIME
                          completionHandler:decrementCallbackCounterCount];
 }
 
diff --git a/ios/chrome/browser/browsing_data/browsing_data_counter_wrapper.cc b/ios/chrome/browser/browsing_data/browsing_data_counter_wrapper.cc
index fb0a8b98..c72b093d 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_counter_wrapper.cc
+++ b/ios/chrome/browser/browsing_data/browsing_data_counter_wrapper.cc
@@ -38,7 +38,7 @@
     PrefService* pref_service,
     const UpdateUICallback& update_ui_callback)
     : counter_(std::move(counter)), update_ui_callback_(update_ui_callback) {
-  counter_->Init(pref_service,
+  counter_->Init(pref_service, browsing_data::ClearBrowsingDataTab::ADVANCED,
                  base::Bind(&BrowsingDataCounterWrapper::UpdateWithResult,
                             base::Unretained(this)));
 }
diff --git a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
index a04ec4d41..50ce158 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
+++ b/ios/chrome/browser/browsing_data/browsing_data_removal_controller.mm
@@ -173,7 +173,7 @@
                                         decrementCallbackCounterCount];
 
   if (mask & IOSChromeBrowsingDataRemover::REMOVE_DOWNLOADS) {
-    DCHECK_EQ(browsing_data::ALL_TIME, timePeriod)
+    DCHECK_EQ(browsing_data::TimePeriod::ALL_TIME, timePeriod)
         << "Partial clearing not supported";
     callbackCounter->IncrementCount();
     [_delegate
diff --git a/ios/chrome/browser/browsing_data/cache_counter_unittest.cc b/ios/chrome/browser/browsing_data/cache_counter_unittest.cc
index bf6b87c..f6c41f8 100644
--- a/ios/chrome/browser/browsing_data/cache_counter_unittest.cc
+++ b/ios/chrome/browser/browsing_data/cache_counter_unittest.cc
@@ -35,7 +35,7 @@
   CacheCounterTest() {
     prefs_.registry()->RegisterIntegerPref(
         browsing_data::prefs::kDeleteTimePeriod,
-        static_cast<int>(browsing_data::ALL_TIME));
+        static_cast<int>(browsing_data::TimePeriod::ALL_TIME));
     prefs_.registry()->RegisterBooleanPref(browsing_data::prefs::kDeleteCache,
                                            true);
 
@@ -236,8 +236,9 @@
 // Tests that for the empty cache, the result is zero.
 TEST_F(CacheCounterTest, Empty) {
   CacheCounter counter(browser_state());
-  counter.Init(prefs(), base::Bind(&CacheCounterTest::CountingCallback,
-                                   base::Unretained(this)));
+  counter.Init(
+      prefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
   counter.Restart();
 
   WaitForIOThread();
@@ -251,8 +252,9 @@
   CreateCacheEntry();
 
   CacheCounter counter(browser_state());
-  counter.Init(prefs(), base::Bind(&CacheCounterTest::CountingCallback,
-                                   base::Unretained(this)));
+  counter.Init(
+      prefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
   counter.Restart();
 
   WaitForIOThread();
@@ -271,8 +273,9 @@
   SetCacheDeletionPref(false);
 
   CacheCounter counter(browser_state());
-  counter.Init(prefs(), base::Bind(&CacheCounterTest::CountingCallback,
-                                   base::Unretained(this)));
+  counter.Init(
+      prefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
   SetCacheDeletionPref(true);
 
   WaitForIOThread();
@@ -287,26 +290,27 @@
   CreateCacheEntry();
 
   CacheCounter counter(browser_state());
-  counter.Init(prefs(), base::Bind(&CacheCounterTest::CountingCallback,
-                                   base::Unretained(this)));
+  counter.Init(
+      prefs(), browsing_data::ClearBrowsingDataTab::ADVANCED,
+      base::Bind(&CacheCounterTest::CountingCallback, base::Unretained(this)));
 
-  SetDeletionPeriodPref(browsing_data::LAST_HOUR);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_HOUR);
   WaitForIOThread();
   browsing_data::BrowsingDataCounter::ResultInt result = GetResult();
 
-  SetDeletionPeriodPref(browsing_data::LAST_DAY);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_DAY);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::LAST_WEEK);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::LAST_WEEK);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::FOUR_WEEKS);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::FOUR_WEEKS);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 
-  SetDeletionPeriodPref(browsing_data::ALL_TIME);
+  SetDeletionPeriodPref(browsing_data::TimePeriod::ALL_TIME);
   WaitForIOThread();
   EXPECT_EQ(result, GetResult());
 }
diff --git a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
index 4f8a1cd6..1600961 100644
--- a/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
+++ b/ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.mm
@@ -96,19 +96,19 @@
     ios::ChromeBrowserState* browser_state,
     browsing_data::TimePeriod period) {
   switch (period) {
-    case browsing_data::LAST_HOUR:
+    case browsing_data::TimePeriod::LAST_HOUR:
       base::RecordAction(UserMetricsAction("ClearBrowsingData_LastHour"));
       break;
-    case browsing_data::LAST_DAY:
+    case browsing_data::TimePeriod::LAST_DAY:
       base::RecordAction(UserMetricsAction("ClearBrowsingData_LastDay"));
       break;
-    case browsing_data::LAST_WEEK:
+    case browsing_data::TimePeriod::LAST_WEEK:
       base::RecordAction(UserMetricsAction("ClearBrowsingData_LastWeek"));
       break;
-    case browsing_data::FOUR_WEEKS:
+    case browsing_data::TimePeriod::FOUR_WEEKS:
       base::RecordAction(UserMetricsAction("ClearBrowsingData_LastMonth"));
       break;
-    case browsing_data::ALL_TIME:
+    case browsing_data::TimePeriod::ALL_TIME:
       base::RecordAction(UserMetricsAction("ClearBrowsingData_Everything"));
       break;
   }
diff --git a/ios/chrome/browser/signin/browser_state_data_remover.mm b/ios/chrome/browser/signin/browser_state_data_remover.mm
index 7a3ba5c..40f2a359 100644
--- a/ios/chrome/browser/signin/browser_state_data_remover.mm
+++ b/ios/chrome/browser/signin/browser_state_data_remover.mm
@@ -52,7 +52,7 @@
       [[ClearBrowsingDataCommand alloc]
           initWithBrowserState:browser_state_
                           mask:kRemoveAllDataMask
-                    timePeriod:browsing_data::ALL_TIME]);
+                    timePeriod:browsing_data::TimePeriod::ALL_TIME]);
 
   UIWindow* mainWindow = [[UIApplication sharedApplication] keyWindow];
   DCHECK(mainWindow);
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
index 125e0fd..33feb18a 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
@@ -192,12 +192,14 @@
       int prefValue = browserState->GetPrefs()->GetInteger(
           browsing_data::prefs::kDeleteTimePeriod);
       prefValue = MAX(0, prefValue);
-      if (prefValue > browsing_data::TIME_PERIOD_LAST) {
-        prefValue = browsing_data::TIME_PERIOD_LAST;
+      const int maxValue =
+          static_cast<int>(browsing_data::TimePeriod::TIME_PERIOD_LAST);
+      if (prefValue > maxValue) {
+        prefValue = maxValue;
       }
       _timePeriod = static_cast<browsing_data::TimePeriod>(prefValue);
     } else {
-      _timePeriod = browsing_data::ALL_TIME;
+      _timePeriod = browsing_data::TimePeriod::ALL_TIME;
     }
 
     self.title = l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE);
@@ -803,7 +805,7 @@
                                      (~NSByteCountFormatterUseKB);
       formatter.get().countStyle = NSByteCountFormatterCountStyleMemory;
       NSString* formattedSize = [formatter stringFromByteCount:cacheSizeBytes];
-      return (_timePeriod == browsing_data::ALL_TIME)
+      return (_timePeriod == browsing_data::TimePeriod::ALL_TIME)
                  ? formattedSize
                  : l10n_util::GetNSStringF(
                        IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE,
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm
index f2deed4..a4a3f94 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm
@@ -234,7 +234,7 @@
   ASSERT_EQ("en", GetApplicationContext()->GetApplicationLocale());
   PrefService* prefs = browser_state_->GetPrefs();
   prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
-                    browsing_data::ALL_TIME);
+                    static_cast<int>(browsing_data::TimePeriod::ALL_TIME));
   CacheCounter counter(browser_state_.get());
 
   // Test multiple possible types of formatting.
@@ -274,7 +274,7 @@
   }
   PrefService* prefs = browser_state_->GetPrefs();
   prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
-                    browsing_data::LAST_HOUR);
+                    static_cast<int>(browsing_data::TimePeriod::LAST_HOUR));
   CacheCounter counter(browser_state_.get());
 
   // Test multiple possible types of formatting.
diff --git a/ios/chrome/browser/ui/settings/time_range_selector_collection_view_controller.mm b/ios/chrome/browser/ui/settings/time_range_selector_collection_view_controller.mm
index 7fc05006..10a7895 100644
--- a/ios/chrome/browser/ui/settings/time_range_selector_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/time_range_selector_collection_view_controller.mm
@@ -37,8 +37,10 @@
     IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_LAST_FOUR_WEEKS,
     IDS_IOS_CLEAR_BROWSING_DATA_TIME_RANGE_OPTION_BEGINNING_OF_TIME};
 
-static_assert(arraysize(kStringIDS) == browsing_data::TIME_PERIOD_LAST + 1,
-              "Strings have to match the enum values.");
+static_assert(
+    arraysize(kStringIDS) ==
+        static_cast<int>(browsing_data::TimePeriod::TIME_PERIOD_LAST) + 1,
+    "Strings have to match the enum values.");
 
 }  // namespace
 
@@ -150,7 +152,8 @@
   NSInteger itemType =
       [self.collectionViewModel itemTypeForIndexPath:indexPath];
   int timePeriod = itemType - kItemTypeEnumZero;
-  DCHECK_LE(timePeriod, browsing_data::TIME_PERIOD_LAST);
+  DCHECK_LE(timePeriod,
+            static_cast<int>(browsing_data::TimePeriod::TIME_PERIOD_LAST));
   [self updatePrefValue:timePeriod];
   [_weakDelegate
       timeRangeSelectorViewController:self
diff --git a/ios/chrome/test/app/history_test_util.mm b/ios/chrome/test/app/history_test_util.mm
index aa760d9..1d9d8d9d 100644
--- a/ios/chrome/test/app/history_test_util.mm
+++ b/ios/chrome/test/app/history_test_util.mm
@@ -28,7 +28,7 @@
       removeBrowsingDataFromBrowserState:active_state
                                     mask:IOSChromeBrowsingDataRemover::
                                              REMOVE_HISTORY
-                              timePeriod:browsing_data::ALL_TIME
+                              timePeriod:browsing_data::TimePeriod::ALL_TIME
                        completionHandler:^{
                          callback_counter->DecrementCount();
                          did_complete = true;
diff --git a/net/BUILD.gn b/net/BUILD.gn
index a69f7ce5..5334ba8 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -397,9 +397,6 @@
       "base/cache_type.h",
       "base/chunked_upload_data_stream.cc",
       "base/chunked_upload_data_stream.h",
-      "base/crypto_module.h",
-      "base/crypto_module_nss.cc",
-      "base/crypto_module_openssl.cc",
       "base/data_url.cc",
       "base/data_url.h",
       "base/elements_upload_data_stream.cc",
@@ -1693,7 +1690,6 @@
 
     if (!use_openssl_certs) {
       sources -= [
-        "base/crypto_module_openssl.cc",
         "cert/cert_database_openssl.cc",
         "cert/cert_verify_proc_openssl.cc",
         "cert/cert_verify_proc_openssl.h",
@@ -1726,7 +1722,6 @@
 
     if (!use_nss_certs) {
       sources -= [
-        "base/crypto_module_nss.cc",
         "cert/cert_database_nss.cc",
         "cert/internal/cert_issuer_source_nss.cc",
         "cert/internal/cert_issuer_source_nss.h",
@@ -2121,10 +2116,6 @@
   visibility = [ ":test_support" ]
   testonly = true
   sources = [
-    "data/quic_http_response_cache_data_with_push/test.example.com/favicon.ico",
-    "data/quic_http_response_cache_data_with_push/test.example.com/index.html",
-    "data/quic_http_response_cache_data_with_push/test.example.com/index2.html",
-    "data/quic_http_response_cache_data_with_push/test.example.com/kitten-1.jpg",
     "data/ssl/certificates/1024-rsa-ee-by-1024-rsa-intermediate.pem",
     "data/ssl/certificates/1024-rsa-ee-by-2048-rsa-intermediate.pem",
     "data/ssl/certificates/1024-rsa-ee-by-768-rsa-intermediate.pem",
diff --git a/net/base/crypto_module.h b/net/base/crypto_module.h
deleted file mode 100644
index 67e8a17..0000000
--- a/net/base/crypto_module.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef NET_BASE_CRYPTO_MODULE_H_
-#define NET_BASE_CRYPTO_MODULE_H_
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "net/base/net_export.h"
-
-#if defined(USE_NSS_CERTS)
-typedef struct PK11SlotInfoStr PK11SlotInfo;
-#endif
-
-namespace net {
-
-class CryptoModule;
-
-class NET_EXPORT CryptoModule
-    : public base::RefCountedThreadSafe<CryptoModule> {
- public:
-#if defined(USE_NSS_CERTS)
-  typedef PK11SlotInfo* OSModuleHandle;
-#else
-  typedef void* OSModuleHandle;
-#endif
-
-  OSModuleHandle os_module_handle() const { return module_handle_; }
-
-  std::string GetTokenName() const;
-
-  static CryptoModule* CreateFromHandle(OSModuleHandle handle);
-
- private:
-  friend class base::RefCountedThreadSafe<CryptoModule>;
-
-  explicit CryptoModule(OSModuleHandle handle);
-  ~CryptoModule();
-
-  OSModuleHandle module_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(CryptoModule);
-};
-
-}  // namespace net
-
-#endif  // NET_BASE_CRYPTO_MODULE_H_
diff --git a/net/base/crypto_module_nss.cc b/net/base/crypto_module_nss.cc
deleted file mode 100644
index df52ae9..0000000
--- a/net/base/crypto_module_nss.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/base/crypto_module.h"
-
-#include <pk11pub.h>
-
-namespace net {
-
-std::string CryptoModule::GetTokenName() const {
-  return PK11_GetTokenName(module_handle_);
-}
-
-// static
-CryptoModule* CryptoModule::CreateFromHandle(OSModuleHandle handle) {
-  return new CryptoModule(handle);
-}
-
-CryptoModule::CryptoModule(OSModuleHandle handle) : module_handle_(handle) {
-  PK11_ReferenceSlot(module_handle_);
-}
-
-CryptoModule::~CryptoModule() {
-  PK11_FreeSlot(module_handle_);
-}
-
-}  // namespace net
diff --git a/net/base/crypto_module_openssl.cc b/net/base/crypto_module_openssl.cc
deleted file mode 100644
index 3ef050fc..0000000
--- a/net/base/crypto_module_openssl.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/logging.h"
-#include "net/base/crypto_module.h"
-
-namespace net {
-
-std::string CryptoModule::GetTokenName() const {
-  NOTIMPLEMENTED();
-  return "";
-}
-
-// static
-CryptoModule* CryptoModule::CreateFromHandle(OSModuleHandle handle) {
-  NOTIMPLEMENTED();
-  return NULL;
-}
-
-CryptoModule::CryptoModule(OSModuleHandle handle) : module_handle_(handle) {
-}
-
-CryptoModule::~CryptoModule() {
-}
-
-}  // namespace net
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc
index 7a580d6..4490daf5 100644
--- a/net/cert/nss_cert_database.cc
+++ b/net/cert/nss_cert_database.cc
@@ -22,7 +22,6 @@
 #include "base/task_runner_util.h"
 #include "base/threading/worker_pool.h"
 #include "crypto/scoped_nss_types.h"
-#include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_database.h"
 #include "net/cert/x509_certificate.h"
diff --git a/net/cert/nss_cert_database_chromeos.cc b/net/cert/nss_cert_database_chromeos.cc
index 9f4f916..c92433b2 100644
--- a/net/cert/nss_cert_database_chromeos.cc
+++ b/net/cert/nss_cert_database_chromeos.cc
@@ -15,7 +15,6 @@
 #include "base/callback.h"
 #include "base/location.h"
 #include "base/task_runner.h"
-#include "net/base/crypto_module.h"
 #include "net/cert/x509_certificate.h"
 
 namespace net {
diff --git a/net/cert/nss_cert_database_unittest.cc b/net/cert/nss_cert_database_unittest.cc
index 235ea44c..4e3b60b4 100644
--- a/net/cert/nss_cert_database_unittest.cc
+++ b/net/cert/nss_cert_database_unittest.cc
@@ -22,7 +22,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "crypto/scoped_nss_types.h"
 #include "crypto/scoped_test_nss_db.h"
-#include "net/base/crypto_module.h"
 #include "net/base/hash_value.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 904797a1..1dc390a 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -38,7 +38,6 @@
 #include "net/base/upload_data_stream.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/http/disk_cache_based_quic_server_info.h"
-#include "net/http/http_cache_lookup_manager.h"
 #include "net/http/http_cache_transaction.h"
 #include "net/http/http_network_layer.h"
 #include "net/http/http_network_session.h"
@@ -344,20 +343,14 @@
   // Session may be NULL in unittests.
   // TODO(mmenke): Seems like tests could be changed to provide a session,
   // rather than having logic only used in unit tests here.
-  if (!session)
-    return;
-
-  net_log_ = session->net_log();
-  if (!is_main_cache)
-    return;
-
-  session->SetServerPushDelegate(
-      base::MakeUnique<HttpCacheLookupManager>(this));
-
-  if (!session->quic_stream_factory()->has_quic_server_info_factory()) {
-    // QuicStreamFactory takes ownership of QuicServerInfoFactoryAdaptor.
-    session->quic_stream_factory()->set_quic_server_info_factory(
-        new QuicServerInfoFactoryAdaptor(this));
+  if (session) {
+    net_log_ = session->net_log();
+    if (is_main_cache &&
+        !session->quic_stream_factory()->has_quic_server_info_factory()) {
+      // QuicStreamFactory takes ownership of QuicServerInfoFactoryAdaptor.
+      session->quic_stream_factory()->set_quic_server_info_factory(
+          new QuicServerInfoFactoryAdaptor(this));
+    }
   }
 }
 
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 54fe1593..b57653a 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -398,9 +398,7 @@
 
 void HttpNetworkSession::SetServerPushDelegate(
     std::unique_ptr<ServerPushDelegate> push_delegate) {
-  DCHECK(push_delegate);
-  if (!params_.enable_server_push_cancellation || push_delegate_)
-    return;
+  DCHECK(!push_delegate_ && push_delegate);
 
   push_delegate_ = std::move(push_delegate);
   spdy_session_pool_.set_server_push_delegate(push_delegate_.get());
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 47543fb1..b0ed8c0 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -85,7 +85,6 @@
     ClientSocketFactory* client_socket_factory;
     HostResolver* host_resolver;
     CertVerifier* cert_verifier;
-    bool enable_server_push_cancellation;
     ChannelIDService* channel_id_service;
     TransportSecurityState* transport_security_state;
     CTVerifier* cert_transparency_verifier;
diff --git a/net/quic/core/quic_server_session_base_test.cc b/net/quic/core/quic_server_session_base_test.cc
index ec05f6ab..6e18cd5 100644
--- a/net/quic/core/quic_server_session_base_test.cc
+++ b/net/quic/core/quic_server_session_base_test.cc
@@ -210,7 +210,6 @@
   // Send a reset (and expect the peer to send a RST in response).
   QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM,
                           0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst1);
@@ -228,7 +227,6 @@
   // Send a reset (and expect the peer to send a RST in response).
   QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM,
                           0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst1);
@@ -255,7 +253,6 @@
 
   // Send a reset (and expect the peer to send a RST in response).
   QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst);
diff --git a/net/quic/core/quic_session.cc b/net/quic/core/quic_session.cc
index b4d73481..6160cdd 100644
--- a/net/quic/core/quic_session.cc
+++ b/net/quic/core/quic_session.cc
@@ -95,10 +95,6 @@
     return;
   }
 
-  if (visitor_) {
-    visitor_->OnRstStreamReceived(frame);
-  }
-
   QuicStream* stream = GetOrCreateDynamicStream(frame.stream_id);
   if (!stream) {
     HandleRstOnValidNonexistentStream(frame);
diff --git a/net/quic/core/quic_session.h b/net/quic/core/quic_session.h
index 2f80010..283f55f 100644
--- a/net/quic/core/quic_session.h
+++ b/net/quic/core/quic_session.h
@@ -53,9 +53,6 @@
 
     // Called when the session has become write blocked.
     virtual void OnWriteBlocked(QuicBlockedWriterInterface* blocked_writer) = 0;
-
-    // Called when the session receives reset on a stream from the peer.
-    virtual void OnRstStreamReceived(const QuicRstStreamFrame& frame) = 0;
   };
 
   // CryptoHandshakeEvent enumerates the events generated by a QuicCryptoStream.
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index e83fd840..f0ab24a7 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -146,7 +146,6 @@
     g_time_delta = base::TimeDelta();
     g_time_now = base::TimeTicks::Now();
     session_deps_.net_log = log_.bound().net_log();
-    session_deps_.enable_server_push_cancellation = true;
   }
 
   void CreateNetworkSession() {
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc
index 0729125..1b2ef247 100644
--- a/net/spdy/spdy_test_util_common.cc
+++ b/net/spdy/spdy_test_util_common.cc
@@ -341,7 +341,6 @@
       enable_ping(false),
       enable_user_alternate_protocol_ports(false),
       enable_quic(false),
-      enable_server_push_cancellation(false),
       session_max_recv_window_size(kDefaultInitialWindowSize),
       time_func(&base::TimeTicks::Now),
       enable_http2_alternative_service_with_different_host(false),
@@ -403,8 +402,6 @@
   params.enable_user_alternate_protocol_ports =
       session_deps->enable_user_alternate_protocol_ports;
   params.enable_quic = session_deps->enable_quic;
-  params.enable_server_push_cancellation =
-      session_deps->enable_server_push_cancellation;
   params.spdy_session_max_recv_window_size =
       session_deps->session_max_recv_window_size;
   params.http2_settings = session_deps->http2_settings;
diff --git a/net/spdy/spdy_test_util_common.h b/net/spdy/spdy_test_util_common.h
index 727145c8..62a0564 100644
--- a/net/spdy/spdy_test_util_common.h
+++ b/net/spdy/spdy_test_util_common.h
@@ -207,7 +207,6 @@
   bool enable_ping;
   bool enable_user_alternate_protocol_ports;
   bool enable_quic;
-  bool enable_server_push_cancellation;
   size_t session_max_recv_window_size;
   SettingsMap http2_settings;
   SpdySession::TimeFunc time_func;
diff --git a/net/tools/quic/quic_dispatcher.cc b/net/tools/quic/quic_dispatcher.cc
index 4a1df9c..c99ea93 100644
--- a/net/tools/quic/quic_dispatcher.cc
+++ b/net/tools/quic/quic_dispatcher.cc
@@ -524,8 +524,6 @@
   write_blocked_list_.insert(std::make_pair(blocked_writer, true));
 }
 
-void QuicDispatcher::OnRstStreamReceived(const QuicRstStreamFrame& frame) {}
-
 void QuicDispatcher::OnConnectionAddedToTimeWaitList(
     QuicConnectionId connection_id) {
   QUIC_DLOG(INFO) << "Connection " << connection_id
diff --git a/net/tools/quic/quic_dispatcher.h b/net/tools/quic/quic_dispatcher.h
index a95fd8ab..266e3e4 100644
--- a/net/tools/quic/quic_dispatcher.h
+++ b/net/tools/quic/quic_dispatcher.h
@@ -85,11 +85,6 @@
   // Queues the blocked writer for later resumption.
   void OnWriteBlocked(QuicBlockedWriterInterface* blocked_writer) override;
 
-  // QuicSession::Visitor interface implementation (via inheritance of
-  // QuicTimeWaitListManager::Visitor):
-  // Collects reset error code received on streams.
-  void OnRstStreamReceived(const QuicRstStreamFrame& frame) override;
-
   // QuicTimeWaitListManager::Visitor interface implementation
   // Called whenever the time wait list manager adds a new connection to the
   // time-wait list.
diff --git a/net/tools/quic/quic_simple_dispatcher.cc b/net/tools/quic/quic_simple_dispatcher.cc
index e173624..cab2925 100644
--- a/net/tools/quic/quic_simple_dispatcher.cc
+++ b/net/tools/quic/quic_simple_dispatcher.cc
@@ -26,26 +26,6 @@
 
 QuicSimpleDispatcher::~QuicSimpleDispatcher() {}
 
-int QuicSimpleDispatcher::GetRstErrorCount(
-    QuicRstStreamErrorCode error_code) const {
-  auto it = rst_error_map_.find(error_code);
-  if (it == rst_error_map_.end()) {
-    return 0;
-  } else {
-    return it->second;
-  }
-}
-
-void QuicSimpleDispatcher::OnRstStreamReceived(
-    const QuicRstStreamFrame& frame) {
-  auto it = rst_error_map_.find(frame.error_code);
-  if (it == rst_error_map_.end()) {
-    rst_error_map_.insert(std::make_pair(frame.error_code, 1));
-  } else {
-    it->second++;
-  }
-}
-
 QuicServerSessionBase* QuicSimpleDispatcher::CreateQuicSession(
     QuicConnectionId connection_id,
     const QuicSocketAddress& client_address) {
diff --git a/net/tools/quic/quic_simple_dispatcher.h b/net/tools/quic/quic_simple_dispatcher.h
index 41d24cf..b9df6d9 100644
--- a/net/tools/quic/quic_simple_dispatcher.h
+++ b/net/tools/quic/quic_simple_dispatcher.h
@@ -24,10 +24,6 @@
 
   ~QuicSimpleDispatcher() override;
 
-  int GetRstErrorCount(QuicRstStreamErrorCode rst_error_code) const;
-
-  void OnRstStreamReceived(const QuicRstStreamFrame& frame) override;
-
  protected:
   QuicServerSessionBase* CreateQuicSession(
       QuicConnectionId connection_id,
@@ -37,9 +33,6 @@
 
  private:
   QuicHttpResponseCache* response_cache_;  // Unowned.
-
-  // The map of the reset error code with its counter.
-  std::map<QuicRstStreamErrorCode, int> rst_error_map_;
 };
 
 }  // namespace net
diff --git a/net/tools/quic/quic_simple_server_session_test.cc b/net/tools/quic/quic_simple_server_session_test.cc
index 35db616..5d1cac2 100644
--- a/net/tools/quic/quic_simple_server_session_test.cc
+++ b/net/tools/quic/quic_simple_server_session_test.cc
@@ -235,7 +235,6 @@
   // Receive a reset (and send a RST in response).
   QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM,
                           0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst1);
@@ -253,7 +252,6 @@
   // Send a reset (and expect the peer to send a RST in response).
   QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM,
                           0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst1);
@@ -280,7 +278,6 @@
 
   // Send a reset (and expect the peer to send a RST in response).
   QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst);
@@ -572,7 +569,6 @@
   // Reset the last stream in the queue. It should be marked cancelled.
   QuicStreamId stream_got_reset = num_resources * 2;
   QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0);
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   EXPECT_CALL(*connection_,
               SendRstStream(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT, 0));
   visitor_->OnRstStream(rst);
@@ -617,7 +613,6 @@
       .WillOnce(Return(QuicConsumedData(kStreamFlowControlWindowSize, false)));
 
   EXPECT_CALL(*connection_, SendBlocked(stream_to_open));
-  EXPECT_CALL(owner_, OnRstStreamReceived(_)).Times(1);
   QuicRstStreamFrame rst(stream_got_reset, QUIC_STREAM_CANCELLED, 0);
   visitor_->OnRstStream(rst);
 }
diff --git a/net/tools/quic/test_tools/mock_quic_session_visitor.h b/net/tools/quic/test_tools/mock_quic_session_visitor.h
index 793be8d4..ee1a6c7 100644
--- a/net/tools/quic/test_tools/mock_quic_session_visitor.h
+++ b/net/tools/quic/test_tools/mock_quic_session_visitor.h
@@ -23,7 +23,6 @@
                     const std::string& error_details));
   MOCK_METHOD1(OnWriteBlocked,
                void(QuicBlockedWriterInterface* blocked_writer));
-  MOCK_METHOD1(OnRstStreamReceived, void(const QuicRstStreamFrame& frame));
   MOCK_METHOD1(OnConnectionAddedToTimeWaitList,
                void(QuicConnectionId connection_id));
 
diff --git a/net/url_request/url_request_quic_unittest.cc b/net/url_request/url_request_quic_unittest.cc
index f435d61..7532196 100644
--- a/net/url_request/url_request_quic_unittest.cc
+++ b/net/url_request/url_request_quic_unittest.cc
@@ -15,17 +15,12 @@
 #include "net/cert/mock_cert_verifier.h"
 #include "net/dns/mapped_host_resolver.h"
 #include "net/dns/mock_host_resolver.h"
-#include "net/log/net_log_event_type.h"
-#include "net/log/test_net_log.h"
-#include "net/log/test_net_log_entry.h"
 #include "net/quic/chromium/crypto/proof_source_chromium.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
-#include "net/tools/quic/quic_dispatcher.h"
 #include "net/tools/quic/quic_http_response_cache.h"
-#include "net/tools/quic/quic_simple_dispatcher.h"
 #include "net/tools/quic/quic_simple_server.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_test_util.h"
@@ -69,11 +64,9 @@
     params->origins_to_force_quic_on.insert(HostPortPair(kTestServerHost, 443));
     params->cert_verifier = &cert_verifier_;
     params->enable_quic = true;
-    params->enable_server_push_cancellation = true;
     context_->set_host_resolver(host_resolver_.get());
     context_->set_http_network_session_params(std::move(params));
     context_->set_cert_verifier(&cert_verifier_);
-    context_->set_net_log(&net_log_);
   }
 
   void TearDown() override {
@@ -95,29 +88,11 @@
     return context_->CreateRequest(url, priority, delegate);
   }
 
-  void ExtractNetLog(NetLogEventType type,
-                     TestNetLogEntry::List* entry_list) const {
-    net::TestNetLogEntry::List entries;
-    net_log_.GetEntries(&entries);
-
-    for (const auto& entry : entries) {
-      if (entry.type == type)
-        entry_list->push_back(entry);
-    }
-  }
-
-  unsigned int GetRstErrorCountReceivedByServer(
-      QuicRstStreamErrorCode error_code) const {
-    return (static_cast<QuicSimpleDispatcher*>(server_->dispatcher()))
-        ->GetRstErrorCount(error_code);
-  }
-
  private:
   void StartQuicServer() {
     // Set up in-memory cache.
     response_cache_.AddSimpleResponse(kTestServerHost, kHelloPath, kHelloStatus,
                                       kHelloBodyValue);
-    response_cache_.InitializeFromDirectory(ServerPushCacheDirectory());
     net::QuicConfig config;
     // Set up server certs.
     std::unique_ptr<net::ProofSourceChromium> proof_source(
@@ -145,19 +120,9 @@
     EXPECT_TRUE(host_resolver_->AddRuleFromString(map_rule));
   }
 
-  std::string ServerPushCacheDirectory() {
-    base::FilePath path;
-    PathService::Get(base::DIR_SOURCE_ROOT, &path);
-    path = path.AppendASCII("net").AppendASCII("data").AppendASCII(
-        "quic_http_response_cache_data_with_push");
-    // The file path is known to be an ascii string.
-    return path.MaybeAsASCII();
-  }
-
   std::unique_ptr<MappedHostResolver> host_resolver_;
   std::unique_ptr<QuicSimpleServer> server_;
   std::unique_ptr<TestURLRequestContext> context_;
-  TestNetLog net_log_;
   QuicHttpResponseCache response_cache_;
   MockCertVerifier cert_verifier_;
 };
@@ -246,201 +211,6 @@
   EXPECT_EQ(kHelloBodyValue, delegate.data_received());
 }
 
-TEST_F(URLRequestQuicTest, CancelPushIfCached) {
-  base::RunLoop run_loop;
-  WaitForCompletionNetworkDelegate network_delegate(
-      run_loop.QuitClosure(), /*num_expected_requests=*/2);
-  SetNetworkDelegate(&network_delegate);
-
-  Init();
-  {
-    // Send a request to the pushed url: /kitten-1.jpg to pull the resource into
-    // cache.
-    CheckLoadTimingDelegate delegate(false);
-    std::string url =
-        base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg");
-    std::unique_ptr<URLRequest> request =
-        CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate);
-
-    request->Start();
-    ASSERT_TRUE(request->is_pending());
-    base::RunLoop().Run();
-
-    EXPECT_TRUE(request->status().is_success());
-  }
-
-  // Send a request to /index2.html which pushes /kitten-1.jpg and /favicon.ico.
-  // Should cancel push for /kitten-1.jpg.
-  CheckLoadTimingDelegate delegate(true);
-  std::string url =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html");
-  std::unique_ptr<URLRequest> request =
-      CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate);
-
-  request->Start();
-  ASSERT_TRUE(request->is_pending());
-  base::RunLoop().Run();
-
-  // Extract net logs on client side to verify push lookup transactions.
-  net::TestNetLogEntry::List entries;
-  ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries);
-
-  EXPECT_EQ(4u, entries.size());
-
-  std::string value;
-  int net_error;
-  std::string push_url_1 =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg");
-  std::string push_url_2 =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico");
-
-  EXPECT_TRUE(entries[0].GetStringValue("push_url", &value));
-  EXPECT_EQ(value, push_url_1);
-  // No net error code for this lookup transaction, the push is found.
-  EXPECT_FALSE(entries[1].GetIntegerValue("net_error", &net_error));
-
-  EXPECT_TRUE(entries[2].GetStringValue("push_url", &value));
-  EXPECT_EQ(value, push_url_2);
-  // Net error code -400 is found for this lookup transaction, the push is not
-  // found in the cache.
-  EXPECT_TRUE(entries[3].GetIntegerValue("net_error", &net_error));
-  EXPECT_EQ(net_error, -400);
-
-  EXPECT_TRUE(request->status().is_success());
-
-  // Verify the reset error count received on the server side.
-  EXPECT_EQ(1u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED));
-}
-
-TEST_F(URLRequestQuicTest, CancelPushIfCached2) {
-  base::RunLoop run_loop;
-  WaitForCompletionNetworkDelegate network_delegate(
-      run_loop.QuitClosure(), /*num_expected_requests=*/3);
-  SetNetworkDelegate(&network_delegate);
-
-  Init();
-  {
-    // Send a request to the pushed url: /kitten-1.jpg to pull the resource into
-    // cache.
-    CheckLoadTimingDelegate delegate(false);
-    std::string url =
-        base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg");
-    std::unique_ptr<URLRequest> request =
-        CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate);
-
-    request->Start();
-    ASSERT_TRUE(request->is_pending());
-    base::RunLoop().Run();
-
-    EXPECT_TRUE(request->status().is_success());
-    EXPECT_NE(network_delegate.total_network_bytes_sent(), 0u);
-  }
-
-  {
-    // Send a request to the pushed url: /favicon.ico to pull the resource into
-    // cache.
-    CheckLoadTimingDelegate delegate(true);
-    std::string url =
-        base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico");
-    std::unique_ptr<URLRequest> request =
-        CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate);
-
-    request->Start();
-    ASSERT_TRUE(request->is_pending());
-    base::RunLoop().Run();
-
-    EXPECT_TRUE(request->status().is_success());
-  }
-
-  // Send a request to /index2.html which pushes /kitten-1.jpg and /favicon.ico.
-  // Should cancel push for /kitten-1.jpg.
-  CheckLoadTimingDelegate delegate(true);
-  std::string url =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html");
-  std::unique_ptr<URLRequest> request =
-      CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate);
-
-  request->Start();
-  ASSERT_TRUE(request->is_pending());
-  base::RunLoop().Run();
-
-  // Extract net logs on client side to verify push lookup transactions.
-  net::TestNetLogEntry::List entries;
-  ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries);
-
-  EXPECT_EQ(4u, entries.size());
-
-  std::string value;
-  int net_error;
-  std::string push_url_1 =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg");
-  std::string push_url_2 =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico");
-
-  EXPECT_TRUE(entries[0].GetStringValue("push_url", &value));
-  EXPECT_EQ(value, push_url_1);
-  // No net error code for this lookup transaction, the push is found.
-  EXPECT_FALSE(entries[1].GetIntegerValue("net_error", &net_error));
-
-  EXPECT_TRUE(entries[2].GetStringValue("push_url", &value));
-  EXPECT_EQ(value, push_url_2);
-  // No net error code for this lookup transaction, the push is found.
-  EXPECT_FALSE(entries[3].GetIntegerValue("net_error", &net_error));
-
-  EXPECT_TRUE(request->status().is_success());
-
-  // Verify the reset error count received on the server side.
-  EXPECT_EQ(2u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED));
-}
-
-TEST_F(URLRequestQuicTest, DoNotCancelPushIfNotFoundInCache) {
-  base::RunLoop run_loop;
-  WaitForCompletionNetworkDelegate network_delegate(
-      run_loop.QuitClosure(), /*num_expected_requests=*/1);
-  SetNetworkDelegate(&network_delegate);
-
-  Init();
-  // Send a request to /index2.hmtl which pushes /kitten-1.jpg and /favicon.ico
-  // and shouldn't cancel any since neither is in cache.
-  CheckLoadTimingDelegate delegate(false);
-  std::string url =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/index2.html");
-  std::unique_ptr<URLRequest> request =
-      CreateRequest(GURL(url), DEFAULT_PRIORITY, &delegate);
-
-  request->Start();
-  ASSERT_TRUE(request->is_pending());
-  base::RunLoop().Run();
-
-  // Extract net logs on client side to verify push lookup transactions.
-  net::TestNetLogEntry::List entries;
-  ExtractNetLog(NetLogEventType::SERVER_PUSH_LOOKUP_TRANSACTION, &entries);
-
-  EXPECT_EQ(4u, entries.size());
-
-  std::string value;
-  int net_error;
-  std::string push_url_1 =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/kitten-1.jpg");
-  std::string push_url_2 =
-      base::StringPrintf("https://%s%s", kTestServerHost, "/favicon.ico");
-
-  EXPECT_TRUE(entries[0].GetStringValue("push_url", &value));
-  EXPECT_EQ(value, push_url_1);
-  EXPECT_TRUE(entries[1].GetIntegerValue("net_error", &net_error));
-  EXPECT_EQ(net_error, -400);
-
-  EXPECT_TRUE(entries[2].GetStringValue("push_url", &value));
-  EXPECT_EQ(value, push_url_2);
-  EXPECT_TRUE(entries[3].GetIntegerValue("net_error", &net_error));
-  EXPECT_EQ(net_error, -400);
-
-  EXPECT_TRUE(request->status().is_success());
-
-  // Verify the reset error count received on the server side.
-  EXPECT_EQ(0u, GetRstErrorCountReceivedByServer(QUIC_STREAM_CANCELLED));
-}
-
 // Tests that if two requests use the same QUIC session, the second request
 // should not have |LoadTimingInfo::connect_timing|.
 TEST_F(URLRequestQuicTest, TestTwoRequests) {
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 5f7f123..1e905fd 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -135,7 +135,7 @@
         base::MakeUnique<HttpNetworkSession>(params));
     context_storage_.set_http_transaction_factory(base::MakeUnique<HttpCache>(
         context_storage_.http_network_session(),
-        HttpCache::DefaultBackend::InMemory(0), true /* is_main_cache */));
+        HttpCache::DefaultBackend::InMemory(0), false));
   }
   if (!http_user_agent_settings()) {
     context_storage_.set_http_user_agent_settings(
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/selection/selection-and-text-repaint-expected.html b/third_party/WebKit/LayoutTests/paint/invalidation/selection/selection-and-text-repaint-expected.html
new file mode 100644
index 0000000..ed7b1237
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/selection/selection-and-text-repaint-expected.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<p style="color:green">This text should be green.</p>
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/selection/selection-and-text-repaint.html b/third_party/WebKit/LayoutTests/paint/invalidation/selection/selection-and-text-repaint.html
new file mode 100644
index 0000000..c4bdc0d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/selection/selection-and-text-repaint.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<style>
+    ::selection { color: red }
+    .green { color: green }
+</style>
+<p id="t1">This text should be green.</p>
+<script>
+    if (window.testRunner)
+        testRunner.waitUntilDone();
+
+    requestAnimationFrame(() =>
+        requestAnimationFrame(() => {
+            t1.className = "green";
+            if (window.testRunner)
+                testRunner.notifyDone();
+        }));
+</script>
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
index 1ed3e48..c1f3134 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp
@@ -359,16 +359,12 @@
 }
 
 bool ScriptStreamer::isFinished() const {
-  MutexLocker locker(m_mutex);
+  DCHECK(isMainThread());
   return m_loadingFinished && (m_parsingFinished || m_streamingSuppressed);
 }
 
 void ScriptStreamer::streamingCompleteOnBackgroundThread() {
   DCHECK(!isMainThread());
-  {
-    MutexLocker locker(m_mutex);
-    m_parsingFinished = true;
-  }
 
   // notifyFinished might already be called, or it might be called in the
   // future (if the parsing finishes earlier because of a parse error).
@@ -379,8 +375,7 @@
   // The task might delete ScriptStreamer, so it's not safe to do anything
   // after posting it. Note that there's no way to guarantee that this
   // function has returned before the task is ran - however, we should not
-  // access the "this" object after posting the task. (Especially, we should
-  // not be holding the mutex at this point.)
+  // access the "this" object after posting the task.
 }
 
 void ScriptStreamer::cancel() {
@@ -396,7 +391,7 @@
 }
 
 void ScriptStreamer::suppressStreaming() {
-  MutexLocker locker(m_mutex);
+  DCHECK(isMainThread());
   DCHECK(!m_loadingFinished);
   // It can be that the parsing task has already finished (e.g., if there was
   // a parse error).
@@ -406,11 +401,8 @@
 void ScriptStreamer::notifyAppendData(ScriptResource* resource) {
   DCHECK(isMainThread());
   CHECK_EQ(m_resource, resource);
-  {
-    MutexLocker locker(m_mutex);
-    if (m_streamingSuppressed)
-      return;
-  }
+  if (m_streamingSuppressed)
+    return;
   if (!m_haveEnoughDataForStreaming) {
     // Even if the first data chunk is small, the script can still be big
     // enough - wait until the next data chunk comes before deciding whether
@@ -553,6 +545,7 @@
   // The background task is completed; do the necessary ramp-down in the main
   // thread.
   DCHECK(isMainThread());
+  m_parsingFinished = true;
 
   // It's possible that the corresponding Resource was deleted before V8
   // finished streaming. In that case, the data or the notification is not
@@ -574,10 +567,7 @@
   // time to catch up. But the other way is possible too: if V8 detects a
   // parse error, the V8 side can complete before loading has finished. Send
   // the notification after both loading and V8 side operations have
-  // completed. Here we also check that we have a client: it can happen that a
-  // function calling notifyFinishedToClient was already scheduled in the task
-  // queue and the upper layer decided that it's not interested in the script
-  // and called removeClient.
+  // completed.
   if (!isFinished())
     return;
 
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h
index d9e6638..f688520 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.h
@@ -141,14 +141,12 @@
   SourceStream* m_stream;
   std::unique_ptr<v8::ScriptCompiler::StreamedSource> m_source;
   bool m_loadingFinished;  // Whether loading from the network is done.
-  // Whether the V8 side processing is done. Will be used by the main thread
-  // and the streamer thread; guarded by m_mutex.
-  bool m_parsingFinished;
+  bool m_parsingFinished;  // Whether the V8 side processing is done.
   // Whether we have received enough data to start the streaming.
   bool m_haveEnoughDataForStreaming;
 
   // Whether the script source code should be retrieved from the Resource
-  // instead of the ScriptStreamer; guarded by m_mutex.
+  // instead of the ScriptStreamer.
   bool m_streamingSuppressed;
 
   // What kind of cached data V8 produces during streaming.
@@ -165,8 +163,6 @@
   // Keep the script resource dentifier for event tracing.
   const unsigned long m_scriptResourceIdentifier;
 
-  mutable Mutex m_mutex;
-
   // Encoding of the streamed script. Saved for sanity checking purposes.
   v8::ScriptCompiler::StreamedSource::Encoding m_encoding;
 
diff --git a/third_party/WebKit/Source/bindings/scripts/idl_compiler.py b/third_party/WebKit/Source/bindings/scripts/idl_compiler.py
index 444415c..7c9728d29 100755
--- a/third_party/WebKit/Source/bindings/scripts/idl_compiler.py
+++ b/third_party/WebKit/Source/bindings/scripts/idl_compiler.py
@@ -55,6 +55,8 @@
                       help='cache directory, defaults to output directory')
     parser.add_option('--generate-impl',
                       action="store_true", default=False)
+    parser.add_option('--read-idl-list-from-file',
+                      action="store_true", default=False)
     parser.add_option('--output-directory')
     parser.add_option('--impl-output-directory')
     parser.add_option('--info-dir')
@@ -181,14 +183,18 @@
     options, input_filename = parse_options()
     info_provider = create_component_info_provider(
         options.info_dir, options.target_component)
-    if options.generate_impl:
-        if not info_provider.interfaces_info:
-            raise Exception('Interfaces info is required to generate '
-                            'union types containers')
+    if options.generate_impl or options.read_idl_list_from_file:
         # |input_filename| should be a file which contains a list of IDL
         # dictionary paths.
         input_filenames = read_idl_files_list_from_file(input_filename,
                                                         is_gyp_format=True)
+    else:
+        input_filenames = [input_filename]
+
+    if options.generate_impl:
+        if not info_provider.interfaces_info:
+            raise Exception('Interfaces info is required to generate '
+                            'impl classes')
         generate_dictionary_impl(CodeGeneratorDictionaryImpl, info_provider,
                                  options, input_filenames)
         generate_union_type_containers(CodeGeneratorUnionType, info_provider,
@@ -196,9 +202,8 @@
         generate_callback_function_impl(CodeGeneratorCallbackFunction,
                                         info_provider, options)
     else:
-        # |input_filename| should be a path of an IDL file.
         generate_bindings(CodeGeneratorV8, info_provider, options,
-                          [input_filename])
+                          input_filenames)
 
 
 if __name__ == '__main__':
diff --git a/third_party/WebKit/Source/bindings/scripts/scripts.gni b/third_party/WebKit/Source/bindings/scripts/scripts.gni
index ab82c54..fc7b26c 100644
--- a/third_party/WebKit/Source/bindings/scripts/scripts.gni
+++ b/third_party/WebKit/Source/bindings/scripts/scripts.gni
@@ -142,65 +142,106 @@
   output_dir = invoker.output_dir
   output_name_suffix = invoker.output_name_suffix
 
-  action_foreach(target_name) {
-    # TODO(brettw) GYP adds a "-S before the script name to skip "import site" to
-    # speed up startup. Figure out if we need this and do something similar (not
-    # really expressible in GN now).
-    script = "//third_party/WebKit/Source/bindings/scripts/idl_compiler.py"
+  # TODO(brettw): we used to add a "-S" before the script name to skip
+  # "import site" to speed up startup. Figure out if we need this and do
+  # something similar (not really expressible in GN now).
+  _script = "//third_party/WebKit/Source/bindings/scripts/idl_compiler.py"
+  _inputs = idl_lexer_parser_files + idl_compiler_files  # to be explicit (covered by parsetab)
+  _inputs += [
+    "$bindings_scripts_output_dir/lextab.py",
+    "$bindings_scripts_output_dir/parsetab.pickle",
+    "$bindings_scripts_output_dir/cached_jinja_templates.stamp",
+    "$bindings_dir/IDLExtendedAttributes.txt",
 
-    inputs = idl_lexer_parser_files + idl_compiler_files  # to be explicit (covered by parsetab)
-    inputs += [
-      "$bindings_scripts_output_dir/lextab.py",
-      "$bindings_scripts_output_dir/parsetab.pickle",
-      "$bindings_scripts_output_dir/cached_jinja_templates.stamp",
-      "$bindings_dir/IDLExtendedAttributes.txt",
+    # If the dependency structure or public interface info (e.g.,
+    # [ImplementedAs]) changes, we rebuild all files, since we're not
+    # computing dependencies file-by-file in the build.
+    # This data is generally stable.
+    "$bindings_modules_output_dir/InterfacesInfoOverall.pickle",
+  ]
 
-      # If the dependency structure or public interface info (e.g.,
-      # [ImplementedAs]) changes, we rebuild all files, since we're not
-      # computing dependencies file-by-file in the build.
-      # This data is generally stable.
-      "$bindings_modules_output_dir/InterfacesInfoOverall.pickle",
-    ]
+  # Further, if any dependency (partial interface or implemented
+  # interface) changes, rebuild everything, since every IDL potentially
+  # depends on them, because we're not computing dependencies
+  # file-by-file.
+  # FIXME: This is too conservative, and causes excess rebuilds:
+  # compute this file-by-file.  http://crbug.com/341748
+  # This should theoretically just be the IDL files passed in.
+  _inputs += core_all_dependency_idl_files + modules_all_dependency_idl_files
 
-    # Further, if any dependency (partial interface or implemented
-    # interface) changes, rebuild everything, since every IDL potentially
-    # depends on them, because we're not computing dependencies
-    # file-by-file.
-    # FIXME: This is too conservative, and causes excess rebuilds:
-    # compute this file-by-file.  http://crbug.com/341748
-    # This should theoretically just be the IDL files passed in.
-    inputs += core_all_dependency_idl_files + modules_all_dependency_idl_files
+  _public_deps = [
+    "//third_party/WebKit/Source/bindings/core:core_global_constructors_idls",
 
-    sources = invoker.sources
-    outputs = [
-      "$output_dir/V8{{source_name_part}}${output_name_suffix}.cpp",
-      "$output_dir/V8{{source_name_part}}${output_name_suffix}.h",
-    ]
+    # FIXME: should be interfaces_info_core (w/o modules)
+    # http://crbug.com/358074
+    "//third_party/WebKit/Source/bindings/modules:interfaces_info",
+    "//third_party/WebKit/Source/bindings/modules:modules_core_global_constructors_idls",
+    "//third_party/WebKit/Source/bindings/modules:modules_global_constructors_idls",
+    "//third_party/WebKit/Source/bindings/scripts:cached_jinja_templates",
+    "//third_party/WebKit/Source/bindings/scripts:cached_lex_yacc_tables",
+    "//third_party/WebKit/Source/core:generated_testing_idls",
+  ]
 
-    args = [
-      "--cache-dir",
-      rebase_path(bindings_scripts_output_dir, root_build_dir),
-      "--output-dir",
-      rebase_path(output_dir, root_build_dir),
-      "--info-dir",
-      rebase_path("$bindings_output_dir", root_build_dir),
-      "--target-component",
-      invoker.target_component,
-      "{{source}}",
-    ]
+  # On mac spawning a python process per IDL file is slow. Use a single action
+  # instead.
+  # TODO(bashi,tikuta): Use a pool when crbug.com/635308 is fixed.
+  if (is_mac) {
+    action(target_name) {
+      script = _script
+      inputs = _inputs
+      public_deps = _public_deps
 
-    public_deps = [
-      "//third_party/WebKit/Source/bindings/core:core_global_constructors_idls",
+      sources = invoker.sources
+      outputs = []
+      foreach(_source, sources) {
+        _name_part = get_path_info(_source, "name")
+        outputs += [
+          "$output_dir/V8${_name_part}${output_name_suffix}.cpp",
+          "$output_dir/V8${_name_part}${output_name_suffix}.h",
+        ]
+      }
 
-      # FIXME: should be interfaces_info_core (w/o modules)
-      # http://crbug.com/358074
-      "//third_party/WebKit/Source/bindings/modules:interfaces_info",
-      "//third_party/WebKit/Source/bindings/modules:modules_core_global_constructors_idls",
-      "//third_party/WebKit/Source/bindings/modules:modules_global_constructors_idls",
-      "//third_party/WebKit/Source/bindings/scripts:cached_jinja_templates",
-      "//third_party/WebKit/Source/bindings/scripts:cached_lex_yacc_tables",
-      "//third_party/WebKit/Source/core:generated_testing_idls",
-    ]
+      idl_files_list = "$target_gen_dir/${target_name}_file_list.tmp"
+      write_file(idl_files_list, rebase_path(invoker.sources, root_build_dir))
+      inputs += [ idl_files_list ]
+
+      args = [
+        "--cache-dir",
+        rebase_path(bindings_scripts_output_dir, root_build_dir),
+        "--output-dir",
+        rebase_path(output_dir, root_build_dir),
+        "--info-dir",
+        rebase_path("$bindings_output_dir", root_build_dir),
+        "--target-component",
+        invoker.target_component,
+        "--read-idl-list-from-file",
+        rebase_path(idl_files_list, root_build_dir),
+      ]
+    }
+  } else {
+    action_foreach(target_name) {
+      script = _script
+      inputs = _inputs
+      public_deps = _public_deps
+
+      sources = invoker.sources
+      outputs = [
+        "$output_dir/V8{{source_name_part}}${output_name_suffix}.cpp",
+        "$output_dir/V8{{source_name_part}}${output_name_suffix}.h",
+      ]
+
+      args = [
+        "--cache-dir",
+        rebase_path(bindings_scripts_output_dir, root_build_dir),
+        "--output-dir",
+        rebase_path(output_dir, root_build_dir),
+        "--info-dir",
+        rebase_path("$bindings_output_dir", root_build_dir),
+        "--target-component",
+        invoker.target_component,
+        "{{source}}",
+      ]
+    }
   }
 }
 
diff --git a/third_party/WebKit/Source/core/layout/ColumnBalancer.h b/third_party/WebKit/Source/core/layout/ColumnBalancer.h
index a963e5a0..b130086 100644
--- a/third_party/WebKit/Source/core/layout/ColumnBalancer.h
+++ b/third_party/WebKit/Source/core/layout/ColumnBalancer.h
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#ifndef ColumnBalancer_h
+#define ColumnBalancer_h
+
 #include "core/layout/LayoutMultiColumnSet.h"
 
 namespace blink {
@@ -270,3 +273,5 @@
 };
 
 }  // namespace blink
+
+#endif  // ColumnBalancer_h
diff --git a/third_party/WebKit/Source/core/layout/FloatingObjects.cpp b/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
index ba37e28..f48b31f 100644
--- a/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
+++ b/third_party/WebKit/Source/core/layout/FloatingObjects.cpp
@@ -33,8 +33,6 @@
 #include <algorithm>
 #include <memory>
 
-using namespace WTF;
-
 namespace blink {
 
 struct SameSizeAsFloatingObject {
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index b5a5cd9..58c5960 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -190,7 +190,7 @@
     // The background of the root element or the body element could propagate up
     // to the canvas. Just dirty the entire canvas when our style changes
     // substantially.
-    if ((diff.needsPaintInvalidation() || diff.needsLayout()) && node() &&
+    if ((diff.needsFullPaintInvalidation() || diff.needsLayout()) && node() &&
         (isHTMLHtmlElement(*node()) || isHTMLBodyElement(*node()))) {
       view()->setShouldDoFullPaintInvalidation();
 
@@ -283,7 +283,7 @@
   }
 
   // Our opaqueness might have changed without triggering layout.
-  if (diff.needsPaintInvalidation()) {
+  if (diff.needsFullPaintInvalidation()) {
     LayoutObject* parentToInvalidate = parent();
     for (unsigned i = 0;
          i < backgroundObscurationTestMaxDepth && parentToInvalidate; ++i) {
diff --git a/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp b/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
index 087b0fc..c33a839 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
@@ -28,8 +28,6 @@
 #include "core/html/HTMLLegendElement.h"
 #include "core/paint/FieldsetPainter.h"
 
-using namespace std;
-
 namespace blink {
 
 using namespace HTMLNames;
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 554dd56..ec39e7a 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -53,11 +53,6 @@
   LayoutUnit distributionOffset = LayoutUnit(-1);
 };
 
-enum TrackSizeRestriction {
-  AllowInfinity,
-  ForbidInfinity,
-};
-
 LayoutGrid::LayoutGrid(Element* element)
     : LayoutBlock(element), m_grid(this), m_trackSizingAlgorithm(this, m_grid) {
   ASSERT(!childrenInline());
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index 94daf66..6a2b51a6 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1529,7 +1529,8 @@
 
   // Optimization: for decoration/color property changes, invalidation is only
   // needed if we have style or text affected by these properties.
-  if (diff.textDecorationOrColorChanged() && !diff.needsPaintInvalidation()) {
+  if (diff.textDecorationOrColorChanged() &&
+      !diff.needsFullPaintInvalidation()) {
     if (style()->hasBorder() || style()->hasOutline() ||
         style()->hasBackgroundRelatedColorReferencingCurrentColor() ||
         // Skip any text nodes that do not contain text boxes. Whitespace cannot
@@ -1585,7 +1586,8 @@
                                            const ComputedStyle& newStyle) {
   StyleDifference diff = oldStyle.visualInvalidationDiff(newStyle);
 
-  if (diff.needsPaintInvalidation() || diff.textDecorationOrColorChanged()) {
+  if (diff.needsFullPaintInvalidation() ||
+      diff.textDecorationOrColorChanged()) {
     // We need to invalidate all inline boxes in the first line, because they
     // need to be repainted with the new style, e.g. background, font style,
     // etc.
@@ -1924,7 +1926,7 @@
     }
   }
 
-  if (diff.needsPaintInvalidation() && oldStyle) {
+  if (diff.needsFullPaintInvalidation() && oldStyle) {
     if (resolveColor(*oldStyle, CSSPropertyBackgroundColor) !=
             resolveColor(CSSPropertyBackgroundColor) ||
         oldStyle->backgroundLayers() != styleRef().backgroundLayers())
diff --git a/third_party/WebKit/Source/core/layout/LayoutScrollbarPart.cpp b/third_party/WebKit/Source/core/layout/LayoutScrollbarPart.cpp
index 765bf915..67ad4dc2a 100644
--- a/third_party/WebKit/Source/core/layout/LayoutScrollbarPart.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutScrollbarPart.cpp
@@ -211,7 +211,7 @@
   setInline(false);
   clearPositionedState();
   setFloating(false);
-  if (oldStyle && (diff.needsPaintInvalidation() || diff.needsLayout()))
+  if (oldStyle && (diff.needsFullPaintInvalidation() || diff.needsLayout()))
     setNeedsPaintInvalidation();
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutSlider.cpp b/third_party/WebKit/Source/core/layout/LayoutSlider.cpp
index a5fe043..34f19534 100644
--- a/third_party/WebKit/Source/core/layout/LayoutSlider.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutSlider.cpp
@@ -27,8 +27,6 @@
 #include "core/layout/LayoutSliderThumb.h"
 #include "wtf/MathExtras.h"
 
-using namespace ::std;
-
 namespace blink {
 
 const int LayoutSlider::defaultTrackLength = 129;
diff --git a/third_party/WebKit/Source/core/layout/LayoutText.cpp b/third_party/WebKit/Source/core/layout/LayoutText.cpp
index 045f337..14174575 100644
--- a/third_party/WebKit/Source/core/layout/LayoutText.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutText.cpp
@@ -54,9 +54,6 @@
 #include "wtf/text/StringBuffer.h"
 #include "wtf/text/StringBuilder.h"
 
-using namespace WTF;
-using namespace Unicode;
-
 namespace blink {
 
 struct SameSizeAsLayoutText : public LayoutObject {
@@ -139,10 +136,12 @@
   int32_t startOfWord = boundary->first();
   for (endOfWord = boundary->next(); endOfWord != TextBreakDone;
        startOfWord = endOfWord, endOfWord = boundary->next()) {
-    if (startOfWord)  // Ignore first char of previous string
-      result.append(input[startOfWord - 1] == noBreakSpaceCharacter
-                        ? noBreakSpaceCharacter
-                        : toTitleCase(stringWithPrevious[startOfWord]));
+    if (startOfWord) {  // Ignore first char of previous string
+      result.append(
+          input[startOfWord - 1] == noBreakSpaceCharacter
+              ? noBreakSpaceCharacter
+              : WTF::Unicode::toTitleCase(stringWithPrevious[startOfWord]));
+    }
     for (int i = startOfWord + 1; i < endOfWord; i++)
       result.append(input[i - 1]);
   }
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp
index d1d8068..e3d0528a 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp
@@ -248,7 +248,7 @@
                                    const ComputedStyle* oldStyle) {
   if (diff.needsFullLayout())
     setNeedsBoundariesUpdate();
-  if (diff.needsPaintInvalidation()) {
+  if (diff.needsFullPaintInvalidation()) {
     // Box decorations may have appeared/disappeared - recompute status.
     m_hasBoxDecorationBackground = styleRef().hasBoxDecorationBackground();
   }
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
index 2b3f00a..ad198f6 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -547,7 +547,7 @@
   if (m_svgStyle.get() != other.m_svgStyle.get())
     diff = m_svgStyle->diff(other.m_svgStyle.get());
 
-  if ((!diff.needsFullLayout() || !diff.needsPaintInvalidation()) &&
+  if ((!diff.needsFullLayout() || !diff.needsFullPaintInvalidation()) &&
       diffNeedsFullLayoutAndPaintInvalidation(other)) {
     diff.setNeedsFullLayout();
     diff.setNeedsPaintInvalidationObject();
@@ -1077,7 +1077,7 @@
   if (!m_surround->border.visualOverflowEqual(other.m_surround->border))
     diff.setNeedsRecomputeOverflow();
 
-  if (!diff.needsPaintInvalidation()) {
+  if (!diff.needsFullPaintInvalidation()) {
     if (m_styleInheritedData->color != other.m_styleInheritedData->color ||
         m_styleInheritedData->visitedLinkColor !=
             other.m_styleInheritedData->visitedLinkColor ||
diff --git a/third_party/WebKit/Source/core/style/StyleDifference.h b/third_party/WebKit/Source/core/style/StyleDifference.h
index a646e54..1c622066 100644
--- a/third_party/WebKit/Source/core/style/StyleDifference.h
+++ b/third_party/WebKit/Source/core/style/StyleDifference.h
@@ -51,17 +51,17 @@
            !(m_propertySpecificDifferences & ~propertyDifferences);
   }
 
-  bool needsPaintInvalidation() const {
-    return m_paintInvalidationType != NoPaintInvalidation;
+  bool needsFullPaintInvalidation() const {
+    return m_paintInvalidationType > PaintInvalidationSelectionOnly;
   }
 
   // The text selection needs paint invalidation.
   bool needsPaintInvalidationSelection() const {
-    return m_paintInvalidationType == PaintInvalidationSelection;
+    return m_paintInvalidationType == PaintInvalidationSelectionOnly;
   }
   void setNeedsPaintInvalidationSelection() {
-    if (!needsPaintInvalidation())
-      m_paintInvalidationType = PaintInvalidationSelection;
+    if (!needsFullPaintInvalidation())
+      m_paintInvalidationType = PaintInvalidationSelectionOnly;
   }
 
   // The object just needs to issue paint invalidations.
@@ -150,7 +150,7 @@
  private:
   enum PaintInvalidationType {
     NoPaintInvalidation,
-    PaintInvalidationSelection,
+    PaintInvalidationSelectionOnly,
     PaintInvalidationObject,
     PaintInvalidationSubtree,
   };
diff --git a/tools/android/eclipse/.classpath b/tools/android/eclipse/.classpath
index 5577636..12e7522a 100644
--- a/tools/android/eclipse/.classpath
+++ b/tools/android/eclipse/.classpath
@@ -144,6 +144,7 @@
     <classpathentry kind="src" path="out/Debug/gen/enums/browsing_data_utils_java"/>
     <classpathentry kind="src" path="out/Debug/gen/enums/certificate_mime_types_java"/>
     <classpathentry kind="src" path="out/Debug/gen/enums/cert_verify_status_android_java"/>
+    <classpathentry kind="src" path="out/Debug/gen/enums/clear_browsing_data_tab_java"/>
     <classpathentry kind="src" path="out/Debug/gen/enums/chromium_url_request_java"/>
     <classpathentry kind="src" path="out/Debug/gen/enums/connectivity_check_result_java"/>
     <classpathentry kind="src" path="out/Debug/gen/enums/console_message_level_java"/>