diff --git a/chromium/Android.mk b/chromium/Android.mk
index fb25d0b..a624f50 100644
--- a/chromium/Android.mk
+++ b/chromium/Android.mk
@@ -75,6 +75,7 @@
 
 
 # Include the makefile for the main package.
+extra_java_files :=
 include $(LOCAL_PATH)/package.mk
 
 # Build other stuff
diff --git a/chromium/java/com/android/webview/chromium/DataReductionProxyManager.java b/chromium/java/com/android/webview/chromium/DataReductionProxyManager.java
index 54e2151..dcb9c1e 100644
--- a/chromium/java/com/android/webview/chromium/DataReductionProxyManager.java
+++ b/chromium/java/com/android/webview/chromium/DataReductionProxyManager.java
@@ -34,6 +34,8 @@
 
 import org.chromium.android_webview.AwContentsStatics;
 
+import java.lang.reflect.Field;
+
 /**
  * Controls data reduction proxy. This logic will be moved to upstream fully.
  */
@@ -46,6 +48,7 @@
     // Setting type: int ( 0 = disallow, 1 = allow )
     private static final String WEBVIEW_DATA_REDUCTION_PROXY = "use_webview_data_reduction_proxy";
 
+    private static final String DRP_CLASS = "com.android.webview.chromium.Drp";
     private static final String TAG = "DataReductionProxySettingListener";
 
     /*
@@ -54,9 +57,16 @@
      * remove before release.
      */
     private static final class ProxySettingListener extends BroadcastReceiver {
+
+        final String mKey;
+
+        ProxySettingListener(final String key) {
+            mKey = key;
+        }
+
         @Override
         public void onReceive(Context context, Intent intent) {
-            applyDataReductionProxySettingsAsync(context);
+            applyDataReductionProxySettingsAsync(context, mKey);
         }
     }
 
@@ -70,16 +80,20 @@
     public DataReductionProxyManager() { }
 
     public void start(final Context context) {
-        applyDataReductionProxySettingsAsync(context);
+        final String key = readKey();
+        if (key == null || key.isEmpty()) {
+            return;
+        }
+        applyDataReductionProxySettingsAsync(context, key);
         IntentFilter filter = new IntentFilter();
         filter.addAction(WebView.DATA_REDUCTION_PROXY_SETTING_CHANGED);
-        mProxySettingListener = new ProxySettingListener();
+        mProxySettingListener = new ProxySettingListener(key);
         context.registerReceiver(mProxySettingListener, filter);
         ContentResolver resolver = context.getContentResolver();
         mProxySettingObserver = new ContentObserver(new Handler()) {
             @Override
             public void onChange(boolean selfChange, Uri uri) {
-                applyDataReductionProxySettingsAsync(context);
+                applyDataReductionProxySettingsAsync(context, key);
             }
         };
         resolver.registerContentObserver(
@@ -87,45 +101,46 @@
                     false, mProxySettingObserver);
     }
 
-    private static class ProxySettings {
-        boolean enabled;
-        String key;
+    private String readKey() {
+        try {
+            Class<?> cls = Class.forName(DRP_CLASS);
+            Field f = cls.getField("KEY");
+            return (String) f.get(null);
+        } catch (ClassNotFoundException ex) {
+            Log.e(TAG, "No DRP key due to exception:" + ex);
+        } catch (NoSuchFieldException ex) {
+            Log.e(TAG, "No DRP key due to exception:" + ex);
+        } catch (SecurityException ex) {
+            Log.e(TAG, "No DRP key due to exception:" + ex);
+        } catch (IllegalArgumentException ex) {
+            Log.e(TAG, "No DRP key due to exception:" + ex);
+        } catch (IllegalAccessException ex) {
+            Log.e(TAG, "No DRP key due to exception:" + ex);
+        } catch (NullPointerException ex) {
+            Log.e(TAG, "No DRP key due to exception:" + ex);
+        }
+        return null;
     }
 
-    private static void applyDataReductionProxySettingsAsync(final Context context) {
-        AsyncTask<Void, Void, ProxySettings> task = new AsyncTask<Void, Void, ProxySettings>() {
+    private static void applyDataReductionProxySettingsAsync(final Context context,
+            final String key) {
+        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
             @Override
-            protected ProxySettings doInBackground(Void... params) {
-                return readProxySettings(context);
+            protected Boolean doInBackground(Void... params) {
+                return isDataReductionProxyEnabled(context);
             }
             @Override
-            protected void onPostExecute(ProxySettings settings) {
-                if (settings.enabled) {
+            protected void onPostExecute(Boolean enabled) {
+                if (enabled) {
                     // Set the data reduction proxy key.
-                    AwContentsStatics.setDataReductionProxyKey(settings.key);
+                    AwContentsStatics.setDataReductionProxyKey(key);
                 }
-                AwContentsStatics.setDataReductionProxyEnabled(settings.enabled);
+                AwContentsStatics.setDataReductionProxyEnabled(enabled);
             }
         };
         task.execute();
     }
 
-    private static ProxySettings readProxySettings(Context context) {
-        ProxySettings settings = new ProxySettings();
-        settings.enabled = isDataReductionProxyEnabled(context);
-        if (settings.enabled) {
-            // Re-read the key in case it was updated.
-            String key = Settings.Secure.getString(context.getContentResolver(),
-                Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY);
-            if (key == null || key.isEmpty()) {
-                Log.w(TAG, "No DRP key available");
-                settings.enabled = false;
-            }
-            settings.key = key;
-        }
-        return settings;
-    }
-
     private static boolean isDataReductionProxyEnabled(Context context) {
         if (sOptedOutDataReductionProxy) {
             return false;
diff --git a/chromium/package.mk b/chromium/package.mk
index 4902930..8a4b97b 100644
--- a/chromium/package.mk
+++ b/chromium/package.mk
@@ -38,6 +38,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES += android_webview_java_with_new_resources
 
 LOCAL_SRC_FILES := $(call all-java-files-under, java)
+LOCAL_SRC_FILES += $(extra_java_files)
 
 LOCAL_JARJAR_RULES := $(CHROMIUM_PATH)/android_webview/build/jarjar-rules.txt
 
diff --git a/chromium/proguard.flags b/chromium/proguard.flags
index 8381c4a..6401a8c 100644
--- a/chromium/proguard.flags
+++ b/chromium/proguard.flags
@@ -67,6 +67,11 @@
 -keep class com.android.org.chromium.android_webview.AwBrowserContext
 -keep class com.android.org.chromium.base.library_loader.Linker$LibInfo
 
+# Keep this class and members as accessed via reflection
+-keep class com.android.webview.chromium.Drp {
+  public *;
+}
+
 # Keep finalizer stuff from google-common used via reflection
 -keepclassmembers class com.android.org.chromium.com.google.common.** {
   *** finalizeReferent();
