diff --git a/api/system-current.txt b/api/system-current.txt
index 14b56c7..351ec8e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -8367,6 +8367,7 @@
     field public static final java.lang.String ACTION_MANAGE_APP_PERMISSIONS = "android.intent.action.MANAGE_APP_PERMISSIONS";
     field public static final java.lang.String ACTION_MANAGE_NETWORK_USAGE = "android.intent.action.MANAGE_NETWORK_USAGE";
     field public static final java.lang.String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
+    field public static final java.lang.String ACTION_MANAGE_PERMISSIONS = "android.intent.action.MANAGE_PERMISSIONS";
     field public static final java.lang.String ACTION_MANAGE_PERMISSION_APPS = "android.intent.action.MANAGE_PERMISSION_APPS";
     field public static final java.lang.String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
     field public static final java.lang.String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 7d76760..2db623b 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1535,6 +1535,22 @@
             "android.intent.action.MANAGE_APP_PERMISSIONS";
 
     /**
+     * Activity action: Launch UI to manage permissions.
+     * <p>
+     * Input: Nothing.
+     * </p>
+     * <p>
+     * Output: Nothing.
+     * </p>
+     *
+     * @hide
+     */
+    @SystemApi
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_MANAGE_PERMISSIONS =
+            "android.intent.action.MANAGE_PERMISSIONS";
+
+    /**
      * Intent extra: An app package name.
      * <p>
      * Type: String
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 79532e4..608d718 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -678,6 +678,7 @@
 
     <!-- Allows an app to use fingerprint hardware. -->
     <permission android:name="android.permission.USE_FINGERPRINT"
+        android:permissionGroup="android.permission-group.SENSORS"
         android:label="@string/permlab_useFingerprint"
         android:description="@string/permdesc_useFingerprint"
         android:protectionLevel="dangerous" />
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java b/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java
deleted file mode 100644
index 8b38a5f..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settingslib.applications;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PermissionGroupInfo;
-import android.content.pm.PermissionInfo;
-import android.graphics.drawable.Drawable;
-import android.os.AsyncTask;
-import android.os.Build;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class PermissionsInfo {
-
-    private static final String TAG = "PermissionsInfo";
-
-    private final PackageManager mPm;
-    private final ArrayList<PermissionGroup> mGroups = new ArrayList<>();
-    private final Map<String, PermissionGroup> mGroupLookup = new ArrayMap<>();
-    private final Callback mCallback;
-    private final Context mContext;
-    // Count of apps that request runtime permissions.
-    private int mRuntimePermAppsCt;
-    // Count of apps that are granted runtime permissions.
-    private int mRuntimePermAppsGrantedCt;
-
-    public PermissionsInfo(Context context, Callback callback) {
-        mContext = context;
-        mPm = context.getPackageManager();
-        mCallback = callback;
-        new PermissionsLoader().execute();
-    }
-
-    public List<PermissionGroup> getGroups() {
-        synchronized (mGroups) {
-            return new ArrayList<>(mGroups);
-        }
-    }
-
-    public int getRuntimePermAppsCount() {
-        return mRuntimePermAppsCt;
-    }
-
-    public int getRuntimePermAppsGrantedCount() {
-        return mRuntimePermAppsGrantedCt;
-    }
-
-    private PermissionGroup getOrCreateGroup(String permission) {
-        PermissionGroup group = mGroupLookup.get(permission);
-        if (group == null) {
-            // Some permissions don't have a group, in that case treat them like a group
-            // and create their own PermissionGroup (only if they are runtime).
-            try {
-                PermissionInfo info = mPm.getPermissionInfo(permission, 0);
-                if (info.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) {
-                    group = new PermissionGroup();
-                    // TODO: Add default permission icon.
-                    group.icon = info.icon != 0 ? info.loadIcon(mPm) : mContext.getDrawable(
-                            com.android.internal.R.drawable.ic_perm_device_info);
-                    group.name = info.name;
-                    group.packageName = info.packageName;
-                    group.label = info.loadLabel(mPm).toString();
-                    mGroups.add(group);
-                    mGroupLookup.put(permission, group);
-                }
-            } catch (NameNotFoundException e) {
-                Log.w(TAG, "Unknown permission " + permission, e);
-            }
-        }
-        return group;
-    }
-
-    private class PermissionsLoader extends AsyncTask<Void, Void, Void> {
-
-        @Override
-        protected Void doInBackground(Void... params) {
-            List<PermissionGroupInfo> groups =
-                    mPm.getAllPermissionGroups(PackageManager.GET_META_DATA);
-            // Get the groups.
-            for (PermissionGroupInfo groupInfo : groups) {
-                PermissionGroup group = new PermissionGroup();
-                // TODO: Add default permission icon.
-                group.icon = groupInfo.icon != 0 ? groupInfo.loadIcon(mPm) : mContext.getDrawable(
-                        com.android.internal.R.drawable.ic_perm_device_info);
-                group.name = groupInfo.name;
-                group.packageName = groupInfo.packageName;
-                group.label = groupInfo.loadLabel(mPm).toString();
-                synchronized (mGroups) {
-                    mGroups.add(group);
-                }
-            }
-            // Load permissions and which are runtime.
-            for (PermissionGroup group : mGroups) {
-                try {
-                    List<PermissionInfo> permissions =
-                            mPm.queryPermissionsByGroup(group.name, 0);
-                    for (PermissionInfo info : permissions) {
-                        if (info.protectionLevel != PermissionInfo.PROTECTION_DANGEROUS) continue;
-                        mGroupLookup.put(info.name, group);
-                    }
-                } catch (NameNotFoundException e) {
-                    Log.w(TAG, "Problem getting permissions", e);
-                }
-            }
-            // Load granted info.
-            for (UserHandle user : UserManager.get(mContext).getUserProfiles()) {
-                List<PackageInfo> allApps = mPm.getInstalledPackages(
-                        PackageManager.GET_PERMISSIONS, user.getIdentifier());
-                for (PackageInfo info : allApps) {
-                    if (info.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1
-                            || info.requestedPermissions == null)  {
-                        continue;
-                    }
-                    final int N = info.requestedPermissionsFlags.length;
-                    boolean appHasRuntimePerms = false;
-                    boolean appGrantedRuntimePerms = false;
-                    for (int i = 0; i < N; i++) {
-                        boolean granted = (info.requestedPermissionsFlags[i]
-                                & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;
-                        PermissionGroup group = getOrCreateGroup(info.requestedPermissions[i]);
-                        String key = Integer.toString(info.applicationInfo.uid);
-                        if (group != null && !group.possibleApps.contains(key)) {
-                            appHasRuntimePerms = true;
-                            group.possibleApps.add(key);
-                            if (granted) {
-                                appGrantedRuntimePerms = true;
-                                group.grantedApps.add(key);
-                            }
-                        }
-                    }
-                    if (appHasRuntimePerms) {
-                        mRuntimePermAppsCt++;
-                        if (appGrantedRuntimePerms) {
-                            mRuntimePermAppsGrantedCt++;
-                        }
-                    }
-                }
-            }
-            Collections.sort(mGroups);
-
-            return null;
-        }
-
-        @Override
-        protected void onPostExecute(Void result) {
-            mCallback.onPermissionLoadComplete();
-        }
-    }
-
-    public static class PermissionGroup implements Comparable<PermissionGroup> {
-        public final List<String> possibleApps = new ArrayList<>();
-        public final List<String> grantedApps = new ArrayList<>();
-        public String name;
-        public String packageName;
-        public String label;
-        public Drawable icon;
-
-        @Override
-        public int compareTo(PermissionGroup another) {
-            return label.compareTo(another.label);
-        }
-    }
-
-    public interface Callback {
-        void onPermissionLoadComplete();
-    }
-
-}
