diff --git a/src/com/android/settings/applications/AppStateAppOpsBridge.java b/src/com/android/settings/applications/AppStateAppOpsBridge.java
index 1a69322..ebff54e 100644
--- a/src/com/android/settings/applications/AppStateAppOpsBridge.java
+++ b/src/com/android/settings/applications/AppStateAppOpsBridge.java
@@ -34,8 +34,11 @@
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.AppFilter;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /*
  * Connects app ops info to the ApplicationsState. Makes use of AppOpsManager to
@@ -54,7 +57,7 @@
     private final String[] mPermissions;
 
     public AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback,
-            int appOpsOpCode, String permissionName) {
+            int appOpsOpCode, String[] permissions) {
         super(appState, callback);
         mContext = context;
         mIPackageManager = AppGlobals.getPackageManager();
@@ -62,7 +65,7 @@
         mProfiles = mUserManager.getUserProfiles();
         mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
         mAppOpsOpCodes = new int[] {appOpsOpCode};
-        mPermissions = new String[] {permissionName};
+        mPermissions = permissions;
     }
 
     private boolean isThisUserAProfileOfCurrentUser(final int userId) {
@@ -77,6 +80,15 @@
 
     protected abstract void updateExtraInfo(AppEntry app, String pkg, int uid);
 
+    private boolean doesAnyPermissionMatch(String permissionToMatch, String[] permissions) {
+        for (String permission : permissions) {
+            if (permissionToMatch.equals(permission)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public PermissionState getPermissionInfo(String pkg, int uid) {
         PermissionState permissionState = new PermissionState(pkg, new UserHandle(UserHandle
                 .getUserId(uid)));
@@ -88,7 +100,7 @@
             int[] permissionFlags = permissionState.packageInfo.requestedPermissionsFlags;
             if (requestedPermissions != null) {
                 for (int i = 0; i < requestedPermissions.length; i++) {
-                    if (mPermissions[0].equals(requestedPermissions[i])) {
+                    if (doesAnyPermissionMatch(requestedPermissions[i], mPermissions)) {
                         permissionState.permissionDeclared = true;
                         if ((permissionFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
                             permissionState.staticPermissionGranted = true;
@@ -133,9 +145,15 @@
      */
     private SparseArray<ArrayMap<String, PermissionState>> getEntries() {
         try {
-            final String[] packages = mIPackageManager.getAppOpPermissionPackages(mPermissions[0]);
+            Set<String> packagesSet = new HashSet<>();
+            for (String permission : mPermissions) {
+                String[] pkgs = mIPackageManager.getAppOpPermissionPackages(permission);
+                if (pkgs != null) {
+                    packagesSet.addAll(Arrays.asList(pkgs));
+                }
+            }
 
-            if (packages == null) {
+            if (packagesSet.isEmpty()) {
                 // No packages are requesting permission as specified by mPermissions.
                 return null;
             }
@@ -147,7 +165,7 @@
                 final ArrayMap<String, PermissionState> entriesForProfile = new ArrayMap<>();
                 final int profileId = profile.getIdentifier();
                 entries.put(profileId, entriesForProfile);
-                for (final String packageName : packages) {
+                for (final String packageName : packagesSet) {
                     final boolean isAvailable = mIPackageManager.isPackageAvailable(packageName,
                             profileId);
                     if (!shouldIgnorePackage(packageName) && isAvailable) {
@@ -193,7 +211,7 @@
             }
         } catch (RemoteException e) {
             Log.w(TAG, "PackageManager is dead. Can't get list of packages granted "
-                    + mPermissions[0], e);
+                    + mPermissions, e);
             return;
         }
     }
@@ -223,7 +241,7 @@
             if (pe == null) {
                 Log.w(TAG, "AppOp permission exists for package " + packageOp.getPackageName()
                         + " of user " + userId + " but package doesn't exist or did not request "
-                        + mPermissions[0] + " access");
+                        + mPermissions + " access");
                 continue;
             }
 
diff --git a/src/com/android/settings/applications/AppStateOverlayBridge.java b/src/com/android/settings/applications/AppStateOverlayBridge.java
index c603028..71a6037 100644
--- a/src/com/android/settings/applications/AppStateOverlayBridge.java
+++ b/src/com/android/settings/applications/AppStateOverlayBridge.java
@@ -34,9 +34,12 @@
     private static final String TAG = "AppStateOverlayBridge";
     private static final int APP_OPS_OP_CODE = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
     private static final String PM_SYSTEM_ALERT_WINDOW = Manifest.permission.SYSTEM_ALERT_WINDOW;
+    private static final String[] PM_PERMISSION = {
+            PM_SYSTEM_ALERT_WINDOW
+    };
 
     public AppStateOverlayBridge(Context context, ApplicationsState appState, Callback callback) {
-        super(context, appState, callback, APP_OPS_OP_CODE, PM_SYSTEM_ALERT_WINDOW);
+        super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSION);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/AppStateUsageBridge.java b/src/com/android/settings/applications/AppStateUsageBridge.java
index ef5a2c7..70a3ae6 100644
--- a/src/com/android/settings/applications/AppStateUsageBridge.java
+++ b/src/com/android/settings/applications/AppStateUsageBridge.java
@@ -35,9 +35,12 @@
 
     private static final String PM_USAGE_STATS = Manifest.permission.PACKAGE_USAGE_STATS;
     private static final int APP_OPS_OP_CODE = AppOpsManager.OP_GET_USAGE_STATS;
+    private static final String[] PM_PERMISSION = {
+            PM_USAGE_STATS
+    };
 
     public AppStateUsageBridge(Context context, ApplicationsState appState, Callback callback) {
-        super(context, appState, callback, APP_OPS_OP_CODE, PM_USAGE_STATS);
+        super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSION);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/AppStateWriteSettingsBridge.java b/src/com/android/settings/applications/AppStateWriteSettingsBridge.java
index 9dbe13b..7cdf7ea 100644
--- a/src/com/android/settings/applications/AppStateWriteSettingsBridge.java
+++ b/src/com/android/settings/applications/AppStateWriteSettingsBridge.java
@@ -34,10 +34,16 @@
     private static final String TAG = "AppStateWriteSettingsBridge";
     private static final int APP_OPS_OP_CODE = AppOpsManager.OP_WRITE_SETTINGS;
     private static final String PM_WRITE_SETTINGS = Manifest.permission.WRITE_SETTINGS;
+    private static final String PM_CHANGE_NETWORK_STATE = Manifest.permission.CHANGE_NETWORK_STATE;
+    // CHANGE_NETWORK_STATE is now merged with WRITE_SETTINGS
+    private static final String[] PM_PERMISSIONS = {
+            PM_WRITE_SETTINGS,
+            PM_CHANGE_NETWORK_STATE
+    };
 
     public AppStateWriteSettingsBridge(Context context, ApplicationsState appState, Callback
             callback) {
-        super(context, appState, callback, APP_OPS_OP_CODE, PM_WRITE_SETTINGS);
+        super(context, appState, callback, APP_OPS_OP_CODE, PM_PERMISSIONS);
     }
 
     @Override
