diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 311efc8..a204b36 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -605,7 +605,7 @@
                         !network.isTeardownRequested()) {
                     if (ni.isConnected() == true) {
                         // add the pid-specific dns
-                        handleDnsConfigurationChange();
+                        handleDnsConfigurationChange(networkType);
                         if (DBG) Slog.d(TAG, "special network already active");
                         return Phone.APN_ALREADY_ACTIVE;
                     }
@@ -967,7 +967,7 @@
             }
         }
         // do this before we broadcast the change
-        handleConnectivityChange();
+        handleConnectivityChange(prevNetType);
 
         sendStickyBroadcast(intent);
         /*
@@ -1123,9 +1123,6 @@
             }
         }
 
-        // do this before we broadcast the change
-        handleConnectivityChange();
-
         sendStickyBroadcast(intent);
         /*
          * If the failover network is already connected, then immediately send
@@ -1204,7 +1201,7 @@
         }
         thisNet.setTeardownRequested(false);
         updateNetworkSettings(thisNet);
-        handleConnectivityChange();
+        handleConnectivityChange(type);
         sendConnectedBroadcast(info);
     }
 
@@ -1231,38 +1228,29 @@
     }
 
     /**
-     * After any kind of change in the connectivity state of any network,
-     * make sure that anything that depends on the connectivity state of
-     * more than one network is set up correctly. We're mainly concerned
-     * with making sure that the list of DNS servers is set up  according
-     * to which networks are connected, and ensuring that the right routing
-     * table entries exist.
+     * After a change in the connectivity state of a network. We're mainly
+     * concerned with making sure that the list of DNS servers is set up
+     * according to which networks are connected, and ensuring that the
+     * right routing table entries exist.
      */
-    private void handleConnectivityChange() {
+    private void handleConnectivityChange(int netType) {
         /*
          * If a non-default network is enabled, add the host routes that
-         * will allow it's DNS servers to be accessed.  Only
-         * If both mobile and wifi are enabled, add the host routes that
-         * will allow MMS traffic to pass on the mobile network. But
-         * remove the default route for the mobile network, so that there
-         * will be only one default route, to ensure that all traffic
-         * except MMS will travel via Wi-Fi.
+         * will allow it's DNS servers to be accessed.
          */
-        handleDnsConfigurationChange();
+        handleDnsConfigurationChange(netType);
 
-        for (int netType : mPriorityList) {
-            if (mNetTrackers[netType].getNetworkInfo().isConnected()) {
-                if (mNetAttributes[netType].isDefault()) {
-                    addDefaultRoute(mNetTrackers[netType]);
-                } else {
-                    addPrivateDnsRoutes(mNetTrackers[netType]);
-                }
+        if (mNetTrackers[netType].getNetworkInfo().isConnected()) {
+            if (mNetAttributes[netType].isDefault()) {
+                addDefaultRoute(mNetTrackers[netType]);
             } else {
-                if (mNetAttributes[netType].isDefault()) {
-                    removeDefaultRoute(mNetTrackers[netType]);
-                } else {
-                    removePrivateDnsRoutes(mNetTrackers[netType]);
-                }
+                addPrivateDnsRoutes(mNetTrackers[netType]);
+            }
+        } else {
+            if (mNetAttributes[netType].isDefault()) {
+                removeDefaultRoute(mNetTrackers[netType]);
+            } else {
+                removePrivateDnsRoutes(mNetTrackers[netType]);
             }
         }
     }
@@ -1310,18 +1298,13 @@
         if (p == null) return;
         String interfaceName = p.getInterfaceName();
         InetAddress defaultGatewayAddr = p.getGateway();
-        boolean defaultRouteSet = nt.isDefaultRouteSet();
 
-        if ((interfaceName != null) && (defaultGatewayAddr != null ) &&
-                (defaultRouteSet == false)) {
-            boolean error = (NetworkUtils.setDefaultRoute(interfaceName, defaultGatewayAddr) < 0);
-
-            if (DBG && !error) {
+        if ((interfaceName != null) && (defaultGatewayAddr != null )) {
+            if ((NetworkUtils.setDefaultRoute(interfaceName, defaultGatewayAddr) >= 0) && DBG) {
                 NetworkInfo networkInfo = nt.getNetworkInfo();
                 Slog.d(TAG, "addDefaultRoute for " + networkInfo.getTypeName() +
                         " (" + interfaceName + "), GatewayAddr=" + defaultGatewayAddr);
             }
-            nt.defaultRouteSet(!error);
         }
     }
 
@@ -1330,16 +1313,13 @@
         NetworkProperties p = nt.getNetworkProperties();
         if (p == null) return;
         String interfaceName = p.getInterfaceName();
-        boolean defaultRouteSet = nt.isDefaultRouteSet();
 
-        if (interfaceName != null && defaultRouteSet == true) {
-            boolean error = (NetworkUtils.removeDefaultRoute(interfaceName) < 0);
-            if (DBG && !error) {
+        if (interfaceName != null) {
+            if ((NetworkUtils.removeDefaultRoute(interfaceName) >= 0) && DBG) {
                 NetworkInfo networkInfo = nt.getNetworkInfo();
                 Slog.d(TAG, "removeDefaultRoute for " + networkInfo.getTypeName() + " (" +
                         interfaceName + ")");
             }
-            nt.defaultRouteSet(error);
         }
     }
 
@@ -1480,42 +1460,37 @@
         SystemProperties.set("net.dnschange", "" + (n+1));
     }
 
-    private void handleDnsConfigurationChange() {
+    private void handleDnsConfigurationChange(int netType) {
         // add default net's dns entries
-        for (int x = mPriorityList.length-1; x>= 0; x--) {
-            int netType = mPriorityList[x];
-            NetworkStateTracker nt = mNetTrackers[netType];
-            if (nt != null && nt.getNetworkInfo().isConnected() &&
-                    !nt.isTeardownRequested()) {
-                NetworkProperties p = nt.getNetworkProperties();
-                if (p == null) continue;
-                Collection<InetAddress> dnses = p.getDnses();
-                if (mNetAttributes[netType].isDefault()) {
-                    int j = 1;
-                    for (InetAddress dns : dnses) {
-                        if (DBG) {
-                            Slog.d(TAG, "adding dns " + dns + " for " +
-                                    nt.getNetworkInfo().getTypeName());
-                        }
-                        SystemProperties.set("net.dns" + j++, dns.getHostAddress());
+        NetworkStateTracker nt = mNetTrackers[netType];
+        if (nt != null && nt.getNetworkInfo().isConnected() && !nt.isTeardownRequested()) {
+            NetworkProperties p = nt.getNetworkProperties();
+            if (p == null) return;
+            Collection<InetAddress> dnses = p.getDnses();
+            if (mNetAttributes[netType].isDefault()) {
+                int j = 1;
+                for (InetAddress dns : dnses) {
+                    if (DBG) {
+                        Slog.d(TAG, "adding dns " + dns + " for " +
+                                nt.getNetworkInfo().getTypeName());
                     }
-                    for (int k=j ; k<mNumDnsEntries; k++) {
-                        if (DBG) Slog.d(TAG, "erasing net.dns" + k);
-                        SystemProperties.set("net.dns" + k, "");
-                    }
-                    mNumDnsEntries = j;
-                } else {
-                    // set per-pid dns for attached secondary nets
-                    List pids = mNetRequestersPids[netType];
-                    for (int y=0; y< pids.size(); y++) {
-                        Integer pid = (Integer)pids.get(y);
-                        writePidDns(dnses, pid.intValue());
-                    }
+                    SystemProperties.set("net.dns" + j++, dns.getHostAddress());
+                }
+                for (int k=j ; k<mNumDnsEntries; k++) {
+                    if (DBG) Slog.d(TAG, "erasing net.dns" + k);
+                    SystemProperties.set("net.dns" + k, "");
+                }
+                mNumDnsEntries = j;
+            } else {
+                // set per-pid dns for attached secondary nets
+                List pids = mNetRequestersPids[netType];
+                for (int y=0; y< pids.size(); y++) {
+                    Integer pid = (Integer)pids.get(y);
+                    writePidDns(dnses, pid.intValue());
                 }
             }
+            bumpDns();
         }
-
-        bumpDns();
     }
 
     private int getRestoreDefaultNetworkDelay() {
@@ -1654,9 +1629,11 @@
                             (Notification) msg.obj);
 
                 case NetworkStateTracker.EVENT_CONFIGURATION_CHANGED:
-                    handleDnsConfigurationChange();
+                    // TODO - make this handle ip/proxy/gateway/dns changes
+                    info = (NetworkInfo) msg.obj;
+                    type = info.getType();
+                    handleDnsConfigurationChange(type);
                     break;
-
                 case NetworkStateTracker.EVENT_ROAMING_CHANGED:
                     // fill me in
                     break;
