diff --git a/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java b/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
index 7d5742e..69f3ee8 100644
--- a/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
+++ b/tests/tests/media/src/android/media/cts/ClearKeySystemTest.java
@@ -344,24 +344,25 @@
             return;
         }
 
-        IConnectionStatus wifiStatus = new WifiStatus(mContext);
-        if (!wifiStatus.isEnabled()) {
-            throw new Error("Wifi is not enabled, please enable Wifi to run tests.");
+        IConnectionStatus connectionStatus = new ConnectionStatus(mContext);
+        if (!connectionStatus.isAvailable()) {
+            throw new Error("Network is not available, reason: " +
+                    connectionStatus.getNotConnectedReason());
         }
-        // If Wifi is not connected, recheck the status a few times.
+
+        // If device is not online, recheck the status a few times.
         int retries = 0;
-        while (!wifiStatus.isConnected()) {
+        while (!connectionStatus.isConnected()) {
             if (retries++ >= CONNECTION_RETRIES) {
-                wifiStatus.printConnectionInfo();
-                throw new Error("Wifi is not connected, reason: " +
-                        wifiStatus.getNotConnectedReason());
+                throw new Error("Device is not online, reason: " +
+                        connectionStatus.getNotConnectedReason());
             }
             try {
                 Thread.sleep(100);
             } catch (InterruptedException e) {
             }
         }
-        wifiStatus.testConnection(videoUrl);
+        connectionStatus.testConnection(videoUrl);
 
         mSessionId = openSession(drm);
         mMediaCodecPlayer = new MediaCodecClearKeyPlayer(
diff --git a/tests/tests/media/src/android/media/cts/WifiStatus.java b/tests/tests/media/src/android/media/cts/ConnectionStatus.java
similarity index 77%
rename from tests/tests/media/src/android/media/cts/WifiStatus.java
rename to tests/tests/media/src/android/media/cts/ConnectionStatus.java
index c2577f1..37fc75e 100644
--- a/tests/tests/media/src/android/media/cts/WifiStatus.java
+++ b/tests/tests/media/src/android/media/cts/ConnectionStatus.java
@@ -20,8 +20,6 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.Uri;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
 import android.util.Log;
 
 import java.io.BufferedReader;
@@ -32,19 +30,17 @@
 
 /**
  * A class that implements IConnectionStatus interface
- * to report and test Wifi connection.
+ * to report and test connection status.
  */
-public class WifiStatus implements IConnectionStatus {
+public class ConnectionStatus implements IConnectionStatus {
 
-    private static final String TAG = "WifiStatus";
+    private static final String TAG = "ConnectionStatus";
 
     private ConnectivityManager mConnectivityManager;
-    private WifiManager mWifiManager;
 
-    public WifiStatus(Context context) {
+    public ConnectionStatus(Context context) {
         mConnectivityManager =
                 (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
     }
 
     public String getNotConnectedReason() {
@@ -52,7 +48,7 @@
         if (networkInfo != null) {
             return networkInfo.getReason();
         } else {
-            return "Cannot get network info";
+            return "Network info is not available.";
         }
     }
 
@@ -66,22 +62,6 @@
         return (networkInfo != null) && networkInfo.isConnected();
     }
 
-    public boolean isEnabled() {
-        return mWifiManager.isWifiEnabled();
-    }
-
-    public void printConnectionInfo() {
-        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-        if (wifiInfo == null) {
-          throw new Error("Fail to get Wifi connection info");
-        }
-
-        Log.d(TAG, "ssid=" + wifiInfo.getSSID());
-        Log.d(TAG, "frequency=" + wifiInfo.getFrequency() + " " + WifiInfo.FREQUENCY_UNITS);
-        Log.d(TAG, "rssi=" + wifiInfo.getRssi() + " dBm");
-        Log.d(TAG, "link speed=" + wifiInfo.getLinkSpeed() + " " + WifiInfo.LINK_SPEED_UNITS);
-    }
-
     /**
      * Print lines.
      *
@@ -152,14 +132,6 @@
     }
 
     public void testConnection(Uri uri) {
-        final String GOOG = "www.google.com";
-
-        if (pingTest(GOOG)) {
-            Log.d(TAG, "Successfully pinged " + GOOG);
-        } else {
-            Log.e(TAG, "Failed to ping " + GOOG);
-        }
-
         if (pingTest(uri.getHost())) {
             Log.d(TAG, "Successfully pinged " + uri.getHost());
         } else {
diff --git a/tests/tests/media/src/android/media/cts/IConnectionStatus.java b/tests/tests/media/src/android/media/cts/IConnectionStatus.java
index 39e2781..17d5ff7 100644
--- a/tests/tests/media/src/android/media/cts/IConnectionStatus.java
+++ b/tests/tests/media/src/android/media/cts/IConnectionStatus.java
@@ -29,10 +29,6 @@
 
     public boolean isConnected();
 
-    public boolean isEnabled();
-
-    public void printConnectionInfo();
-
     public void testConnection(Uri uri);
 }
 
