diff --git a/src/com/android/browser/mdm/ProxyRestriction.java b/src/com/android/browser/mdm/ProxyRestriction.java
index 99606d5..ddcf0a2 100644
--- a/src/com/android/browser/mdm/ProxyRestriction.java
+++ b/src/com/android/browser/mdm/ProxyRestriction.java
@@ -31,21 +31,34 @@
 package com.android.browser.mdm;
 
 import android.content.Intent;
-import android.net.Proxy;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
 
 import com.android.browser.Browser;
 import com.android.browser.PreferenceKeys;
 
-import org.chromium.net.ProxyChangeListener;
-import org.chromium.net.ProxyChangeListener.ProxyConfig;
-
 public class ProxyRestriction extends Restriction implements PreferenceKeys {
 
     private final static String TAG = "ProxyRestriction";
 
+    // These strings are duplicated in chromium.net.ProxyChangeListener.java
+    // (duplication due to layer policy)
+    // If you need to change/add/delete, make sure they stay in sync
+    public static final String MDM_PROXY_CHANGE_ACTION = "swe.mdm.intent.action.PROXY_CHANGE";
+    public static final String PROXY_MODE = "ProxyMode";
+    public static final String MODE_DIRECT = "direct";
+    public static final String MODE_SYSTEM = "system";
+    public static final String MODE_AUTO_DETECT = "auto_detect";
+    public static final String MODE_FIXED_SERVERS = "fixed_servers";
+    public static final String MODE_PAC_SCRIPT = "pac_script";
+
+    public static final String PROXY_SERVER = "ProxyServer";
+    public static final String PROXY_PORT = "ProxyPort";
+    public static final String PROXY_PAC_URL = "ProxyPacUrl";
+    public static final String PROXY_BYPASS_LIST = "ProxyBypassList";
+
     private static ProxyRestriction sInstance;
 
     private ProxyRestriction() {
@@ -63,7 +76,7 @@
 
     @Override
     public void enforce(Bundle restrictions) {
-        String proxyMode = restrictions.getString(ProxyChangeListener.PROXY_MODE);
+        String proxyMode = restrictions.getString(PROXY_MODE);
 
         // Leaving ProxyMode not set lifts any managed profile proxy restrictions, allowing users to
         // choose the proxy settings on their own.
@@ -74,27 +87,25 @@
 
         // If policy is to not use the proxy and always connect directly, then all other options
         // are ignored.
-        else if (proxyMode.equals(ProxyChangeListener.MODE_DIRECT)) {
+        else if (proxyMode.equals(MODE_DIRECT)) {
             Log.v(TAG, "enforce: proxyMode is MODE_DIRECT, enabling and passing to ProxyChangeListener.");
             saveProxyConfig(true, proxyMode, null, -1, null, null);
         }
 
         // If you choose to use system proxy settings or auto detect the proxy server,
         // all other options are ignored.
-        else if (proxyMode.equals(ProxyChangeListener.MODE_SYSTEM) ||
-                 proxyMode.equals(ProxyChangeListener.MODE_AUTO_DETECT)) {
-
-            // TODO: We will go ahead and configure here, but will throttle the enable in ProxyModeListener
+        else if (proxyMode.equals(MODE_SYSTEM) ||
+                 proxyMode.equals(MODE_AUTO_DETECT)) {
             saveProxyConfig(true, proxyMode, null, -1, null, null);
         }
 
         // If you choose fixed server proxy mode, you can specify further options in 'Address or URL
         // of proxy server' and 'Comma-separated list of proxy bypass rules'.
-        else if (proxyMode.equals(ProxyChangeListener.MODE_FIXED_SERVERS)) {
+        else if (proxyMode.equals(MODE_FIXED_SERVERS)) {
             String host;
             int port;
             try {
-                Uri proxyServerUri = Uri.parse(restrictions.getString(ProxyChangeListener.PROXY_SERVER));
+                Uri proxyServerUri = Uri.parse(restrictions.getString(PROXY_SERVER));
                 host = proxyServerUri.getHost();
                 // Bail out if host is not present
                 if (host == null) {
@@ -109,11 +120,11 @@
                 saveProxyConfig(false, null, null, -1, null, null);
                 return;
             }
-            String proxyBypassList = restrictions.getString(ProxyChangeListener.PROXY_BYPASS_LIST);
+            String proxyBypassList = restrictions.getString(PROXY_BYPASS_LIST);
             Log.v(TAG,"enforce: saving MODE_FIXED_SERVERS proxy config: ");
-            Log.v(TAG,"   - host       : " + host.toString());
+            Log.v(TAG,"   - host       : " + host);
             Log.v(TAG,"   - port       : " + port);
-            Log.v(TAG,"   - bypassList : " + (proxyBypassList != null ? proxyBypassList.toString() : "NULL"));
+            Log.v(TAG,"   - bypassList : " + (proxyBypassList != null ? proxyBypassList : "NULL"));
 
             saveProxyConfig(true, proxyMode, host, port, null, proxyBypassList);
         }
@@ -121,15 +132,15 @@
         // This policy only takes effect if you have selected manual proxy settings at 'Choose how
         // to specify proxy server settings'. You should leave this policy not set if you have
         // selected any other mode for setting proxy policies.
-        else if (proxyMode.equals(ProxyChangeListener.MODE_PAC_SCRIPT)) {
-            String proxyPacUrl = restrictions.getString(ProxyChangeListener.PROXY_PAC_URL);
+        else if (proxyMode.equals(MODE_PAC_SCRIPT)) {
+            String proxyPacUrl = restrictions.getString(PROXY_PAC_URL);
             // Bail out if ProxyPacUrl string is missing
             if (proxyPacUrl == null) {
                 Log.v(TAG, "enforce: MODE_PAC_SCRIPT. proxyPacUrl is null. disabling");
                 saveProxyConfig(false, null, null, -1, null, null);
 
             } else {
-                Log.v(TAG, "enforce: MODE_PAC_SCRIPT. proxyPacUrl ["+proxyPacUrl.toString() +
+                Log.v(TAG, "enforce: MODE_PAC_SCRIPT. proxyPacUrl ["+ proxyPacUrl +
                            "]. sending and enabling");
                 saveProxyConfig(true, proxyMode, null, -1, proxyPacUrl, null);
             }
@@ -139,26 +150,21 @@
     private void saveProxyConfig(boolean isEnabled, String proxyMode, String host,
                                  int port, String proxyPacUrl, String proxyBypassList) {
 
+        enable(isEnabled);
+
+        Intent proxySignal = new Intent(MDM_PROXY_CHANGE_ACTION);
+
+        proxySignal.putExtra(PROXY_MODE, isEnabled ? proxyMode : null);
+
         if (isEnabled) {
-            String[] bypass = (proxyBypassList != null) ? proxyBypassList.split(",") : new String[0];
-
-            ProxyConfig cfg = null;
-            // If all components of the cfg are null or invalid, just send a null instead of
-            // of a completely invalid cfg. We don't check port, since it's meaningless without host.
-            if (host != null || proxyPacUrl != null || proxyBypassList != null) {
-                cfg = new ProxyConfig(host, port, proxyPacUrl, bypass);
-            }
-
-            ProxyChangeListener.setMdmProxy(proxyMode, cfg);
-            enable(true);
-        }
-        else {
-            // Ensure any previously set proxy restriction is revoked
-            ProxyChangeListener.setMdmProxy(null, null);
-            enable(false);
+            proxySignal.putExtra(PROXY_SERVER, host);
+            proxySignal.putExtra(PROXY_PORT, port);
+            proxySignal.putExtra(PROXY_PAC_URL, proxyPacUrl);
+            proxySignal.putExtra(PROXY_BYPASS_LIST, proxyBypassList);
         }
 
-        Intent proxySignal = new Intent(ProxyChangeListener.MDM_PROXY_CHANGE_ACTION);
-        Browser.getContext().sendBroadcast(proxySignal);
+        // Send the broadcast. We use LocalBroadcastManager because it is more secure
+        // and it provides a handy synchronous call.
+        LocalBroadcastManager.getInstance(Browser.getContext()).sendBroadcastSync(proxySignal);
     }
 }
diff --git a/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java b/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java
index d06bf42..7f55c22 100644
--- a/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java
+++ b/src/com/android/browser/mdm/ThirdPartyCookiesRestriction.java
@@ -31,12 +31,11 @@
 package com.android.browser.mdm;
 
 import android.os.Bundle;
+import android.util.Log;
 
-import com.android.browser.PreferenceKeys;
+import org.codeaurora.swe.MdmManager;
 
-import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-
-public class ThirdPartyCookiesRestriction extends Restriction implements PreferenceKeys {
+public class ThirdPartyCookiesRestriction extends Restriction {
 
     private final static String TAG = "TPC_Restriction";
 
@@ -63,17 +62,11 @@
     public void enforce(Bundle restrictions) {
         enable(restrictions.getBoolean(TPC_ENABLED,false));
         mTpcValue = restrictions.getBoolean(TPC_VALUE, false);
-
-        PrefServiceBridge psb = PrefServiceBridge.getInstance();
-
-        if(psb != null) {
-            psb.setMdmBlockThirdPartyCookiesManaged(isEnabled());
-            psb.setMdmBlockThirdPartyCookiesEnabled(mTpcValue);
-        }
+        Log.i(TAG, "Enforcing. enabled[" + isEnabled() + "]. val[" + mTpcValue + "]");
+        MdmManager.updateMdmThirdPartyCookies(isEnabled(), mTpcValue);
     }
 
     public boolean getValue() {
         return mTpcValue;
     }
-
 }
diff --git a/src/com/android/browser/mdm/URLFilterRestriction.java b/src/com/android/browser/mdm/URLFilterRestriction.java
index 9d67121..551f5ea 100644
--- a/src/com/android/browser/mdm/URLFilterRestriction.java
+++ b/src/com/android/browser/mdm/URLFilterRestriction.java
@@ -32,7 +32,7 @@
 
 import android.os.Bundle;
 
-import org.chromium.chrome.browser.mdm.URLFilterRestrictionJNI;
+import org.codeaurora.swe.MdmManager;
 
 public class URLFilterRestriction extends Restriction {
     private final static String TAG = "URLFilterRestriction";
@@ -58,6 +58,6 @@
         String urlBlackList = restrictions.getString(URL_BLACK_LIST);
         String urlWhiteList = restrictions.getString(URL_WHITE_LIST);
 
-        URLFilterRestrictionJNI.getInstance().SetMdmUrlFilters(urlBlackList, urlWhiteList);
+        MdmManager.updateMdmUrlFilters(urlBlackList, urlWhiteList);
     }
 }
diff --git a/src/com/android/browser/mdm/tests/ProxyRestrictionsTest.java b/src/com/android/browser/mdm/tests/ProxyRestrictionsTest.java
index fd63ebf..5448c29 100644
--- a/src/com/android/browser/mdm/tests/ProxyRestrictionsTest.java
+++ b/src/com/android/browser/mdm/tests/ProxyRestrictionsTest.java
@@ -31,6 +31,7 @@
 package com.android.browser.mdm.tests;
 
 import android.app.Instrumentation;
+import android.content.Context;
 import android.os.Bundle;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Log;
@@ -38,7 +39,9 @@
 import com.android.browser.BrowserActivity;
 import com.android.browser.PreferenceKeys;
 import com.android.browser.mdm.ManagedProfileManager;
-import org.chromium.net.ProxyChangeListener;
+import com.android.browser.mdm.ProxyRestriction;
+
+import org.codeaurora.swe.MdmManager;
 
 public class ProxyRestrictionsTest extends ActivityInstrumentationTestCase2<BrowserActivity>
         implements PreferenceKeys {
@@ -47,7 +50,7 @@
 
     private Instrumentation mInstrumentation;
     private BrowserActivity mActivity;
-    private ProxyChangeListener mPcl;
+    private Context mContext;
 
     public ProxyRestrictionsTest() {
         super(BrowserActivity.class);
@@ -58,37 +61,18 @@
         super.setUp();
         mInstrumentation = getInstrumentation();
         mActivity = getActivity();
-        mPcl = ProxyChangeListener.create(getInstrumentation().getTargetContext());
-    }
-
-    /*
-     * Proxy Restrictions Tests
-     */
-    // Properties we can query ProxyChangeListener for:
-    //  http.proxyHost     , https.proxyHost
-    //  http.proxyPort     , https.proxyPort
-    //  http.nonProxyHosts , https.nonProxyHosts
-    //  ProxyServer          (ProxyChangeListener.PROXY_SERVER)
-    //  ProxyPacUrl          (ProxyChangeListener.PROXY_PAC_URL)
-    //  ProxyBypassList      (ProxyChangeListener.PROXY_BYPASS_LIST)
-    public void logProxyConfig (ProxyChangeListener.ProxyConfig pc) {
-        if (pc != null) {
-            Log.v(TAG, "ProxyConfig Dump:");
-            Log.v(TAG, pc.toString());
-        } else {
-            Log.v(TAG, "ProxyConfig Dump: pc was NULL");
-        }
+        mContext = getInstrumentation().getTargetContext();
     }
 
     public void checkValue (String key, String expected) {
         if (expected == null) {
-            assertNull(ProxyChangeListener.getProperty(key));
+            assertNull(MdmManager.getProxyProperty(key));
             // native gives us empty strings, not nulls
-            assertEquals(mPcl.fetchProxyPropertyFromNative(key), "");
+            assertEquals(MdmManager.getNativeProxyProperty(mContext,key), "");
         }
         else {
-            assertEquals(ProxyChangeListener.getProperty(key), expected);
-            assertEquals(mPcl.fetchProxyPropertyFromNative(key), expected);
+            assertEquals(MdmManager.getProxyProperty(key), expected);
+            assertEquals(MdmManager.getNativeProxyProperty(mContext,key), expected);
         }
     }
 
@@ -97,10 +81,10 @@
         Log.v(TAG, "== Init Conditions ==");
 
         // check configured proxy mode
-        assertNull("Init: mode should be null", ProxyChangeListener.getmMdmProxyMode());
+        assertNull("Init: mode should be null", MdmManager.getMdmProxyMode());
 
         // get the proxy config from ProxyChangeListener
-        assertNull("Init: proxyConfig should be null", ProxyChangeListener.getMdmProxyConfig());
+        assertFalse("Init: proxyConfig should be null", MdmManager.isMdmProxyCfgValid());
 
         checkValue("http.proxyHost", null);
         checkValue("http.proxyPort", null);
@@ -110,29 +94,29 @@
     // If you choose to never use a proxy server and always connect directly,
     // all other options are ignored.
     public void testProxy_ModeDirect() throws Throwable {
-        String mode = ProxyChangeListener.MODE_DIRECT;
+        String mode = ProxyRestriction.MODE_DIRECT;
         Log.v(TAG, "== Testing " + mode + " ==");
 
         // set the restrictions
         setProxyRestrictions(mode, null, null, null);
 
         // check configured proxy mode
-        String configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        String configuredMode = MdmManager.getMdmProxyMode();
         assertEquals(mode + ": configuration", mode, configuredMode);
 
         // get the proxy config from ProxyChangeListener
-        ProxyChangeListener.ProxyConfig pc = ProxyChangeListener.getMdmProxyConfig();
-        assertNull(mode +": proxyConfig should be null", pc);
+        boolean valid = MdmManager.isMdmProxyCfgValid();
+        assertFalse(mode +": proxyConfig should be null", valid);
 
-        checkValue("http.proxyHost", null);
-        checkValue("http.proxyPort", null);
-        checkValue("http.nonProxyHosts", null);
+        checkValue("http.proxyHost", "");
+        checkValue("http.proxyPort", "0");
+        checkValue("http.nonProxyHosts", "");
     }
 
     // If you choose to use system proxy settings or auto detect the proxy server,
     // all other options are ignored.
     public void testProxy_ModeSystem() throws Throwable {
-        String mode = ProxyChangeListener.MODE_SYSTEM;
+        String mode = ProxyRestriction.MODE_SYSTEM;
         Log.v(TAG, "== Testing " + mode + " ==");
 
         // Clear any restrictions
@@ -142,13 +126,13 @@
         setProxyRestrictions(mode, null, null, null);
 
         // check configured proxy mode
-        String configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        String configuredMode = MdmManager.getMdmProxyMode();
         assertNotNull(configuredMode);
         assertEquals(mode + ": configuration",mode,configuredMode);
 
         // get the proxy config from ProxyChangeListener
-        ProxyChangeListener.ProxyConfig pc = ProxyChangeListener.getMdmProxyConfig();
-        assertNull(mode +": proxyConfig should be null", pc);
+        boolean valid = MdmManager.isMdmProxyCfgValid();
+        assertFalse(mode +": proxyConfig should be null", valid);
 
         checkValue("http.proxyHost", null);
         checkValue("http.proxyPort", null);
@@ -158,7 +142,7 @@
     // If you choose to use system proxy settings or auto detect the proxy server,
     // all other options are ignored.
     public void testProxy_ModeAutoDetect() throws Throwable {
-        String mode = ProxyChangeListener.MODE_AUTO_DETECT;
+        String mode = ProxyRestriction.MODE_AUTO_DETECT;
         Log.v(TAG, "== Testing " + mode + " ==");
 
         // Clear any restrictions
@@ -168,13 +152,13 @@
         setProxyRestrictions(mode, null, null, null);
 
         // check configured proxy mode
-        String configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        String configuredMode = MdmManager.getMdmProxyMode();
         assertNotNull(configuredMode);
         assertEquals(mode + ": configuration",mode,configuredMode);
 
         // get the proxy config from ProxyChangeListener
-        ProxyChangeListener.ProxyConfig pc = ProxyChangeListener.getMdmProxyConfig();
-        assertNull(mode +": proxyConfig should be null", pc);
+        boolean valid = MdmManager.isMdmProxyCfgValid();
+        assertFalse(mode +": proxyConfig should be null", valid);
 
         checkValue("http.proxyHost", null);
         checkValue("http.proxyPort", null);
@@ -184,7 +168,7 @@
     // If you choose fixed server proxy mode, you can specify further options in
     // 'Address or URL of proxy server' and 'Comma-separated list of proxy bypass rules'.
     public void testProxy_ModeFixedServers() throws Throwable {
-        String mode = ProxyChangeListener.MODE_FIXED_SERVERS;
+        String mode = ProxyRestriction.MODE_FIXED_SERVERS;
         Log.v(TAG, "== Testing " + mode + " ==");
 
         String proxyHost   = "192.241.207.220";
@@ -197,7 +181,7 @@
 
         // Test that mode didn't get set if no proxy server is set
         setProxyRestrictions(mode, null, null, null);
-        configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        configuredMode = MdmManager.getMdmProxyMode();
         assertNull(configuredMode);
 
         //
@@ -206,12 +190,10 @@
         setProxyRestrictions(mode, proxyServer, null, null);
 
         // check configured proxy mode
-        configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        configuredMode = MdmManager.getMdmProxyMode();
         assertNotNull(configuredMode);
         assertEquals(mode + ": configuration",mode,configuredMode);
 
-        logProxyConfig(ProxyChangeListener.getMdmProxyConfig());
-
         // check proxy values
         checkValue("http.proxyHost", proxyHost);
         checkValue("http.proxyPort", proxyPort);
@@ -223,12 +205,10 @@
         setProxyRestrictions(mode, proxyServer, "*.google.com, *foo.com, 127.0.0.1:8080", null);
 
         // check configured proxy mode
-        configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        configuredMode = MdmManager.getMdmProxyMode();
         assertNotNull(configuredMode);
         assertEquals(mode + ": configuration",mode,configuredMode);
 
-        logProxyConfig(ProxyChangeListener.getMdmProxyConfig());
-
         // check properties
         checkValue("http.proxyHost", proxyHost);
         checkValue("http.proxyPort", proxyPort);
@@ -240,7 +220,7 @@
     // If you choose to use a .pac proxy script, you must specify the URL to the
     // script in 'URL to a proxy .pac file'.
     public void testProxy_ModePacScript() throws Throwable {
-        String mode = ProxyChangeListener.MODE_PAC_SCRIPT;
+        String mode = ProxyRestriction.MODE_PAC_SCRIPT;
         Log.v(TAG, "== Testing " + mode + " ==");
 
         // Clear any restrictions
@@ -248,20 +228,18 @@
 
         // set the restrictions without pac url
         setProxyRestrictions(mode, null, null, null);
-        assertNull(ProxyChangeListener.getmMdmProxyMode()); // registered mode should be null
+        assertNull(MdmManager.getMdmProxyMode()); // registered mode should be null
 
         // set the restrictions
         String pacUrl = "http://internal.site:8888/example.pac";
         setProxyRestrictions(mode, null, null, pacUrl);
 
         // check configured proxy mode
-        String configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        String configuredMode = MdmManager.getMdmProxyMode();
         assertNotNull(configuredMode);
         assertEquals(mode + ": configuration",mode,configuredMode);
 
-        logProxyConfig(ProxyChangeListener.getMdmProxyConfig());
-
-        checkValue(ProxyChangeListener.PROXY_PAC_URL, pacUrl);
+        checkValue(ProxyRestriction.PROXY_PAC_URL, pacUrl);
     }
 
     public void testProxy_SwitchModesWithoutClear() throws Throwable {
@@ -279,18 +257,16 @@
         //
         // set to Fixed Servers with exclusion list
         //
-        mode = ProxyChangeListener.MODE_FIXED_SERVERS;
+        mode = ProxyRestriction.MODE_FIXED_SERVERS;
         Log.v(TAG, "-- Setting mode " + mode + " ==");
 
         setProxyRestrictions(mode, proxyServer, "*.google.com, *foo.com, 127.0.0.1:8080", null);
 
         // check configured proxy mode
-        configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        configuredMode = MdmManager.getMdmProxyMode();
         assertNotNull(configuredMode);
         assertEquals(mode + ": configuration",mode,configuredMode);
 
-        //logProxyConfig(ProxyChangeListener.getMdmProxyConfig());
-
         // check properties
         checkValue("http.proxyHost", proxyHost);
         checkValue("http.proxyPort", proxyPort);
@@ -301,23 +277,23 @@
         //
         // Now set to direct mode
         //
-        mode = ProxyChangeListener.MODE_DIRECT;
+        mode = ProxyRestriction.MODE_DIRECT;
         Log.v(TAG, "-- Setting mode " + mode + " ==");
 
         // set the restrictions
         setProxyRestrictions(mode, null, null, null);
 
         // check configured proxy mode
-        configuredMode = ProxyChangeListener.getmMdmProxyMode();
+        configuredMode = MdmManager.getMdmProxyMode();
         assertEquals(mode + ": configuration", mode, configuredMode);
 
         // get the proxy config from ProxyChangeListener
-        ProxyChangeListener.ProxyConfig pc = ProxyChangeListener.getMdmProxyConfig();
-        assertNull(mode +": proxyConfig should be null", pc);
+        boolean valid = MdmManager.isMdmProxyCfgValid();
+        assertFalse(mode +": proxyConfig should be null", valid);
 
-        checkValue("http.proxyHost", null);
-        checkValue("http.proxyPort", null);
-        checkValue("http.nonProxyHosts", null);
+        checkValue("http.proxyHost", "");
+        checkValue("http.proxyPort", "0");
+        checkValue("http.nonProxyHosts", "");
     }
 
 
@@ -333,16 +309,16 @@
                                       String nonProxyList, String pacScriptUri) {
         // Construct restriction bundle
         final Bundle restrictions = new Bundle();
-        restrictions.putString(ProxyChangeListener.PROXY_MODE, mode);
+        restrictions.putString(ProxyRestriction.PROXY_MODE, mode);
 
         if (proxyServer  != null) {
-            restrictions.putString(ProxyChangeListener.PROXY_SERVER, proxyServer);
+            restrictions.putString(ProxyRestriction.PROXY_SERVER, proxyServer);
         }
         if (nonProxyList != null) {
-            restrictions.putString(ProxyChangeListener.PROXY_BYPASS_LIST, nonProxyList);
+            restrictions.putString(ProxyRestriction.PROXY_BYPASS_LIST, nonProxyList);
         }
         if (pacScriptUri != null) {
-            restrictions.putString(ProxyChangeListener.PROXY_PAC_URL, pacScriptUri);
+            restrictions.putString(ProxyRestriction.PROXY_PAC_URL, pacScriptUri);
         }
 
         // Deliver restriction on UI thread
diff --git a/src/com/android/browser/mdm/tests/URLRestrictionsTest.java b/src/com/android/browser/mdm/tests/URLRestrictionsTest.java
index a818da6..ea921c6 100644
--- a/src/com/android/browser/mdm/tests/URLRestrictionsTest.java
+++ b/src/com/android/browser/mdm/tests/URLRestrictionsTest.java
@@ -40,7 +40,7 @@
 import com.android.browser.mdm.ManagedProfileManager;
 import com.android.browser.mdm.URLFilterRestriction;
 
-import org.chromium.chrome.browser.mdm.URLFilterRestrictionJNI;
+import org.codeaurora.swe.MdmManager;
 
 public class URLRestrictionsTest extends ActivityInstrumentationTestCase2<BrowserActivity>
         implements PreferenceKeys {
@@ -68,13 +68,13 @@
         mActivity.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                URLFilterRestrictionJNI.getInstance().isBlocked(url);
+                MdmManager.isMdmUrlBlocked(url);
             }
         });
         mInstrumentation.waitForIdleSync();
 
         // Wait for native to post the result
-        while(!URLFilterRestrictionJNI.getInstance().isBlockedResultReady()) {
+        while(!MdmManager.isMdmUrlBlockedResultReady()) {
             try {
                 Thread.sleep(10);
             } catch (InterruptedException e) {
@@ -83,7 +83,7 @@
         }
 
         // Retrieve the result
-        return URLFilterRestrictionJNI.getInstance().getBlockedResult();
+        return MdmManager.getMdmUrlBlockedResult();
     }
 
     private boolean isBlocked (final String url, boolean expected) {
