diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
index 12cc21e..2873f91 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -51,8 +51,8 @@
     private ConnectivityManager mCm;
     private WifiManager mWifiManager;
     private PackageManager mPackageManager;
-    // must include both mobile data + wifi
-    private static final int MIN_NUM_NETWORK_TYPES = 2;
+    // device could have only one interface: data, wifi.
+    private static final int MIN_NUM_NETWORK_TYPES = 1;
 
     @Override
     protected void setUp() throws Exception {
@@ -68,28 +68,27 @@
         args = {int.class}
     )
     public void testGetNetworkInfo() {
-
-        // this test assumes that there are at least two network types.
         assertTrue(mCm.getAllNetworkInfo().length >= MIN_NUM_NETWORK_TYPES);
-        NetworkInfo ni = mCm.getNetworkInfo(1);
-        State state = ni.getState();
-        assertTrue(State.UNKNOWN.ordinal() >= state.ordinal()
-                && state.ordinal() >= State.CONNECTING.ordinal());
-        DetailedState ds = ni.getDetailedState();
-        assertTrue(DetailedState.FAILED.ordinal() >= ds.ordinal()
-                && ds.ordinal() >= DetailedState.IDLE.ordinal());
-
-        ni = mCm.getNetworkInfo(0);
-        state = ni.getState();
-        assertTrue(State.UNKNOWN.ordinal() >= state.ordinal()
-                && state.ordinal() >= State.CONNECTING.ordinal());
-        ds = ni.getDetailedState();
-        assertTrue(DetailedState.FAILED.ordinal() >= ds.ordinal()
-                && ds.ordinal() >= DetailedState.IDLE.ordinal());
-
+        NetworkInfo ni = mCm.getNetworkInfo(TYPE_WIFI);
+        if (ni != null) {
+            State state = ni.getState();
+            assertTrue(State.UNKNOWN.ordinal() >= state.ordinal()
+                       && state.ordinal() >= State.CONNECTING.ordinal());
+            DetailedState ds = ni.getDetailedState();
+            assertTrue(DetailedState.FAILED.ordinal() >= ds.ordinal()
+                       && ds.ordinal() >= DetailedState.IDLE.ordinal());
+        }
+        ni = mCm.getNetworkInfo(TYPE_MOBILE);
+        if (ni != null) {
+            State state = ni.getState();
+            assertTrue(State.UNKNOWN.ordinal() >= state.ordinal()
+                    && state.ordinal() >= State.CONNECTING.ordinal());
+            DetailedState ds = ni.getDetailedState();
+            assertTrue(DetailedState.FAILED.ordinal() >= ds.ordinal()
+                    && ds.ordinal() >= DetailedState.IDLE.ordinal());
+        }
         ni = mCm.getNetworkInfo(-1);
         assertNull(ni);
-
     }
 
     @TestTargets({
@@ -142,9 +141,21 @@
         final String invalidateFeature = "invalidateFeature";
         final String mmsFeature = "enableMMS";
         final int failureCode = -1;
+        final int wifiOnlyStartFailureCode = 3;
+        final int wifiOnlyStopFailureCode = 1;
 
-        assertEquals(failureCode, mCm.startUsingNetworkFeature(TYPE_MOBILE, invalidateFeature));
-        assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE, invalidateFeature));
+        NetworkInfo ni = mCm.getNetworkInfo(TYPE_MOBILE);
+        if (ni != null) {
+            assertEquals(failureCode, mCm.startUsingNetworkFeature(TYPE_MOBILE,
+                    invalidateFeature));
+            assertEquals(failureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE,
+                    invalidateFeature));
+        } else {
+            assertEquals(wifiOnlyStartFailureCode, mCm.startUsingNetworkFeature(TYPE_MOBILE,
+                    invalidateFeature));
+            assertEquals(wifiOnlyStopFailureCode, mCm.stopUsingNetworkFeature(TYPE_MOBILE,
+                    invalidateFeature));
+        }
 
         // Should return failure(-1) because MMS is not supported on WIFI.
         assertEquals(failureCode, mCm.startUsingNetworkFeature(TYPE_WIFI, mmsFeature));
diff --git a/tests/cts/net/src/android/net/cts/NetworkInfoTest.java b/tests/cts/net/src/android/net/cts/NetworkInfoTest.java
index 99e8e15..b333be7 100644
--- a/tests/cts/net/src/android/net/cts/NetworkInfoTest.java
+++ b/tests/cts/net/src/android/net/cts/NetworkInfoTest.java
@@ -120,50 +120,47 @@
     public void testAccessNetworkInfoProperties() {
         ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(
                 Context.CONNECTIVITY_SERVICE);
-
         NetworkInfo[] ni = cm.getAllNetworkInfo();
         assertTrue(ni.length >= 2);
 
-        assertFalse(ni[TYPE_MOBILE].isFailover());
-        assertFalse(ni[TYPE_WIFI].isFailover());
-
-        // test environment:connect as TYPE_MOBILE, and connect to internet.
-        assertEquals(TYPE_MOBILE, ni[TYPE_MOBILE].getType());
-        assertEquals(TYPE_WIFI, ni[TYPE_WIFI].getType());
-
-        // don't know the return value
-        ni[TYPE_MOBILE].getSubtype();
-        ni[TYPE_WIFI].getSubtype();
-
-        assertEquals(MOBILE_TYPE_NAME, ni[TYPE_MOBILE].getTypeName());
-        assertEquals(WIFI_TYPE_NAME, ni[TYPE_WIFI].getTypeName());
-
-        // don't know the return value
-        ni[TYPE_MOBILE].getSubtypeName();
-        ni[TYPE_WIFI].getSubtypeName();
-
-        if(ni[TYPE_MOBILE].isConnectedOrConnecting()) {
-            assertTrue(ni[TYPE_MOBILE].isAvailable());
-            assertTrue(ni[TYPE_MOBILE].isConnected());
-            assertEquals(State.CONNECTED, ni[TYPE_MOBILE].getState());
-            assertEquals(DetailedState.CONNECTED, ni[TYPE_MOBILE].getDetailedState());
-            ni[TYPE_MOBILE].getReason();
-            ni[TYPE_MOBILE].getExtraInfo();
+        for (NetworkInfo netInfo: ni) {
+            switch (netInfo.getType()) {
+                case TYPE_MOBILE:
+                    // don't know the return value
+                    netInfo.getSubtype();
+                    assertEquals(MOBILE_TYPE_NAME, netInfo.getTypeName());
+                    // don't know the return value
+                    netInfo.getSubtypeName();
+                    if(netInfo.isConnectedOrConnecting()) {
+                        assertTrue(netInfo.isAvailable());
+                        assertTrue(netInfo.isConnected());
+                        assertEquals(State.CONNECTED, netInfo.getState());
+                        assertEquals(DetailedState.CONNECTED, netInfo.getDetailedState());
+                        netInfo.getReason();
+                        netInfo.getExtraInfo();
+                    }
+                    assertFalse(netInfo.isRoaming());
+                    assertNotNull(netInfo.toString());
+                    break;
+                case TYPE_WIFI:
+                    netInfo.getSubtype();
+                    assertEquals(WIFI_TYPE_NAME, netInfo.getTypeName());
+                    netInfo.getSubtypeName();
+                    if(netInfo.isConnectedOrConnecting()) {
+                        assertTrue(netInfo.isAvailable());
+                        assertTrue(netInfo.isConnected());
+                        assertEquals(State.CONNECTED, netInfo.getState());
+                        assertEquals(DetailedState.CONNECTED, netInfo.getDetailedState());
+                        netInfo.getReason();
+                        netInfo.getExtraInfo();
+                    }
+                    assertFalse(netInfo.isRoaming());
+                    assertNotNull(netInfo.toString());
+                    break;
+                 // TODO: Add BLUETOOTH_TETHER testing
+                 default:
+                     break;
+            }
         }
-
-        if(ni[TYPE_WIFI].isConnectedOrConnecting()) {
-            assertTrue(ni[TYPE_WIFI].isAvailable());
-            assertTrue(ni[TYPE_WIFI].isConnected());
-            assertEquals(State.CONNECTED, ni[TYPE_WIFI].getState());
-            assertEquals(DetailedState.CONNECTED, ni[TYPE_WIFI].getDetailedState());
-            ni[TYPE_WIFI].getReason();
-            ni[TYPE_WIFI].getExtraInfo();
-        }
-
-        assertFalse(ni[TYPE_MOBILE].isRoaming());
-        assertFalse(ni[TYPE_WIFI].isRoaming());
-
-        assertNotNull(ni[TYPE_MOBILE].toString());
-        assertNotNull(ni[TYPE_WIFI].toString());
     }
 }
