http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
new file mode 100644
index 0000000..1f0feb5
--- /dev/null
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
@@ -0,0 +1,158 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+
+<div fxFill>
+    <div fxLayout="row" fxLayoutAlign="space-between center" class="pad-top-sm 
pad-bottom-md pad-left-md pad-right-md">
+        <span class="md-card-title">{{nfRegistryService.user.identity}}</span>
+        <button mat-icon-button (click)="closeSideNav()">
+            <mat-icon color="primary">close</mat-icon>
+        </button>
+    </div>
+    <div class="pad-bottom-md pad-left-md pad-right-md" flex 
fxLayoutAlign="start center">
+        <mat-input-container flex>
+            <input #usernameInput
+                   matInput
+                   
[disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite 
|| (nfRegistryService.currentUser.identity === nfRegistryService.user.identity)"
+                   placeholder="Identity/User Name"
+                   value="{{nfRegistryService.user.identity}}"
+                   [(ngModel)]="_username">
+        </mat-input-container>
+        <button [disabled]="nfRegistryService.user.identity === _username || 
(nfRegistryService.currentUser.identity === nfRegistryService.user.identity)"
+                (click)="updateUserName(usernameInput.value)"
+                class="input-button"
+                color="fds-regular"
+                mat-raised-button>
+            Save
+        </button>
+    </div>
+    <div class="pad-bottom-md pad-left-md pad-right-md" flex fxLayout="column" 
fxLayoutAlign="space-between start">
+        <div>
+            <span class="header">Special Privileges
+                <i matTooltip="Allows a user to manage NiFi Registry users and 
groups, buckets, proxies, and policies."
+                          class="pad-left-sm fa fa-question-circle-o 
help-icon"></i>
+            </span>
+        </div>
+        <mat-checkbox 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[checked]="nfRegistryService.user.resourcePermissions.buckets.canRead && 
nfRegistryService.user.resourcePermissions.buckets.canWrite && 
nfRegistryService.user.resourcePermissions.buckets.canDelete" 
(change)="toggleUserManageBucketsPrivileges($event)">
+            <span class="description">Can manage buckets</span>
+        </mat-checkbox>
+        <div flex fxLayout="row" fxLayoutAlign="space-around center">
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.buckets.canRead" 
(change)="toggleUserManageBucketsPrivileges($event, 'read')">
+                <span class="description">Read</span>
+            </mat-checkbox>
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.buckets.canWrite" 
(change)="toggleUserManageBucketsPrivileges($event, 'write')">
+                <span class="description">Write</span>
+            </mat-checkbox>
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.buckets.canDelete" 
(change)="toggleUserManageBucketsPrivileges($event, 'delete')">
+                <span class="description">Delete</span>
+            </mat-checkbox>
+        </div>
+        <mat-checkbox 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[checked]="nfRegistryService.user.resourcePermissions.tenants.canRead && 
nfRegistryService.user.resourcePermissions.tenants.canWrite && 
nfRegistryService.user.resourcePermissions.tenants.canDelete" 
(change)="toggleUserManageTenantsPrivileges($event)">
+            <span class="description">Can manage users</span>
+        </mat-checkbox>
+        <div flex fxLayout="row" fxLayoutAlign="space-around center">
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.tenants.canRead" 
(change)="toggleUserManageTenantsPrivileges($event, 'read')">
+                <span class="description">Read</span>
+            </mat-checkbox>
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.tenants.canWrite" 
(change)="toggleUserManageTenantsPrivileges($event, 'write')">
+                <span class="description">Write</span>
+            </mat-checkbox>
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.tenants.canDelete" 
(change)="toggleUserManageTenantsPrivileges($event, 'delete')">
+                <span class="description">Delete</span>
+            </mat-checkbox>
+        </div>
+        <mat-checkbox 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[checked]="nfRegistryService.user.resourcePermissions.policies.canRead && 
nfRegistryService.user.resourcePermissions.policies.canWrite && 
nfRegistryService.user.resourcePermissions.policies.canDelete" 
(change)="toggleUserManagePoliciesPrivileges($event)">
+            <span class="description">Can manage policies</span>
+        </mat-checkbox>
+        <div flex fxLayout="row" fxLayoutAlign="space-around center">
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.policies.canRead" 
(change)="toggleUserManagePoliciesPrivileges($event, 'read')">
+                <span class="description">Read</span>
+            </mat-checkbox>
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.policies.canWrite" 
(change)="toggleUserManagePoliciesPrivileges($event, 'write')">
+                <span class="description">Write</span>
+            </mat-checkbox>
+            <mat-checkbox class="pad-left-md" 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[(checked)]="nfRegistryService.user.resourcePermissions.policies.canDelete" 
(change)="toggleUserManagePoliciesPrivileges($event, 'delete')">
+                <span class="description">Delete</span>
+            </mat-checkbox>
+        </div>
+        <mat-checkbox 
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite
 || (nfRegistryService.currentUser.identity === 
nfRegistryService.user.identity)" 
[checked]="nfRegistryService.user.resourcePermissions.proxy.canWrite" 
(change)="toggleUserManageProxyPrivileges($event)">
+            <span class="description">Can proxy user requests</span>
+        </mat-checkbox>
+    </div>
+    <mat-button-toggle-group name="nifi-registry-manage-user-perspective" 
class="pad-left-md tab-toggle-group">
+        <mat-button-toggle [checked]="manageUserPerspective === 'membership'"
+                           value="membership"
+                           class="uppercase"
+                           (change)="manageUserPerspective = 'membership'"
+                           i18n="Group membership tab, user management 
sidenav|View the groups to which this user 
belongs.@@nf-admin-user-management-sidenav-membership-tab-title">
+            Membership
+        </mat-button-toggle>
+    </mat-button-toggle-group>
+    <div *ngIf="manageUserPerspective === 'membership'">
+        <div *ngIf="nfRegistryService.user.userGroups" fxFlex 
class="pad-top-md pad-bottom-sm pad-left-md pad-right-md">
+            <div flex fxLayout="row" fxLayoutAlign="space-between center">
+                <span class="md-card-title">Membership 
({{nfRegistryService.user.userGroups.length}})</span>
+                <button color="fds-secondary"
+                        
[disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite"
+                        mat-raised-button
+                        (click)="addUserToGroups()">
+                    Add To Group
+                </button>
+            </div>
+            <div 
id="nifi-registry-user-membership-list-container-column-header" fxLayout="row"
+                 fxLayoutAlign="space-between center" class="td-data-table">
+                <div class="td-data-table-column" (click)="sortGroups(column)"
+                     *ngFor="let column of nfRegistryService.userGroupsColumns"
+                     fxFlex="{{column.width}}">
+                    {{column.label}}
+                    <i *ngIf="column.active && column.sortable && 
column.sortOrder === 'ASC'" class="fa fa-caret-up"
+                       aria-hidden="true"></i>
+                    <i *ngIf="column.active && column.sortable && 
column.sortOrder === 'DESC'" class="fa fa-caret-down"
+                       aria-hidden="true"></i>
+                </div>
+            </div>
+            <div id="nifi-registry-user-membership-list-container">
+                <div fxLayout="row" fxLayoutAlign="space-between center" 
class="td-data-table-row"
+                     [ngClass]="{'selected' : row.checked}" *ngFor="let row of 
filteredUserGroups"
+                     (click)="row.checked = !row.checked">
+                    <div class="td-data-table-cell" *ngFor="let column of 
nfRegistryService.userGroupsColumns"
+                         fxFlex="{{column.width}}">
+                        <div matTooltip="{{column.format ? 
column.format(row[column.name]) : row[column.name]}}">
+                            <i class="fa fa-users push-right-sm" 
aria-hidden="true"></i>{{column.format ? column.format(row[column.name]) : 
row[column.name]}}
+                        </div>
+                    </div>
+                    <div class="td-data-table-cell">
+                        <div>
+                            <button 
(click)="removeUserFromGroup(row);row.checked = !row.checked;"
+                                    matTooltip="'Remove user from group'" 
mat-icon-button color="accent"
+                                    
*ngIf="nfRegistryService.currentUser.resourcePermissions.tenants.canWrite">
+                                <i class="fa fa-minus-circle" 
aria-hidden="true"></i>
+                            </button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="mat-padding" 
*ngIf="nfRegistryService.user.userGroups.length === 0" layout="row"
+                 layout-align="center center">
+                <h3>This user does not belong to any groups yet.</h3>
+            </div>
+        </div>
+    </div>
+    <button id="nf-registry-user-permissions-side-nav-container" 
class="push-right-md" mat-raised-button
+            color="fds-primary"
+            (click)="closeSideNav()">Close
+    </button>
+</div>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
new file mode 100644
index 0000000..59aca5f
--- /dev/null
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
@@ -0,0 +1,577 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+var covalentCore = require('@covalent/core');
+var fdsDialogsModule = require('@fluid-design-system/dialogs');
+var fdsSnackBarsModule = require('@fluid-design-system/snackbars');
+var ngCore = require('@angular/core');
+var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
+var ngRouter = require('@angular/router');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
+var ngMaterial = require('@angular/material');
+var NfRegistryAddUserToGroups = 
require('nifi-registry/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js');
+
+/**
+ * NfRegistryManageUser constructor.
+ *
+ * @param nfRegistryApi         The api service.
+ * @param nfRegistryService     The nf-registry.service module.
+ * @param tdDataTableService    The covalent data table service module.
+ * @param fdsDialogService      The FDS dialog service.
+ * @param fdsSnackBarService    The FDS snack bar service module.
+ * @param activatedRoute        The angular route module.
+ * @param router                The angular router module.
+ * @param matDialog             The angular material dialog module.
+ * @constructor
+ */
+function NfRegistryManageUser(nfRegistryApi, nfRegistryService, 
tdDataTableService, fdsDialogService, fdsSnackBarService, activatedRoute, 
router, matDialog) {
+    this.filteredUserGroups = [];
+    this.userGroupsSearchTerms = [];
+    this._username = '';
+    this.manageUserPerspective = 'membership';
+
+    // Services
+    this.nfRegistryService = nfRegistryService;
+    this.route = activatedRoute;
+    this.router = router;
+    this.dialog = matDialog;
+    this.nfRegistryApi = nfRegistryApi;
+    this.dialogService = fdsDialogService;
+    this.snackBarService = fdsSnackBarService;
+    this.dataTableService = tdDataTableService;
+};
+
+NfRegistryManageUser.prototype = {
+    constructor: NfRegistryManageUser,
+
+    /**
+     * Initialize the component.
+     */
+    ngOnInit: function () {
+        var self = this;
+        this.nfRegistryService.sidenav.open();
+
+        // subscribe to the route params
+        self.route.params
+            .switchMap(function (params) {
+                return self.nfRegistryApi.getUser(params['userId']);
+            })
+            .subscribe(function (response) {
+                self.nfRegistryService.user = response;
+                self._username = response.identity;
+                self.filterGroups();
+            });
+    },
+
+    /**
+     * Destroy the component.
+     */
+    ngOnDestroy: function () {
+        this.nfRegistryService.sidenav.close();
+    },
+
+    /**
+     * Navigate to administer users for current registry.
+     */
+    closeSideNav: function () {
+        this.router.navigateByUrl('/nifi-registry/administration/users');
+    },
+
+    /**
+     * Toggles the manage bucket privileges for the user.
+     *
+     * @param $event
+     * @param policyAction      The action to be toggled
+     */
+    toggleUserManageBucketsPrivileges: function ($event, policyAction) {
+        var self = this;
+        if($event.checked) {
+            for (var resource in this.nfRegistryService.BUCKETS_PRIVS) {
+                if 
(this.nfRegistryService.BUCKETS_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.BUCKETS_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist, let's create it
+                                    
self.nfRegistryApi.postPolicyActionResource(action, resource, 
[self.nfRegistryService.user], []).subscribe(
+                                        function (response) {
+                                            // can manage buckets privileges 
created and granted!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function(response)
 {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                } else {
+                                    // resource exists, let's update it
+                                    
policy.users.push(self.nfRegistryService.user);
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage buckets privileges 
updated!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function(response)
 {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+        } else {
+            // Remove the current user from the /buckets resources
+            for (var resource in this.nfRegistryService.BUCKETS_PRIVS) {
+                if 
(this.nfRegistryService.BUCKETS_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.BUCKETS_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist
+                                } else {
+                                    // resource exists, let's filter out the 
current user and update it
+                                    policy.users = 
policy.users.filter(function (user) {
+                                        return (user.identifier !== 
self.nfRegistryService.user.identifier) ? true : false;
+                                    })
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage buckets privileges 
updated!!!...now update the view
+                                            
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function(response)
 {
+                                                self.nfRegistryService.user = 
response;
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+
+        }
+    },
+
+    /**
+     * Toggles the manage tenants privileges for the user.
+     *
+     * @param $event
+     * @param policyAction      The action to be toggled
+     */
+    toggleUserManageTenantsPrivileges: function ($event, policyAction) {
+        var self = this;
+        if($event.checked) {
+            for (var resource in this.nfRegistryService.TENANTS_PRIVS) {
+                if 
(this.nfRegistryService.TENANTS_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.TENANTS_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist, let's create it
+                                    
self.nfRegistryApi.postPolicyActionResource(action, resource, 
[self.nfRegistryService.user], []).subscribe(
+                                        function (response) {
+                                            // can manage tenants privileges 
created and granted!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                } else {
+                                    // resource exists, let's update it
+                                    
policy.users.push(self.nfRegistryService.user);
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage tenants privileges 
updated!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+        } else {
+            // Remove the current user from the administrator resources
+            for (var resource in this.nfRegistryService.TENANTS_PRIVS) {
+                if 
(this.nfRegistryService.TENANTS_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.TENANTS_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist
+                                } else {
+                                    // resource exists, let's filter out the 
current user and update it
+                                    policy.users = 
policy.users.filter(function (user) {
+                                        return (user.identifier !== 
self.nfRegistryService.user.identifier) ? true : false;
+                                    })
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage tenants privileges 
updated!!!...now update the view
+                                            
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                self.nfRegistryService.user = 
response;
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+
+        }
+    },
+
+    /**
+     * Toggles the manage policies privileges for the user.
+     *
+     * @param $event
+     * @param policyAction      The action to be toggled
+     */
+    toggleUserManagePoliciesPrivileges: function ($event, policyAction) {
+        var self = this;
+        if($event.checked) {
+            for (var resource in this.nfRegistryService.POLICIES_PRIVS) {
+                if 
(this.nfRegistryService.POLICIES_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.POLICIES_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist, let's create it
+                                    
self.nfRegistryApi.postPolicyActionResource(action, resource, 
[self.nfRegistryService.user], []).subscribe(
+                                        function (response) {
+                                            // can manage policies privileges 
created and granted!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                } else {
+                                    // resource exists, let's update it
+                                    
policy.users.push(self.nfRegistryService.user);
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage policies privileges 
updated!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+        } else {
+            // Remove the current user from the administrator resources
+            for (var resource in this.nfRegistryService.POLICIES_PRIVS) {
+                if 
(this.nfRegistryService.POLICIES_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.POLICIES_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist
+                                } else {
+                                    // resource exists, let's filter out the 
current user and update it
+                                    policy.users = 
policy.users.filter(function (user) {
+                                        return (user.identifier !== 
self.nfRegistryService.user.identifier) ? true : false;
+                                    })
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage policies privileges 
updated!!!...now update the view
+                                            
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                self.nfRegistryService.user = 
response;
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+
+        }
+    },
+
+    /**
+     * Toggles the manage proxy privileges for the user.
+     *
+     * @param $event
+     * @param policyAction      The action to be toggled
+     */
+    toggleUserManageProxyPrivileges: function ($event, policyAction) {
+        var self = this;
+        if($event.checked) {
+            for (var resource in this.nfRegistryService.PROXY_PRIVS) {
+                if 
(this.nfRegistryService.PROXY_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.PROXY_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist, let's create it
+                                    
self.nfRegistryApi.postPolicyActionResource(action, resource, 
[self.nfRegistryService.user], []).subscribe(
+                                        function (response) {
+                                            // can manage proxy privileges 
created and granted!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                } else {
+                                    // resource exists, let's update it
+                                    
policy.users.push(self.nfRegistryService.user);
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // can manage proxy privileges 
updated!!!...now update the view
+                                            response.users.forEach(function 
(user) {
+                                                if (user.identifier === 
self.nfRegistryService.user.identifier) {
+                                                    
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                        
self.nfRegistryService.user = response;
+                                                    });
+                                                }
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+        } else {
+            // Remove the current user from the administrator resources
+            for (var resource in this.nfRegistryService.PROXY_PRIVS) {
+                if 
(this.nfRegistryService.PROXY_PRIVS.hasOwnProperty(resource)) {
+                    
this.nfRegistryService.PROXY_PRIVS[resource].forEach(function (action) {
+                        if (!policyAction || (action === policyAction)) {
+                            self.nfRegistryApi.getPolicyActionResource(action, 
resource).subscribe(function (policy) {
+                                if (policy.status && policy.status === 409) {
+                                    // resource does NOT exist
+                                } else {
+                                    // resource exists, let's filter out the 
current user and update it
+                                    policy.users = 
policy.users.filter(function (user) {
+                                        return (user.identifier !== 
self.nfRegistryService.user.identifier) ? true : false;
+                                    })
+                                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                        function (response) {
+                                            // administrator privileges 
updated!!!...now update the view
+                                            
self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier).subscribe(function
 (response) {
+                                                self.nfRegistryService.user = 
response;
+                                            });
+                                        });
+                                }
+                            });
+                        }
+                    });
+                }
+            }
+
+        }
+    },
+
+    /**
+     * Opens a modal dialog UX enabling the addition of this user to multiple 
groups.
+     */
+    addUserToGroups: function () {
+        var self = this;
+        this.dialog.open(NfRegistryAddUserToGroups, {
+            data: {
+                user: this.nfRegistryService.user
+            }
+        }).afterClosed().subscribe(function () {
+            self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier)
+                .subscribe(function (response) {
+                    self.nfRegistryService.user = response;
+                    self._username = response.identity;
+                    self.filterGroups();
+                });
+        });
+    },
+
+    /**
+     * Filter groups.
+     *
+     * @param {string} [sortBy]       The column name to sort 
`userGroupsColumns` by.
+     * @param {string} [sortOrder]    The order. Either 'ASC' or 'DES'
+     */
+    filterGroups: function (sortBy, sortOrder) {
+        // if `sortOrder` is `undefined` then use 'ASC'
+        if (sortOrder === undefined) {
+            sortOrder = 'ASC'
+        }
+        // if `sortBy` is `undefined` then find the first sortable column in 
`userGroupsColumns`
+        if (sortBy === undefined) {
+            var arrayLength = this.nfRegistryService.userGroupsColumns.length;
+            for (var i = 0; i < arrayLength; i++) {
+                if (this.nfRegistryService.userGroupsColumns[i].sortable === 
true) {
+                    sortBy = this.nfRegistryService.userGroupsColumns[i].name;
+                    //only one column can be actively sorted so we reset all 
to inactive
+                    this.nfRegistryService.userGroupsColumns.forEach(function 
(c) {
+                        c.active = false;
+                    });
+                    //and set this column as the actively sorted column
+                    this.nfRegistryService.userGroupsColumns[i].active = true;
+                    this.nfRegistryService.userGroupsColumns[i].sortOrder = 
sortOrder;
+                    break;
+                }
+            }
+        }
+
+        var newUserGroupsData = this.nfRegistryService.user.userGroups || [];
+
+        for (var i = 0; i < this.userGroupsSearchTerms.length; i++) {
+            newUserGroupsData = this.filterData(newUserGroupsData, 
this.userGroupsSearchTerms[i], true);
+        }
+
+        newUserGroupsData = this.dataTableService.sortData(newUserGroupsData, 
sortBy, sortOrder);
+        this.filteredUserGroups = newUserGroupsData;
+    },
+
+    /**
+     * Sort `groups` by `column`.
+     *
+     * @param column    The column to sort by.
+     */
+    sortGroups: function (column) {
+        if (column.sortable) {
+            var sortBy = column.name;
+            var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 
'DESC' : 'ASC';
+            this.filterGroups(sortBy, sortOrder);
+
+            //only one column can be actively sorted so we reset all to 
inactive
+            this.nfRegistryService.userGroupsColumns.forEach(function (c) {
+                c.active = false;
+            });
+            //and set this column as the actively sorted column
+            column.active = true;
+        }
+    },
+
+    /**
+     * Remove user from group.
+     *
+     * @param group
+     */
+    removeUserFromGroup: function (group) {
+        var self = this;
+        var userGroups = 
this.nfRegistryService.user.userGroups.filter(function (userGroup) {
+            if (userGroup.identifier !== group.identifier) {
+                return userGroup;
+            }
+        });
+
+        this.nfRegistryApi.updateUserGroup(group.identifier, group.identity, 
userGroups).subscribe(function (response) {
+            self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier)
+                .subscribe(function (response) {
+                    self.nfRegistryService.user = response;
+                    self.filterGroups();
+                });
+            var snackBarRef = self.snackBarService.openCoaster({
+                title: 'Success',
+                message: 'This user has been removed from the ' + 
group.identity + ' group.',
+                verticalPosition: 'bottom',
+                horizontalPosition: 'right',
+                icon: 'fa fa-check-circle-o',
+                color: '#1EB475',
+                duration: 3000
+            });
+        });
+    },
+
+    /**
+     * Update user name.
+     *
+     * @param username
+     */
+    updateUserName: function (username) {
+        var self = this;
+        this.nfRegistryApi.updateUser(this.nfRegistryService.user.identifier, 
username).subscribe(function (response) {
+            if(!response.status || response.status === 200) {
+                self.nfRegistryService.user = response;
+                self.nfRegistryService.users.filter(function(user) {
+                    if (self.nfRegistryService.user.identifier === 
user.identifier){
+                        user.identity = response.identity;
+                    }
+                });
+                var snackBarRef = self.snackBarService.openCoaster({
+                    title: 'Success',
+                    message: 'This user name has been updated.',
+                    verticalPosition: 'bottom',
+                    horizontalPosition: 'right',
+                    icon: 'fa fa-check-circle-o',
+                    color: '#1EB475',
+                    duration: 3000
+                });
+            } else if (response.status === 409) {
+                self._username = self.nfRegistryService.user.identity;
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: 'This user already exists. Please enter a 
different identity/user name.',
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+            }
+        });
+    }
+};
+
+NfRegistryManageUser.annotations = [
+    new ngCore.Component({
+        template: require('./nf-registry-manage-user.html!text')
+    })
+];
+
+NfRegistryManageUser.parameters = [
+    NfRegistryApi,
+    NfRegistryService,
+    covalentCore.TdDataTableService,
+    fdsDialogsModule.FdsDialogService,
+    fdsSnackBarsModule.FdsSnackBarService,
+    ngRouter.ActivatedRoute,
+    ngRouter.Router,
+    ngMaterial.MatDialog
+];
+
+module.exports = NfRegistryManageUser;

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html
index 4c46910..bae5218 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.html
@@ -16,12 +16,98 @@ limitations under the License.
 -->
 
 <div fxFill>
-    <div fxLayout="row" fxLayoutAlign="space-between center" class="pad-top-md 
pad-bottom-md pad-left-sm pad-right-sm">
+    <div fxLayout="row" fxLayoutAlign="space-between center" class="pad-top-sm 
pad-bottom-md pad-left-md pad-right-md">
         <span *ngIf="nfRegistryService.bucket.identifier" 
class="md-card-title">{{nfRegistryService.bucket.name}}</span>
         <button mat-icon-button (click)="closeSideNav()">
             <mat-icon color="primary">close</mat-icon>
         </button>
     </div>
+    <div class="pad-bottom-md pad-left-md pad-right-md" flex 
fxLayoutAlign="start center">
+        <mat-input-container floatPlaceholder="always" flex>
+            <input matInput placeholder="Bucket Name" 
value="{{nfRegistryService.bucket.name}}">
+        </mat-input-container>
+        <button class="input-button" color="fds-regular" mat-raised-button>
+            Save
+        </button>
+    </div>
+    <!--<div id="nifi-registry-bucket-permissions-container" 
class="mat-elevation-z5">-->
+        <!--<div fxFlex class="pad-top-md pad-bottom-sm pad-left-md 
pad-right-md">-->
+            <!--<span class="md-card-title">Policies 
({{nfRegistryService.bucket.authorizedActions.length}})</span>-->
+            <!--<div 
id="nifi-registry-bucket-permissions-list-container-column-header" 
fxLayout="row"-->
+                 <!--fxLayoutAlign="space-between center" 
class="td-data-table">-->
+                <!--<div class="td-data-table-column" 
(click)="nfRegistryService.sortBuckets(column)"-->
+                     <!--*ngFor="let column of 
nfRegistryService.bucketColumns"-->
+                     <!--fxFlex="{{column.width}}">-->
+                    <!--{{column.label}}-->
+                    <!--<i *ngIf="column.active && column.sortable && 
column.sortOrder === 'ASC'" class="fa fa-caret-up"-->
+                       <!--aria-hidden="true"></i>-->
+                    <!--<i *ngIf="column.active && column.sortable && 
column.sortOrder === 'DESC'" class="fa fa-caret-down"-->
+                       <!--aria-hidden="true"></i>-->
+                <!--</div>-->
+                <!--<div class="td-data-table-column">-->
+                    <!--<div fxLayout="row" fxLayoutAlign="end center">-->
+                        <!--<mat-checkbox class="pad-left-sm" 
[(ngModel)]="nfRegistryService.allBucketsSelected"-->
+                                      
<!--(checked)="nfRegistryService.allBucketsSelected"-->
+                                      
<!--(change)="nfRegistryService.toggleBucketsSelectAll()"></mat-checkbox>-->
+                    <!--</div>-->
+                <!--</div>-->
+            <!--</div>-->
+            <!--<div id="nifi-registry-bucket-permissions-list-container">-->
+                <!--<div fxLayout="row" fxLayoutAlign="space-between center" 
class="td-data-table-row"-->
+                     <!--[ngClass]="{'selected' : row.checked}" *ngFor="let 
row of nfRegistryService.filteredBuckets"-->
+                     <!--(click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()">-->
+                    <!--<div class="td-data-table-cell" *ngFor="let column of 
nfRegistryService.bucketColumns"-->
+                         <!--fxFlex="{{column.width}}">-->
+                        <!--<div matTooltip="{{column.format ? 
column.format(row[column.name]) : row[column.name]}}">-->
+                            <!--{{column.format ? 
column.format(row[column.name]) : row[column.name]}}-->
+                        <!--</div>-->
+                    <!--</div>-->
+                    <!--<div class="td-data-table-cell">-->
+                        <!--<div>-->
+                            <!--<div *ngIf="bucketActions.length <= 4" 
fxLayout="row" fxLayoutAlign="end center">-->
+                                <!--<button 
(click)="nfRegistryService.executeBucketAction(action, row);row.checked = 
!row.checked;"-->
+                                        <!--*ngFor="let action of 
bucketActions"-->
+                                        <!--matTooltip="{{action.tooltip}}" 
mat-icon-button color="accent"-->
+                                        <!--[disabled]="action.disabled ? '' : 
null">-->
+                                    <!--<i class="{{action.icon}}" 
aria-hidden="true"></i>-->
+                                <!--</button>-->
+                                <!--<mat-checkbox class="pad-left-sm" 
[(ngModel)]="row.checked" [checked]="row.checked"-->
+                                              
<!--(change)="nfRegistryService.determineAllBucketsSelectedState()"-->
+                                              <!--(click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>-->
+                            <!--</div>-->
+                            <!--<div *ngIf="bucketActions.length > 4" 
fxLayout="row" fxLayoutAlign="end center">-->
+                                <!--<button (click)="row.checked = 
!row.checked" matTooltip="Actions" mat-icon-button-->
+                                        
<!--[matMenuTriggerFor]="bucketTableActionMenu">-->
+                                    <!--<i class="fa fa-ellipsis-h" 
aria-hidden="true"></i>-->
+                                <!--</button>-->
+                                <!--<mat-menu #bucketTableActionMenu="matMenu" 
[overlapTrigger]="false">-->
+                                    <!--<button 
(click)="nfRegistryService.executeBucketAction(action, row);row.checked = 
!row.checked;"-->
+                                            <!--*ngFor="let action of 
bucketActions"-->
+                                            
<!--matTooltip="{{action.tooltip}}" mat-menu-item-->
+                                            <!--[disabled]="action.disabled ? 
'' : null">-->
+                                        <!--<i class="{{action.icon}}" 
aria-hidden="true"></i>-->
+                                        <!--<span>{{action.name}}</span>-->
+                                    <!--</button>-->
+                                <!--</mat-menu>-->
+                                <!--<mat-checkbox [(ngModel)]="row.checked" 
[checked]="row.checked"-->
+                                              
<!--(change)="nfRegistryService.determineAllBucketsSelectedState()"-->
+                                              <!--(click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>-->
+                            <!--</div>-->
+                        <!--</div>-->
+                        <!--<div *ngIf="!bucketActions" fxLayout="row" 
fxLayoutAlign="end center">-->
+                            <!--<mat-checkbox [(ngModel)]="row.checked" 
[checked]="row.checked"-->
+                                          
<!--(change)="nfRegistryService.determineAllBucketsSelectedState(row)"-->
+                                          <!--(click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>-->
+                        <!--</div>-->
+                    <!--</div>-->
+                <!--</div>-->
+            <!--</div>-->
+            <!--<div class="mat-padding" 
*ngIf="nfRegistryService.filteredBuckets.length === 0" layout="row"-->
+                 <!--layout-align="center center">-->
+                <!--<h3>No results to display.</h3>-->
+            <!--</div>-->
+        <!--</div>-->
+    <!--</div>-->
     <button id="nf-registry-workflow-bucket-permissions-side-nav-container" 
mat-raised-button color="fds-primary"
             (click)="closeSideNav()">Close
     </button>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
index 5ff3247..544e2d1 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
@@ -65,9 +65,9 @@ limitations under the License.
                 </div>
                 <div class="td-data-table-cell">
                     <div>
-                        <div *ngIf="bucketActions.length <= 4" fxLayout="row" 
fxLayoutAlign="end center">
+                        <div *ngIf="nfRegistryService.bucketActions.length <= 
4" fxLayout="row" fxLayoutAlign="end center">
                             <button 
(click)="nfRegistryService.executeBucketAction(action, row);row.checked = 
!row.checked;"
-                                    *ngFor="let action of bucketActions"
+                                    *ngFor="let action of 
nfRegistryService.bucketActions"
                                     matTooltip="{{action.tooltip}}" 
mat-icon-button color="accent"
                                     [disabled]="action.disabled ? '' : null">
                                 <i class="{{action.icon}}" 
aria-hidden="true"></i>
@@ -76,14 +76,14 @@ limitations under the License.
                                           
(change)="nfRegistryService.determineAllBucketsSelectedState()"
                                           (click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>
                         </div>
-                        <div *ngIf="bucketActions.length > 4" fxLayout="row" 
fxLayoutAlign="end center">
+                        <div *ngIf="nfRegistryService.bucketActions.length > 
4" fxLayout="row" fxLayoutAlign="end center">
                             <button (click)="row.checked = !row.checked" 
matTooltip="Actions" mat-icon-button
                                     
[matMenuTriggerFor]="bucketTableActionMenu">
                                 <i class="fa fa-ellipsis-h" 
aria-hidden="true"></i>
                             </button>
                             <mat-menu #bucketTableActionMenu="matMenu" 
[overlapTrigger]="false">
                                 <button 
(click)="nfRegistryService.executeBucketAction(action, row);row.checked = 
!row.checked;"
-                                        *ngFor="let action of bucketActions"
+                                        *ngFor="let action of 
nfRegistryService.bucketActions"
                                         matTooltip="{{action.tooltip}}" 
mat-menu-item
                                         [disabled]="action.disabled ? '' : 
null">
                                     <i class="{{action.icon}}" 
aria-hidden="true"></i>
@@ -95,7 +95,7 @@ limitations under the License.
                                           (click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>
                         </div>
                     </div>
-                    <div *ngIf="!bucketActions" fxLayout="row" 
fxLayoutAlign="end center">
+                    <div *ngIf="!nfRegistryService.bucketActions" 
fxLayout="row" fxLayoutAlign="end center">
                         <mat-checkbox [(ngModel)]="row.checked" 
[checked]="row.checked"
                                       
(change)="nfRegistryService.determineAllBucketsSelectedState(row)"
                                       (click)="row.checked = 
!row.checked;nfRegistryService.determineAllBucketsSelectedState()"></mat-checkbox>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
index 5a27be9..770b871 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
@@ -39,16 +39,6 @@ function NfRegistryWorkflowAdministration(nfRegistryApi, 
nfStorage, nfRegistrySe
     this.nfRegistryService = nfRegistryService;
     this.nfRegistryApi = nfRegistryApi;
     this.dialog = matDialog;
-    this.bucketActions = [{
-        'name': 'permissions',
-        'icon': 'fa fa-pencil',
-        'tooltip': 'Manage Bucket Policies',
-        'type': 'sidenav'
-    }, {
-        'name': 'Delete',
-        'icon': 'fa fa-trash',
-        'tooltip': 'Delete Bucket'
-    }];
 };
 
 NfRegistryWorkflowAdministration.prototype = {
@@ -60,21 +50,16 @@ NfRegistryWorkflowAdministration.prototype = {
     ngOnInit: function () {
         var self = this;
         this.nfRegistryService.inProgress = true;
-        // attempt kerberos authentication
-        this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
-            self.nfRegistryService.loadCurrentUser().subscribe(function 
(currentUser) {
-                self.route.params
-                    .switchMap(function (params) {
-                        self.nfRegistryService.adminPerspective = 'workflow';
-                        return self.nfRegistryApi.getBuckets();
-                    })
-                    .subscribe(function (buckets) {
-                        self.nfRegistryService.buckets = buckets;
-                        self.nfRegistryService.filterBuckets();
-                        self.nfRegistryService.inProgress = false;
-                    });
+        this.route.params
+            .switchMap(function (params) {
+                self.nfRegistryService.adminPerspective = 'workflow';
+                return self.nfRegistryApi.getBuckets();
+            })
+            .subscribe(function (buckets) {
+                self.nfRegistryService.buckets = buckets;
+                self.nfRegistryService.filterBuckets();
+                self.nfRegistryService.inProgress = false;
             });
-        });
     },
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
index febac5c..1a1641b 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
@@ -30,9 +30,8 @@ var NfRegistryExplorer = 
require('nifi-registry/components/explorer/nf-registry-
 var NfRegistryAdministration = 
require('nifi-registry/components/administration/nf-registry-administration.js');
 var NfRegistryUsersAdministration = 
require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js');
-var NfRegistryUserDetails = 
require('nifi-registry/components/administration/users/details/nf-registry-user-details.js');
-var NfRegistryUserPermissions = 
require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js');
-var NfRegistryUserGroupPermissions = 
require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.js');
+var NfRegistryManageUser = 
require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js');
+var NfRegistryManageGroup = 
require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js');
 var NfRegistryBucketPermissions = 
require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js');
 var NfRegistryWorkflowAdministration = 
require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
 var NfRegistryCreateBucket = 
require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js');
@@ -46,6 +45,8 @@ var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
+var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
+var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
 
 describe('NfRegistryWorkflowAdministration Component', function () {
     var comp;
@@ -70,9 +71,8 @@ describe('NfRegistryWorkflowAdministration Component', 
function () {
                 NfRegistryExplorer,
                 NfRegistryAdministration,
                 NfRegistryUsersAdministration,
-                NfRegistryUserDetails,
-                NfRegistryUserPermissions,
-                NfRegistryUserGroupPermissions,
+                NfRegistryManageUser,
+                NfRegistryManageGroup,
                 NfRegistryBucketPermissions,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
@@ -80,7 +80,9 @@ describe('NfRegistryWorkflowAdministration Component', 
function () {
                 NfRegistryGridListViewer,
                 NfRegistryBucketGridListViewer,
                 NfRegistryDropletGridListViewer,
-                NfPageNotFoundComponent
+                NfPageNotFoundComponent,
+                NfLoginComponent,
+                NfUserLoginComponent
             ],
             entryComponents: [
                 NfRegistryCreateBucket

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
index cbba95e..1712ada 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
@@ -52,30 +52,26 @@ NfRegistryBucketGridListViewer.prototype = {
         // reset the breadcrumb state
         this.nfRegistryService.droplet = {};
 
-        // attempt kerberos authentication
-        this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
-            self.nfRegistryService.loadCurrentUser().subscribe(function 
(currentUser) {
-                self.route.params
-                    .switchMap(function (params) {
-                        return new rxjs.Observable.forkJoin(
-                            self.nfRegistryApi.getBuckets(),
-                            self.nfRegistryApi.getDroplets(params['bucketId']),
-                            self.nfRegistryApi.getBucket(params['bucketId'])
-                        );
-                    })
-                    .subscribe(function (response) {
-                        var buckets = response[0];
-                        var droplets = response[1];
-                        var bucket = response[2];
-                        self.nfRegistryService.bucket = bucket;
-                        self.nfRegistryService.buckets = buckets;
-                        self.nfRegistryService.droplets = droplets;
-                        self.nfRegistryService.filterDroplets();
-                        self.nfRegistryService.setBreadcrumbState('in');
-                        self.nfRegistryService.inProgress = false;
-                    });
+        // subscribe to the route params
+        self.route.params
+            .switchMap(function (params) {
+                return new rxjs.Observable.forkJoin(
+                    self.nfRegistryApi.getBuckets(),
+                    self.nfRegistryApi.getDroplets(params['bucketId']),
+                    self.nfRegistryApi.getBucket(params['bucketId'])
+                );
+            })
+            .subscribe(function (response) {
+                var buckets = response[0];
+                var droplets = response[1];
+                var bucket = response[2];
+                self.nfRegistryService.bucket = bucket;
+                self.nfRegistryService.buckets = buckets;
+                self.nfRegistryService.droplets = droplets;
+                self.nfRegistryService.filterDroplets();
+                self.nfRegistryService.setBreadcrumbState('in');
+                self.nfRegistryService.inProgress = false;
             });
-        });
 
     },
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
index 22805d0..3c9e5cc 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
@@ -17,7 +17,6 @@
 
 var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js');
 var ngCoreTesting = require('@angular/core/testing');
-var ngHttpTesting = require('@angular/http/testing');
 var ngCommon = require('@angular/common');
 var ngRouter = require('@angular/router');
 var FdsDemo = 
require('nifi-registry/components/fluid-design-system/fds-demo.js');
@@ -29,9 +28,8 @@ var NfRegistryExplorer = 
require('nifi-registry/components/explorer/nf-registry-
 var NfRegistryAdministration = 
require('nifi-registry/components/administration/nf-registry-administration.js');
 var NfRegistryUsersAdministration = 
require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js');
-var NfRegistryUserDetails = 
require('nifi-registry/components/administration/users/details/nf-registry-user-details.js');
-var NfRegistryUserPermissions = 
require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js');
-var NfRegistryUserGroupPermissions = 
require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.js');
+var NfRegistryManageUser = 
require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js');
+var NfRegistryManageGroup = 
require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js');
 var NfRegistryBucketPermissions = 
require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js');
 var NfRegistryWorkflowAdministration = 
require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
 var NfRegistryGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
@@ -44,6 +42,8 @@ var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
+var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
+var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
 
 describe('NfRegistryBucketGridListViewer Component', function () {
     var comp;
@@ -65,16 +65,17 @@ describe('NfRegistryBucketGridListViewer Component', 
function () {
                 NfRegistryExplorer,
                 NfRegistryAdministration,
                 NfRegistryUsersAdministration,
-                NfRegistryUserDetails,
-                NfRegistryUserPermissions,
-                NfRegistryUserGroupPermissions,
+                NfRegistryManageUser,
+                NfRegistryManageGroup,
                 NfRegistryBucketPermissions,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,
                 NfRegistryBucketGridListViewer,
                 NfRegistryDropletGridListViewer,
-                NfPageNotFoundComponent
+                NfPageNotFoundComponent,
+                NfLoginComponent,
+                NfUserLoginComponent
             ],
             providers: [
                 NfRegistryService,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
index 41bef94..a8c1218 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
@@ -48,33 +48,30 @@ NfRegistryDropletGridListViewer.prototype = {
         var self = this;
         this.nfRegistryService.inProgress = true;
         this.nfRegistryService.explorerViewType = 'grid-list';
-        // attempt kerberos authentication
-        this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
-            self.nfRegistryService.loadCurrentUser().subscribe(function 
(currentUser) {
-                self.route.params
-                    .switchMap(function (params) {
-                        return new rxjs.Observable.forkJoin(
-                            self.nfRegistryApi.getDroplet(params['bucketId'], 
params['dropletType'], params['dropletId']),
-                            self.nfRegistryApi.getBucket(params['bucketId']),
-                            self.nfRegistryApi.getBuckets(),
-                            self.nfRegistryApi.getDroplets(params['bucketId'])
-                        );
-                    })
-                    .subscribe(function (response) {
-                        var droplet = response[0];
-                        var bucket = response[1];
-                        var buckets = response[2];
-                        var droplets = response[3];
-                        self.nfRegistryService.bucket = bucket;
-                        self.nfRegistryService.buckets = buckets;
-                        self.nfRegistryService.droplet = droplet;
-                        self.nfRegistryService.droplets = droplets;
-                        self.nfRegistryService.filterDroplets();
-                        self.nfRegistryService.setBreadcrumbState('in');
-                        self.nfRegistryService.inProgress = false;
-                    });
+
+        // subscribe to the route params
+        self.route.params
+            .switchMap(function (params) {
+                return new rxjs.Observable.forkJoin(
+                    self.nfRegistryApi.getDroplet(params['bucketId'], 
params['dropletType'], params['dropletId']),
+                    self.nfRegistryApi.getBucket(params['bucketId']),
+                    self.nfRegistryApi.getBuckets(),
+                    self.nfRegistryApi.getDroplets(params['bucketId'])
+                );
+            })
+            .subscribe(function (response) {
+                var droplet = response[0];
+                var bucket = response[1];
+                var buckets = response[2];
+                var droplets = response[3];
+                self.nfRegistryService.bucket = bucket;
+                self.nfRegistryService.buckets = buckets;
+                self.nfRegistryService.droplet = droplet;
+                self.nfRegistryService.droplets = droplets;
+                self.nfRegistryService.filterDroplets();
+                self.nfRegistryService.setBreadcrumbState('in');
+                self.nfRegistryService.inProgress = false;
             });
-        });
     },
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
index 8631eb4..b41d3c6 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
@@ -17,7 +17,6 @@
 
 var NfRegistryRoutes = require('nifi-registry/nf-registry.routes.js');
 var ngCoreTesting = require('@angular/core/testing');
-var ngHttpTesting = require('@angular/http/testing');
 var ngCommon = require('@angular/common');
 var ngRouter = require('@angular/router');
 var FdsDemo = 
require('nifi-registry/components/fluid-design-system/fds-demo.js');
@@ -29,9 +28,8 @@ var NfRegistryExplorer = 
require('nifi-registry/components/explorer/nf-registry-
 var NfRegistryAdministration = 
require('nifi-registry/components/administration/nf-registry-administration.js');
 var NfRegistryUsersAdministration = 
require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js');
-var NfRegistryUserDetails = 
require('nifi-registry/components/administration/users/details/nf-registry-user-details.js');
-var NfRegistryUserPermissions = 
require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js');
-var NfRegistryUserGroupPermissions = 
require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.js');
+var NfRegistryManageUser = 
require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js');
+var NfRegistryManageGroup = 
require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js');
 var NfRegistryBucketPermissions = 
require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js');
 var NfRegistryWorkflowAdministration = 
require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
 var NfRegistryGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
@@ -44,6 +42,8 @@ var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
+var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
+var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
 
 describe('NfRegistryDropletGridListViewer Component', function () {
     var comp;
@@ -65,16 +65,17 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
                 NfRegistryExplorer,
                 NfRegistryAdministration,
                 NfRegistryUsersAdministration,
-                NfRegistryUserDetails,
-                NfRegistryUserPermissions,
-                NfRegistryUserGroupPermissions,
+                NfRegistryManageUser,
+                NfRegistryManageGroup,
                 NfRegistryBucketPermissions,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,
                 NfRegistryBucketGridListViewer,
                 NfRegistryDropletGridListViewer,
-                NfPageNotFoundComponent
+                NfPageNotFoundComponent,
+                NfLoginComponent,
+                NfUserLoginComponent
             ],
             providers: [
                 NfRegistryService,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
index bb8c52d..8e336ab 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
@@ -20,8 +20,8 @@ limitations under the License.
         <div flex fxLayout="row" fxLayoutAlign="end center">
             <td-chips [(ngModel)]="nfRegistryService.dropletsSearchTerms"
                       [items]="nfRegistryService.autoCompleteDroplets"
-                      
(add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.identity,
 nfRegistryService.activeDropletColumn.sortOrder);"
-                      
(remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.identity,
 nfRegistryService.activeDropletColumn.sortOrder);" 
class="push-right-sm"></td-chips>
+                      
(add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name,
 nfRegistryService.activeDropletColumn.sortOrder);"
+                      
(remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name,
 nfRegistryService.activeDropletColumn.sortOrder);" 
class="push-right-sm"></td-chips>
             <span class="push-top-sm pad-right-sm">Sort by:</span>
             <div fxLayout="row" fxLayoutAlign="end center" 
[matMenuTriggerFor]="dropletGridSortMenu">
                 <div class="push-top-sm" 
id="droplet-sort-by-field">{{nfRegistryService.getSortByLabel()}}</div>
@@ -84,12 +84,9 @@ limitations under the License.
                         <div 
id="nifi-registry-explorer-grid-list-viewer-droplet-container-details-change-log"
                              fxFlex="75">
                             <td-steps mode="vertical">
-                                <td-step label="{{snapshotMeta.version}}" 
sublabel="by {{snapshotMeta.author}}"
+                                <td-step label="Version 
{{snapshotMeta.version}} - {{snapshotMeta.timestamp | amTimeAgo}}" sublabel="by 
{{snapshotMeta.author}}"
                                          *ngFor="let snapshotMeta of 
droplet.snapshotMetadata; let i = index"
                                          [active]="i === 0 ? true : false">
-                                    <ng-template td-step-label>
-                                        <span>{{snapshotMeta.timestamp | 
amTimeAgo}}</span>
-                                    </ng-template>
                                     <div fxLayout="column" 
fxLayoutAlign="space-between stretch">
                                         <div fxLayout="row" class="md-body-2">
                                             {{snapshotMeta.comments}}

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
index adeee3f..b3ff7e7 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
@@ -53,25 +53,21 @@ NfRegistryGridListViewer.prototype = {
         this.nfRegistryService.bucket = {};
         this.nfRegistryService.droplet = {};
 
-        // attempt kerberos authentication
-        this.nfRegistryApi.ticketExchange().subscribe(function (jwt) {
-            self.nfRegistryService.loadCurrentUser().subscribe(function 
(currentUser) {
-                self.route.params
-                    .switchMap(function (params) {
-                        return new 
rxjs.Observable.forkJoin(self.nfRegistryApi.getDroplets(),
-                            self.nfRegistryApi.getBuckets());
-                    })
-                    .subscribe(function (response) {
-                        var droplets = response[0];
-                        var buckets = response[1];
-                        self.nfRegistryService.buckets = buckets;
-                        self.nfRegistryService.droplets = droplets;
-                        self.nfRegistryService.filterDroplets();
-                        self.nfRegistryService.setBreadcrumbState('in');
-                        self.nfRegistryService.inProgress = false;
-                    });
+        // subscribe to the route params
+        self.route.params
+            .switchMap(function (params) {
+                return new 
rxjs.Observable.forkJoin(self.nfRegistryApi.getDroplets(),
+                    self.nfRegistryApi.getBuckets());
+            })
+            .subscribe(function (response) {
+                var droplets = response[0];
+                var buckets = response[1];
+                self.nfRegistryService.buckets = buckets;
+                self.nfRegistryService.droplets = droplets;
+                self.nfRegistryService.filterDroplets();
+                self.nfRegistryService.setBreadcrumbState('in');
+                self.nfRegistryService.inProgress = false;
             });
-        });
     },
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/580f7754/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
index 2c926b4..be04713 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
@@ -28,9 +28,8 @@ var NfRegistryExplorer = 
require('nifi-registry/components/explorer/nf-registry-
 var NfRegistryAdministration = 
require('nifi-registry/components/administration/nf-registry-administration.js');
 var NfRegistryUsersAdministration = 
require('nifi-registry/components/administration/users/nf-registry-users-administration.js');
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.js');
-var NfRegistryUserDetails = 
require('nifi-registry/components/administration/users/details/nf-registry-user-details.js');
-var NfRegistryUserPermissions = 
require('nifi-registry/components/administration/users/permissions/nf-registry-user-permissions.js');
-var NfRegistryUserGroupPermissions = 
require('nifi-registry/components/administration/user-group/permissions/nf-registry-user-group-permissions.js');
+var NfRegistryManageUser = 
require('nifi-registry/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js');
+var NfRegistryManageGroup = 
require('nifi-registry/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js');
 var NfRegistryBucketPermissions = 
require('nifi-registry/components/administration/workflow/buckets/permissions/nf-registry-bucket-permissions.js');
 var NfRegistryWorkflowAdministration = 
require('nifi-registry/components/administration/workflow/nf-registry-workflow-administration.js');
 var NfRegistryGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
@@ -43,6 +42,8 @@ var ngCommonHttp = require('@angular/common/http');
 var NfRegistryTokenInterceptor = 
require('nifi-registry/services/nf-registry.token.interceptor.js');
 var NfRegistryAuthService = 
require('nifi-registry/services/nf-registry.auth.service.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
+var NfLoginComponent = 
require('nifi-registry/components/login/nf-registry-login.js');
+var NfUserLoginComponent = 
require('nifi-registry/components/login/dialogs/nf-registry-user-login.js');
 
 describe('NfRegistryGridListViewer Component', function () {
     var comp;
@@ -64,16 +65,17 @@ describe('NfRegistryGridListViewer Component', function () {
                 NfRegistryExplorer,
                 NfRegistryAdministration,
                 NfRegistryUsersAdministration,
-                NfRegistryUserDetails,
-                NfRegistryUserPermissions,
-                NfRegistryUserGroupPermissions,
+                NfRegistryManageUser,
+                NfRegistryManageGroup,
                 NfRegistryBucketPermissions,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,
                 NfRegistryBucketGridListViewer,
                 NfRegistryDropletGridListViewer,
-                NfPageNotFoundComponent
+                NfPageNotFoundComponent,
+                NfLoginComponent,
+                NfUserLoginComponent
             ],
             providers: [
                 NfRegistryService,

Reply via email to