diff --git a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
index d6d0def..0bbe3b5 100644
--- a/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
+++ b/service-t/src/com/android/server/ethernet/EthernetNetworkFactory.java
@@ -248,25 +248,6 @@
         return true;
     }
 
-    private boolean setStaticIpAddress(StaticIpConfiguration staticConfig) {
-        if (staticConfig.ipAddress != null &&
-                staticConfig.gateway != null &&
-                staticConfig.dnsServers.size() > 0) {
-            try {
-                Log.i(TAG, "Applying static IPv4 configuration to " + mIface + ": " + staticConfig);
-                InterfaceConfiguration config = mNMService.getInterfaceConfig(mIface);
-                config.setLinkAddress(staticConfig.ipAddress);
-                mNMService.setInterfaceConfig(mIface, config);
-                return true;
-            } catch(RemoteException|IllegalStateException e) {
-               Log.e(TAG, "Setting static IP address failed: " + e.getMessage());
-            }
-        } else {
-            Log.e(TAG, "Invalid static IP configuration.");
-        }
-        return false;
-    }
-
     public void updateAgent() {
         if (mNetworkAgent == null) return;
         if (DBG) {
@@ -332,55 +313,52 @@
                     mNetworkInfo));
         }
 
-        LinkProperties linkProperties;
-
         IpConfiguration config = mEthernetManager.getConfiguration();
 
-        if (config.getIpAssignment() == IpAssignment.STATIC) {
-            if (!setStaticIpAddress(config.getStaticIpConfiguration())) {
-                // We've already logged an error.
-                return;
-            }
-            linkProperties = config.getStaticIpConfiguration().toLinkProperties(mIface);
-        } else {
-            mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr);
-            IpManager.Callback ipmCallback = new IpManager.Callback() {
-                @Override
-                public void onProvisioningSuccess(LinkProperties newLp) {
-                    mHandler.post(() -> onIpLayerStarted(newLp));
-                }
-
-                @Override
-                public void onProvisioningFailure(LinkProperties newLp) {
-                    mHandler.post(() -> onIpLayerStopped(newLp));
-                }
-
-                @Override
-                public void onLinkPropertiesChange(LinkProperties newLp) {
-                    mHandler.post(() -> updateLinkProperties(newLp));
-                }
-            };
-
-            stopIpManager();
-            mIpManager = new IpManager(mContext, mIface, ipmCallback);
-
-            if (config.getProxySettings() == ProxySettings.STATIC ||
-                    config.getProxySettings() == ProxySettings.PAC) {
-                mIpManager.setHttpProxy(config.getHttpProxy());
+        mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr);
+        IpManager.Callback ipmCallback = new IpManager.Callback() {
+            @Override
+            public void onProvisioningSuccess(LinkProperties newLp) {
+                mHandler.post(() -> onIpLayerStarted(newLp));
             }
 
-            final String tcpBufferSizes = mContext.getResources().getString(
-                    com.android.internal.R.string.config_ethernet_tcp_buffers);
-            if (!TextUtils.isEmpty(tcpBufferSizes)) {
-                mIpManager.setTcpBufferSizes(tcpBufferSizes);
+            @Override
+            public void onProvisioningFailure(LinkProperties newLp) {
+                mHandler.post(() -> onIpLayerStopped(newLp));
             }
 
-            final ProvisioningConfiguration provisioningConfiguration =
-                    mIpManager.buildProvisioningConfiguration()
-                            .withProvisioningTimeoutMs(0)
-                            .build();
-            mIpManager.startProvisioning(provisioningConfiguration);
+            @Override
+            public void onLinkPropertiesChange(LinkProperties newLp) {
+                mHandler.post(() -> updateLinkProperties(newLp));
+            }
+        };
+
+        stopIpManager();
+        mIpManager = new IpManager(mContext, mIface, ipmCallback);
+
+        if (config.getProxySettings() == ProxySettings.STATIC ||
+                config.getProxySettings() == ProxySettings.PAC) {
+            mIpManager.setHttpProxy(config.getHttpProxy());
         }
+
+        final String tcpBufferSizes = mContext.getResources().getString(
+                com.android.internal.R.string.config_ethernet_tcp_buffers);
+        if (!TextUtils.isEmpty(tcpBufferSizes)) {
+            mIpManager.setTcpBufferSizes(tcpBufferSizes);
+        }
+
+        final ProvisioningConfiguration provisioningConfiguration;
+        if (config.getIpAssignment() == IpAssignment.STATIC) {
+            provisioningConfiguration = IpManager.buildProvisioningConfiguration()
+                    .withStaticConfiguration(config.getStaticIpConfiguration())
+                    .build();
+        } else {
+            provisioningConfiguration = mIpManager.buildProvisioningConfiguration()
+                    .withProvisioningTimeoutMs(0)
+                    .build();
+        }
+
+        mIpManager.startProvisioning(provisioningConfiguration);
     }
 
     /**
@@ -449,6 +427,8 @@
         mNetworkCapabilities = new NetworkCapabilities();
         mNetworkCapabilities.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
         mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+        mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
+        mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
         mNetworkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
         // We have no useful data on bandwidth. Say 100M up and 100M down. :-(
         mNetworkCapabilities.setLinkUpstreamBandwidthKbps(100 * 1000);
