http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
new file mode 100644
index 0000000..01602dc
--- /dev/null
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
@@ -0,0 +1,352 @@
+/*
+ * 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 rxjs = require('rxjs/Observable');
+var ngCore = require('@angular/core');
+var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
+var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
+var ngMaterial = require('@angular/material');
+var ngRouter = require('@angular/router');
+
+/**
+ * NfRegistryEditBucketPolicy constructor.
+ *
+ * @param nfRegistryApi         The api service.
+ * @param nfRegistryService     The nf-registry.service module.
+ * @param activatedRoute        The angular route module.
+ * @param matDialogRef          The angular material dialog ref.
+ * @param data                  The data passed into this component.
+ * @constructor
+ */
+function NfRegistryEditBucketPolicy(nfRegistryApi, nfRegistryService, 
activatedRoute, matDialogRef, data) {
+    this.userOrGroup = {};
+    // Services
+    this.nfRegistryService = nfRegistryService;
+    this.route = activatedRoute;
+    this.nfRegistryApi = nfRegistryApi;
+    this.dialogRef = matDialogRef;
+    this.data = data;
+};
+
+NfRegistryEditBucketPolicy.prototype = {
+    constructor: NfRegistryEditBucketPolicy,
+
+    /**
+     * Initialize the component.
+     */
+    ngOnInit: function () {
+        var self = this;
+        this.route.params
+            .switchMap(function (params) {
+                return new rxjs.Observable.forkJoin(
+                    self.nfRegistryApi.getUsers(),
+                    self.nfRegistryApi.getUserGroups()
+                );
+            })
+            .subscribe(function (response) {
+                var users = response[0];
+                var groups = response[1];
+                users = users.filter(function (user) {
+                    return (self.data.userOrGroup.identity === user.identity) 
? true : false;
+                });
+                if(users.length === 0){
+                    groups = groups.filter(function (group) {
+                        return (self.data.userOrGroup.identity === 
group.identity) ? true : false;
+                    });
+                    self.userOrGroup = groups[0];
+                    self.userOrGroup.type = 'group'
+                } else {
+                    self.userOrGroup = users[0];
+                    self.userOrGroup.type = 'user'
+                }
+                self.data.userOrGroup.permissions.split(", 
").forEach(function(permission) {
+                    if (permission === 'read') {
+                        self.readCheckbox.checked = true;
+                    }
+                    if (permission === 'write') {
+                        self.writeCheckbox.checked = true;
+                    }
+                    if (permission === 'delete') {
+                        self.deleteCheckbox.checked = true;
+                    }
+                });
+            });
+    },
+
+    /**
+     * Update a new policy.
+     */
+    applyPolicy: function () {
+        var self = this;
+        var action = '';
+        var resource = '/buckets';
+        var permissions = [];
+        if (this.readCheckbox.checked) {
+            action = 'read';
+            permissions.push(action);
+            this.nfRegistryApi.getResourcePoliciesById(action, resource, 
this.nfRegistryService.bucket.identifier).subscribe(function (policy) {
+                action = 'read';
+                if (policy.status && policy.status === 404) {
+                    // resource does NOT exist, let's create it
+                    var users = [];
+                    var groups = [];
+
+                    if (self.userOrGroup.type === 'user') {
+                        users.push(self.userOrGroup);
+                    } else {
+                        groups.push(self.userOrGroup);
+                    }
+
+                    self.nfRegistryApi.postPolicyActionResource(action, 
resource + '/' + self.nfRegistryService.bucket.identifier, users, 
groups).subscribe(
+                        function (response) {
+                            // policy created!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                } else {
+                    // resource exists, let's update it
+                    if (self.userOrGroup.type === 'user') {
+                        policy.users.push(self.userOrGroup);
+                    } else {
+                        policy.userGroups.push(self.userOrGroup);
+                    }
+                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                        function (response) {
+                            // policy updated!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                }
+            });
+        } else {
+            action = 'read';
+            this.nfRegistryApi.getResourcePoliciesById(action, resource, 
this.nfRegistryService.bucket.identifier).subscribe(function (policy) {
+                action = 'read';
+                if (policy.status && policy.status === 404) {
+                    // resource does NOT exist so we have nothing to do
+                } else {
+                    // resource exists, let's remove it
+                    if (self.userOrGroup.type === 'user') {
+                        policy.users = policy.users.filter(function(user) {
+                            return (self.userOrGroup.identity !== 
user.identity) ? true : false;
+                        });
+                    } else {
+                        policy.userGroups = 
policy.userGroups.filter(function(group) {
+                            return (self.userOrGroup.identity !== 
group.identity) ? true : false;
+                        });
+                    }
+                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                        function (response) {
+                            // policy updated!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                }
+            });
+
+        }
+        if (this.writeCheckbox.checked) {
+            action = 'write';
+            permissions.push(action);
+            this.nfRegistryApi.getResourcePoliciesById(action, resource, 
this.nfRegistryService.bucket.identifier).subscribe(function (policy) {
+                action = 'write';
+                if (policy.status && policy.status === 404) {
+                    // resource does NOT exist, let's create it
+                    var users = [];
+                    var groups = [];
+
+                    if (self.userOrGroup.type === 'user') {
+                        users.push(self.userOrGroup);
+                    } else {
+                        groups.push(self.userOrGroup);
+                    }
+
+                    self.nfRegistryApi.postPolicyActionResource(action, 
resource + '/' + self.nfRegistryService.bucket.identifier, users, 
groups).subscribe(
+                        function (response) {
+                            // policy created!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                } else {
+                    // resource exists, let's update it
+                    if (self.userOrGroup.type === 'user') {
+                        policy.users.push(self.userOrGroup);
+                    } else {
+                        policy.userGroups.push(self.userOrGroup);
+                    }
+                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                        function (response) {
+                            // policy updated!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                }
+            });
+        } else {
+            action = 'write';
+            this.nfRegistryApi.getResourcePoliciesById(action, resource, 
this.nfRegistryService.bucket.identifier).subscribe(function (policy) {
+                action = 'write';
+                if (policy.status && policy.status === 404) {
+                    // resource does NOT exist so we have nothing to do
+                } else {
+                    // resource exists, let's remove it
+                    if (self.userOrGroup.type === 'user') {
+                        policy.users = policy.users.filter(function(user) {
+                            return (self.userOrGroup.identity !== 
user.identity) ? true : false;
+                        });
+                    } else {
+                        policy.userGroups = 
policy.userGroups.filter(function(group) {
+                            return (self.userOrGroup.identity !== 
group.identity) ? true : false;
+                        });
+                    }
+                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                        function (response) {
+                            // policy updated!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                }
+            });
+
+        }
+        if (this.deleteCheckbox.checked) {
+            action = 'delete';
+            permissions.push(action);
+            this.nfRegistryApi.getResourcePoliciesById(action, resource, 
this.nfRegistryService.bucket.identifier).subscribe(function (policy) {
+                action = 'delete';
+                if (policy.status && policy.status === 404) {
+                    // resource does NOT exist, let's create it
+                    var users = [];
+                    var groups = [];
+
+                    if (self.userOrGroup.type === 'user') {
+                        users.push(self.userOrGroup);
+                    } else {
+                        groups.push(self.userOrGroup);
+                    }
+
+                    self.nfRegistryApi.postPolicyActionResource(action, 
resource + '/' + self.nfRegistryService.bucket.identifier, users, 
groups).subscribe(
+                        function (response) {
+                            // policy created!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                } else {
+                    // resource exists, let's update it
+                    if (self.userOrGroup.type === 'user') {
+                        policy.users.push(self.userOrGroup);
+                    } else {
+                        policy.userGroups.push(self.userOrGroup);
+                    }
+                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                        function (response) {
+                            // policy updated!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                }
+            });
+        } else {
+            action = 'delete';
+            this.nfRegistryApi.getResourcePoliciesById(action, resource, 
this.nfRegistryService.bucket.identifier).subscribe(function (policy) {
+                action = 'delete';
+                if (policy.status && policy.status === 404) {
+                    // resource does NOT exist so we have nothing to do
+                } else {
+                    // resource exists, let's remove it
+                    if (self.userOrGroup.type === 'user') {
+                        policy.users = policy.users.filter(function(user) {
+                            return (self.userOrGroup.identity !== 
user.identity) ? true : false;
+                        });
+                    } else {
+                        policy.userGroups = 
policy.userGroups.filter(function(group) {
+                            return (self.userOrGroup.identity !== 
group.identity) ? true : false;
+                        });
+                    }
+                    
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                        policy.resource, policy.users, 
policy.userGroups).subscribe(
+                        function (response) {
+                            // policy updated!!!...now update the view
+                            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier).subscribe(function
 (response) {
+                                self.nfRegistryService.bucket = response;
+                            });
+                        });
+                }
+            });
+
+        }
+        this.dialogRef.close({userOrGroup: self.userOrGroup, permissions: 
permissions});
+    },
+
+    /**
+     * Toggle all permission checkboxes.
+     *
+     * @param $event
+     */
+    toggleAllPermissions: function ($event) {
+        if ($event.checked) {
+            this.readCheckbox.checked = true;
+            this.writeCheckbox.checked = true;
+            this.deleteCheckbox.checked = true;
+        } else {
+            this.readCheckbox.checked = false;
+            this.writeCheckbox.checked = false;
+            this.deleteCheckbox.checked = false;
+        }
+    },
+
+    /**
+     * Cancel creation of a new policy and close dialog.
+     */
+    cancel: function () {
+        this.dialogRef.close();
+    }
+};
+
+NfRegistryEditBucketPolicy.annotations = [
+    new ngCore.Component({
+        template: require('./nf-registry-edit-bucket-policy.html!text'),
+        queries: {
+            readCheckbox: new ngCore.ViewChild('readCheckbox'),
+            writeCheckbox: new ngCore.ViewChild('writeCheckbox'),
+            deleteCheckbox: new ngCore.ViewChild('deleteCheckbox')
+        }
+    })
+];
+
+NfRegistryEditBucketPolicy.parameters = [
+    NfRegistryApi,
+    NfRegistryService,
+    ngRouter.ActivatedRoute,
+    ngMaterial.MatDialogRef,
+    ngMaterial.MAT_DIALOG_DATA
+];
+
+module.exports = NfRegistryEditBucketPolicy;

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html
deleted file mode 100644
index 6f2f9d0..0000000
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-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 id="nifi-registry-admin-create-bucket-dialog">
-    <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between 
center">
-        <span class="md-card-title">New Bucket</span>
-        <button mat-icon-button (click)="cancel()">
-            <mat-icon color="primary">close</mat-icon>
-        </button>
-    </div>
-    <div fxLayout="column" fxLayoutAlign="space-between start" 
class="pad-bottom-md">
-        <div class="pad-bottom-md fill-available-width">
-            <mat-input-container floatPlaceholder="always" fxFlex>
-                <input #newBucketInput matInput floatPlaceholder="always" 
placeholder="Bucket Name" focused="true">
-            </mat-input-container>
-        </div>
-        <mat-checkbox [(ngModel)]="keepDialogOpen">
-            Keep this dialog open after creating bucket
-        </mat-checkbox>
-    </div>
-    <div fxLayout="row">
-        <span fxFlex></span>
-        <button (click)="cancel()" color="fds-regular" mat-raised-button
-                i18n="Cancel creation of new bucket|A button for cancelling 
the creation of a new bucket in the 
registry.@@nf-admin-workflow-create-bucket-button">
-            Cancel
-        </button>
-        <button [disabled]="newBucketInput.value.length === 0" 
class="push-left-sm" (click)="createBucket(newBucketInput)" color="fds-primary" 
mat-raised-button
-                i18n="Create new bucket button|A button for creating a new 
bucket in the registry.@@nf-admin-workflow-create-bucket-button">
-            Create
-        </button>
-    </div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js
deleted file mode 100644
index 115b699..0000000
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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 ngCore = require('@angular/core');
-var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
-var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
-var ngMaterial = require('@angular/material');
-
-/**
- * NfRegistryCreateBucket constructor.
- *
- * @param nfRegistryApi         The api service.
- * @param nfRegistryService     The nf-registry.service module.
- * @param matDialogRef          The angular material dialog ref.
- * @constructor
- */
-function NfRegistryCreateBucket(nfRegistryApi, nfRegistryService, 
matDialogRef) {
-    this.nfRegistryService = nfRegistryService;
-    this.nfRegistryApi = nfRegistryApi;
-    this.dialogRef = matDialogRef;
-    this.keepDialogOpen = false;
-};
-
-NfRegistryCreateBucket.prototype = {
-    constructor: NfRegistryCreateBucket,
-
-    /**
-     * Create a new bucket.
-     *
-     * @param newBucketInput     The newBucketInput element.
-     */
-    createBucket: function (newBucketInput) {
-        var self = this;
-        
this.nfRegistryApi.createBucket(newBucketInput.value).subscribe(function 
(bucket) {
-            self.nfRegistryService.buckets.push(bucket);
-            self.nfRegistryService.filterBuckets();
-            self.nfRegistryService.allBucketsSelected = false;
-            if (self.keepDialogOpen !== true) {
-                self.dialogRef.close();
-            }
-        })
-    },
-
-    /**
-     * Cancel creation of a new bucket and close dialog.
-     */
-    cancel: function () {
-        this.dialogRef.close();
-    }
-};
-
-NfRegistryCreateBucket.annotations = [
-    new ngCore.Component({
-        template: require('./nf-registry-create-bucket.html!text')
-    })
-];
-
-NfRegistryCreateBucket.parameters = [
-    NfRegistryApi,
-    NfRegistryService,
-    ngMaterial.MatDialogRef
-];
-
-module.exports = NfRegistryCreateBucket;

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js
deleted file mode 100644
index b07b235..0000000
--- 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/nf-registry-create-bucket.spec.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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 NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
-var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
-var NfRegistryCreateBucket = 
require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js');
-var rxjs = require('rxjs/Rx');
-
-describe('NfRegistryCreateBucket Component isolated unit tests', function () {
-    var comp;
-    var nfRegistryService;
-    var nfRegistryApi;
-
-    beforeEach(function () {
-        nfRegistryService = new NfRegistryService();
-        nfRegistryApi = new NfRegistryApi();
-        comp = new NfRegistryCreateBucket(nfRegistryApi, nfRegistryService, {
-            close: function () {
-            }
-        });
-
-        // Spy
-        spyOn(nfRegistryApi, 'createBucket').and.callFake(function () {
-        }).and.returnValue(rxjs.Observable.of({name: 'NewBucket'}));
-        spyOn(nfRegistryService, 'filterBuckets');
-        spyOn(comp.dialogRef, 'close');
-    });
-
-    it('should create a new bucket and close the dialog', function () {
-        // The function to test
-        comp.createBucket({value: 'NewBucket'});
-
-        //assertions
-        expect(comp).toBeDefined();
-        expect(nfRegistryService.buckets.length).toBe(1);
-        expect(nfRegistryService.buckets[0].name).toBe('NewBucket');
-        expect(nfRegistryService.filterBuckets).toHaveBeenCalled();
-        expect(comp.dialogRef.close).toHaveBeenCalled();
-    });
-
-    it('should create a new bucket and keep the dialog open', function () {
-        // setup the component
-        comp.keepDialogOpen = true;
-
-        // The function to test
-        comp.createBucket({value: 'NewBucket'});
-
-        //assertions
-        expect(comp).toBeDefined();
-        expect(nfRegistryService.buckets.length).toBe(1);
-        expect(nfRegistryService.buckets[0].name).toBe('NewBucket');
-        expect(nfRegistryService.filterBuckets).toHaveBeenCalled();
-        expect(comp.dialogRef.close.calls.count()).toEqual(0);
-    });
-
-    it('should close the dialog', function () {
-        // The function to test
-        comp.cancel();
-
-        //assertions
-        expect(comp.dialogRef.close).toHaveBeenCalled();
-    });
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 544e2d1..fd7453c 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
@@ -19,9 +19,15 @@ limitations under the License.
     <div fxFlex class="pad-top-md pad-bottom-sm pad-left-md pad-right-md">
         <span class="md-card-title">Buckets 
({{nfRegistryService.buckets.length}})</span>
         <div flex class="push-right-sm" fxLayout="row" fxLayoutAlign="end 
center">
-            <td-chips class="push-right-sm" 
[items]="nfRegistryService.autoCompleteBuckets" 
(add)="nfRegistryService.bucketsSearchAdd($event)"
+            <td-chips class="push-right-sm"
+                      [items]="nfRegistryService.autoCompleteBuckets"
+                      (add)="nfRegistryService.bucketsSearchAdd($event)"
                       
(remove)="nfRegistryService.bucketsSearchRemove($event)"></td-chips>
-            <button class="push-top-sm push-right-sm" color="fds-secondary" 
mat-raised-button (click)="createBucket()">
+            <button class="push-top-sm push-right-sm"
+                    color="fds-secondary"
+                    mat-raised-button
+                    
[disabled]="!nfRegistryService.currentUser.resourcePermissions.buckets.canWrite"
+                    (click)="createBucket()">
                 New Bucket
             </button>
             <button class="push-top-sm" 
[disabled]="nfRegistryService.isMultiBucketActionsDisabled" color="fds-primary" 
mat-raised-button [matMenuTriggerFor]="bucketActionMenu">
@@ -30,6 +36,7 @@ limitations under the License.
         </div>
         <mat-menu class="fds-primary-dropdown-button-menu" 
#bucketActionMenu="matMenu" [overlapTrigger]="false">
             <button mat-menu-item
+                    
[disabled]="nfRegistryService.disableMultiBucketDeleteAction"
                     (click)="nfRegistryService.deleteSelectedBuckets()">
                 <span>Delete</span>
             </button>
@@ -55,11 +62,12 @@ limitations under the License.
         </div>
         <div id="nifi-registry-workflow-administration-buckets-list-container">
             <div fxLayout="row" fxLayoutAlign="space-between center" 
class="td-data-table-row"
-                 [ngClass]="{'selected' : row.checked}" *ngFor="let row of 
nfRegistryService.filteredBuckets"
+                 [ngClass]="{'nonconfigurable' : row.configurable === false, 
'selected-nonconfigurable' : (row.checked === true && row.configurable === 
false), 'selected' : row.checked === true}"
+                 *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]}}">
+                    <div class="ellipsis" matTooltip="{{column.format ? 
column.format(row[column.name]) : row[column.name]}}">
                         {{column.format ? column.format(row[column.name]) : 
row[column.name]}}
                     </div>
                 </div>
@@ -69,7 +77,7 @@ limitations under the License.
                             <button 
(click)="nfRegistryService.executeBucketAction(action, row);row.checked = 
!row.checked;"
                                     *ngFor="let action of 
nfRegistryService.bucketActions"
                                     matTooltip="{{action.tooltip}}" 
mat-icon-button color="accent"
-                                    [disabled]="action.disabled ? '' : null">
+                                    [disabled]="action.disabled(row)">
                                 <i class="{{action.icon}}" 
aria-hidden="true"></i>
                             </button>
                             <mat-checkbox class="pad-left-sm" 
[(ngModel)]="row.checked" [checked]="row.checked"
@@ -85,7 +93,7 @@ limitations under the License.
                                 <button 
(click)="nfRegistryService.executeBucketAction(action, row);row.checked = 
!row.checked;"
                                         *ngFor="let action of 
nfRegistryService.bucketActions"
                                         matTooltip="{{action.tooltip}}" 
mat-menu-item
-                                        [disabled]="action.disabled ? '' : 
null">
+                                        [disabled]="action.disabled(row)">
                                     <i class="{{action.icon}}" 
aria-hidden="true"></i>
                                     <span>{{action.name}}</span>
                                 </button>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 770b871..5bb3b20 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
@@ -18,7 +18,7 @@ var ngCore = require('@angular/core');
 var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var NfStorage = require('nifi-registry/services/nf-storage.service.js');
-var NfRegistryCreateBucket = 
require('nifi-registry/components/administration/workflow/dialogs/nf-registry-create-bucket.js');
+var NfRegistryCreateBucket = 
require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js');
 var nfRegistryAnimations = require('nifi-registry/nf-registry.animations.js');
 var ngRouter = require('@angular/router');
 var ngMaterial = require('@angular/material');
@@ -50,7 +50,7 @@ NfRegistryWorkflowAdministration.prototype = {
     ngOnInit: function () {
         var self = this;
         this.nfRegistryService.inProgress = true;
-        this.route.params
+        this.$subscription = this.route.params
             .switchMap(function (params) {
                 self.nfRegistryService.adminPerspective = 'workflow';
                 return self.nfRegistryApi.getBuckets();
@@ -69,13 +69,16 @@ NfRegistryWorkflowAdministration.prototype = {
         this.nfRegistryService.adminPerspective = '';
         this.nfRegistryService.buckets = 
this.nfRegistryService.filteredBuckets = [];
         this.nfRegistryService.allBucketsSelected = false;
+        this.$subscription.unsubscribe();
     },
 
     /**
      * Opens the create new bucket dialog.
      */
     createBucket: function () {
-        this.dialog.open(NfRegistryCreateBucket);
+        this.dialog.open(NfRegistryCreateBucket, {
+            disableClose: true
+        });
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 1a1641b..6ffca81 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
@@ -32,9 +32,9 @@ var NfRegistryUsersAdministration = 
require('nifi-registry/components/administra
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.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 NfRegistryManageBucket = 
require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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');
+var NfRegistryCreateBucket = 
require('nifi-registry/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js');
 var NfRegistryGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js');
 var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
 var NfRegistryDropletGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js');
@@ -73,7 +73,7 @@ describe('NfRegistryWorkflowAdministration Component', 
function () {
                 NfRegistryUsersAdministration,
                 NfRegistryManageUser,
                 NfRegistryManageGroup,
-                NfRegistryBucketPermissions,
+                NfRegistryManageBucket,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryCreateBucket,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
new file mode 100644
index 0000000..54f5c5c
--- /dev/null
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
@@ -0,0 +1,128 @@
+<!--
+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.bucket.name}}</span>
+        <button mat-icon-button (click)="closeSideNav()">
+            <mat-icon color="primary">close</mat-icon>
+        </button>
+    </div>
+    <div class="sidenav-content">
+        <div class="pad-bottom-md pad-left-md pad-right-md" flex 
fxLayoutAlign="start center">
+            <mat-input-container flex>
+                <input #bucketnameInput
+                       matInput
+                       
[disabled]="!nfRegistryService.currentUser.resourcePermissions.buckets.canWrite"
+                       placeholder="Identity/Bucket Name"
+                       value="{{nfRegistryService.bucket.name}}"
+                       [(ngModel)]="_bucketname">
+            </mat-input-container>
+            <button [disabled]="nfRegistryService.bucket.name === _bucketname"
+                    (click)="updateBucketName(bucketnameInput.value)"
+                    class="input-button"
+                    color="fds-regular"
+                    mat-raised-button>
+                Save
+            </button>
+        </div>
+        <div *ngIf="!nfRegistryService.currentUser.anonymous || 
nfRegistryService.currentUser.resourcePermissions.policies.canRead" 
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">Policies 
({{userIdentitiesWithPolicies.length + 
groupIdentitiesWithPolicies.length}})</span>
+                <button color="fds-secondary"
+                        
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite"
+                        mat-raised-button
+                        (click)="addPolicy()">
+                    New Policy
+                </button>
+            </div>
+            <div id="nifi-registry-manage-bucket-list-container-column-header" 
fxLayout="row"
+                 fxLayoutAlign="space-between center" class="td-data-table">
+                <div class="td-data-table-column" (click)="sortUsers(column)"
+                     *ngFor="let column of 
nfRegistryService.bucketPoliciesColumns"
+                     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>
+            </div>
+            <div id="nifi-registry-manage-bucket-list-container">
+                <div fxLayout="row" fxLayoutAlign="space-between center" 
class="td-data-table-row"
+                     [ngClass]="{'selected' : row.checked}" *ngFor="let row of 
filteredGroupPermsData"
+                     (click)="row.checked = !row.checked">
+                    <div class="td-data-table-cell" *ngFor="let column of 
nfRegistryService.bucketPoliciesColumns"
+                         fxFlex="{{column.width}}">
+                        <div class="ellipsis"
+                             matTooltip="{{column.format ? 
column.format(row[column.name]) : row[column.name]}}">
+                            <i *ngIf="column.name === 'identity'" 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">
+                        <button (click)="editPolicy(row);row.checked = 
!row.checked;"
+                                
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite"
+                                matTooltip="'Edit user policies of this 
bucket'" mat-icon-button color="accent">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                        </button>
+                        <button 
(click)="removePolicyFromBucket(row);row.checked = !row.checked;"
+                                
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canDelete"
+                                matTooltip="'Remove group policies from 
bucket'" mat-icon-button color="accent">
+                            <i class="fa fa-minus-circle" 
aria-hidden="true"></i>
+                        </button>
+                    </div>
+                </div>
+                <div fxLayout="row" fxLayoutAlign="space-between center" 
class="td-data-table-row"
+                     [ngClass]="{'selected' : row.checked}" *ngFor="let row of 
filteredUserPermsData"
+                     (click)="row.checked = !row.checked">
+                    <div class="td-data-table-cell" *ngFor="let column of 
nfRegistryService.bucketPoliciesColumns"
+                         fxFlex="{{column.width}}">
+                        <div class="ellipsis"
+                             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">
+                        <button (click)="editPolicy(row);row.checked = 
!row.checked;"
+                                matTooltip="'Edit user policies of this 
bucket'" mat-icon-button color="accent"
+                                
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canWrite">
+                            <i class="fa fa-pencil" aria-hidden="true"></i>
+                        </button>
+                        <button 
(click)="removePolicyFromBucket(row);row.checked = !row.checked;"
+                                matTooltip="'Remove user policies from this 
bucket'" mat-icon-button color="accent"
+                                
[disabled]="!nfRegistryService.currentUser.resourcePermissions.policies.canDelete">
+                            <i class="fa fa-trash" aria-hidden="true"></i>
+                        </button>
+                    </div>
+                </div>
+                <div class="mat-padding"
+                     *ngIf="filteredUserPermsData.length === 0 && 
filteredGroupPermsData.length === 0"
+                     layout="row"
+                     layout-align="center center">
+                    <h3>No results to display.</h3>
+                </div>
+            </div>
+        </div>
+    </div>
+    <button id="nf-registry-workflow-bucket-permissions-side-nav-container" 
class="push-right-md" mat-raised-button
+            color="fds-primary"
+            (click)="closeSideNav()">Close
+    </button>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
new file mode 100644
index 0000000..8bb3286
--- /dev/null
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
@@ -0,0 +1,415 @@
+/*
+ * 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 rxjs = require('rxjs/Observable');
+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 NfRegistryEditBucketPolicy = 
require('nifi-registry/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js');
+var NfRegistryAddPolicyToBucket = 
require('nifi-registry/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js');
+
+/**
+ * NfRegistryManageBucket 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 NfRegistryManageBucket(nfRegistryApi, nfRegistryService, 
tdDataTableService, fdsDialogService, fdsSnackBarService, activatedRoute, 
router, matDialog) {
+    this.userPermsSearchTerms = [];
+    this._bucketname = '';
+    this.bucketPolicies = [];
+    this.userPerms = {};
+    this.groupPerms = {};
+    this.filteredGroupPermsData = [];
+    this.filteredUserPermsData = [];
+    this.userIdentitiesWithPolicies = [];
+    this.groupIdentitiesWithPolicies = [];
+
+
+    // 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;
+};
+
+NfRegistryManageBucket.prototype = {
+    constructor: NfRegistryManageBucket,
+
+    /**
+     * Initialize the component.
+     */
+    ngOnInit: function () {
+        var self = this;
+        this.nfRegistryService.sidenav.open();
+        this.$subscription = this.route.params
+            .switchMap(function (params) {
+                return new rxjs.Observable.forkJoin(
+                    self.nfRegistryApi.getBucket(params['bucketId']),
+                    self.nfRegistryApi.getPolicies()
+                );
+            })
+            .subscribe(function (response) {
+                self.nfRegistryService.bucket = response[0];
+                self._bucketname = response[0].name;
+                if (!self.nfRegistryService.currentUser.anonymous) {
+                    if (!response[1].error) {
+                        var policies = response[1];
+                        policies.forEach(function (policy) {
+                            if (policy.resource.indexOf("/buckets/" + 
self.nfRegistryService.bucket.identifier) >= 0) {
+                                self.bucketPolicies.push(policy);
+                                policy.users.forEach(function (user) {
+                                    var userActionsForBucket = 
self.userPerms[user.identity] || [];
+                                    userActionsForBucket.push(policy.action);
+                                    self.userPerms[user.identity] = 
userActionsForBucket;
+
+                                });
+                                policy.userGroups.forEach(function (group) {
+                                    var groupActionsForBucket = 
self.groupPerms[group.identity] || [];
+                                    groupActionsForBucket.push(policy.action);
+                                    self.groupPerms[group.identity] = 
groupActionsForBucket;
+
+                                });
+                            }
+                        });
+                        self.filterPolicies();
+                    }
+                }
+            });
+    },
+
+    /**
+     * Destroy the component.
+     */
+    ngOnDestroy: function () {
+        this.nfRegistryService.sidenav.close();
+        this.nfRegistryService.bucket = {};
+        this.$subscription.unsubscribe();
+    },
+
+    /**
+     * Navigate to administer the buckets of the current registry.
+     */
+    closeSideNav: function () {
+        this.router.navigateByUrl('/nifi-registry/administration/workflow');
+    },
+
+    /**
+     * Opens a modal dialog UX enabling the creation of policies.
+     */
+    addPolicy: function () {
+        var self = this;
+        this.dialog.open(NfRegistryAddPolicyToBucket, {
+            data: {
+                users: this.userIdentitiesWithPolicies,
+                groups: this.groupIdentitiesWithPolicies,
+                disableClose: true
+            }
+        }).afterClosed().subscribe(function (dialogResult) {
+            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier)
+                .subscribe(function (response) {
+                    self.nfRegistryService.bucket = response;
+                    self._bucketname = response.name;
+
+                    if (dialogResult) {
+                        if (dialogResult.userOrGroup.type === 'user') {
+                            self.userPerms[dialogResult.userOrGroup.identity] 
= dialogResult.permissions;
+                        } else {
+                            self.groupPerms[dialogResult.userOrGroup.identity] 
= dialogResult.permissions;
+                        }
+                        var snackBarRef = self.snackBarService.openCoaster({
+                            title: 'Success',
+                            message: 'The policy has been created for this 
user/group.',
+                            verticalPosition: 'bottom',
+                            horizontalPosition: 'right',
+                            icon: 'fa fa-check-circle-o',
+                            color: '#1EB475',
+                            duration: 3000
+                        });
+                    }
+                    self.filterPolicies();
+                });
+        });
+    },
+
+    /**
+     * Opens a modal dialog UX enabling the editing of a policy.
+     */
+    editPolicy: function (userOrGroup) {
+        var self = this;
+        this.dialog.open(NfRegistryEditBucketPolicy, {
+            data: {
+                userOrGroup: userOrGroup,
+                disableClose: true
+            }
+        }).afterClosed().subscribe(function (dialogResult) {
+            
self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier)
+                .subscribe(function (response) {
+                    self.nfRegistryService.bucket = response;
+                    self._bucketname = response.name;
+
+                    if (dialogResult) {
+                        if (dialogResult.userOrGroup.type === 'user') {
+                            self.userPerms[dialogResult.userOrGroup.identity] 
= dialogResult.permissions;
+                        } else {
+                            self.groupPerms[dialogResult.userOrGroup.identity] 
= dialogResult.permissions;
+                        }
+                        var snackBarRef = self.snackBarService.openCoaster({
+                            title: 'Success',
+                            message: 'The policy has been updated for this 
user/group.',
+                            verticalPosition: 'bottom',
+                            horizontalPosition: 'right',
+                            icon: 'fa fa-check-circle-o',
+                            color: '#1EB475',
+                            duration: 3000
+                        });
+                    }
+                    self.filterPolicies();
+                });
+        });
+    },
+
+    /**
+     * Filter policies.
+     *
+     * @param {string} [sortBy]       The column name to sort 
`bucketPoliciesColumns` by.
+     * @param {string} [sortOrder]    The order. Either 'ASC' or 'DES'
+     */
+    filterPolicies: 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 
`bucketPoliciesColumns`
+        if (sortBy === undefined) {
+            var arrayLength = 
this.nfRegistryService.bucketPoliciesColumns.length;
+            for (var i = 0; i < arrayLength; i++) {
+                if (this.nfRegistryService.bucketPoliciesColumns[i].sortable 
=== true) {
+                    sortBy = 
this.nfRegistryService.bucketPoliciesColumns[i].name;
+                    //only one column can be actively sorted so we reset all 
to inactive
+                    
this.nfRegistryService.bucketPoliciesColumns.forEach(function (c) {
+                        c.active = false;
+                    });
+                    //and set this column as the actively sorted column
+                    this.nfRegistryService.bucketPoliciesColumns[i].active = 
true;
+                    this.nfRegistryService.bucketPoliciesColumns[i].sortOrder 
= sortOrder;
+                    break;
+                }
+            }
+        }
+
+        var newUserPermsData = [];
+        this.userIdentitiesWithPolicies = [];
+        for (var identity in this.userPerms) {
+            if (this.userPerms.hasOwnProperty(identity)) {
+                this.userIdentitiesWithPolicies.push(identity);
+                newUserPermsData.push({identity: identity, permissions: 
this.userPerms[identity].join(", ")});
+            }
+        }
+
+        for (var i = 0; i < this.userPermsSearchTerms.length; i++) {
+            newUserPermsData = this.filterData(newUserPermsData, 
this.userPermsSearchTerms[i], true);
+        }
+
+        newUserPermsData = this.dataTableService.sortData(newUserPermsData, 
sortBy, sortOrder);
+        this.filteredUserPermsData = newUserPermsData;
+
+        var newGroupPermsData = [];
+        this.groupIdentitiesWithPolicies = [];
+        for (var identity in this.groupPerms) {
+            if (this.groupPerms.hasOwnProperty(identity)) {
+                this.groupIdentitiesWithPolicies.push(identity);
+                newGroupPermsData.push({identity: identity, permissions: 
this.groupPerms[identity].join(", ")});
+            }
+        }
+
+        for (var i = 0; i < this.userPermsSearchTerms.length; i++) {
+            newGroupPermsData = this.filterData(newGroupPermsData, 
this.userPermsSearchTerms[i], true);
+        }
+
+        newGroupPermsData = this.dataTableService.sortData(newGroupPermsData, 
sortBy, sortOrder);
+        this.filteredGroupPermsData = newGroupPermsData;
+    },
+
+    /**
+     * Sort `groups` by `column`.
+     *
+     * @param column    The column to sort by.
+     */
+    sortUsers: function (column) {
+        if (column.sortable) {
+            var sortBy = column.name;
+            var sortOrder = column.sortOrder = (column.sortOrder === 'ASC') ? 
'DESC' : 'ASC';
+            this.filterPolicies(sortBy, sortOrder);
+
+            //only one column can be actively sorted so we reset all to 
inactive
+            this.nfRegistryService.bucketPoliciesColumns.forEach(function (c) {
+                c.active = false;
+            });
+            //and set this column as the actively sorted column
+            column.active = true;
+        }
+    },
+
+    /**
+     * Remove user from group.
+     *
+     * @param group
+     */
+    removePolicyFromBucket: function (userOrGroup) {
+        var self = this;
+        this.dialogService.openConfirm({
+            title: 'Delete Policy',
+            message: 'All permissions granted by this policy will be removed 
for this user/group.',
+            cancelButton: 'Cancel',
+            acceptButton: 'Delete',
+            acceptButtonColor: 'fds-warn'
+        }).afterClosed().subscribe(
+            function (accept) {
+                if (accept) {
+                    userOrGroup.permissions.split(', ').forEach(function 
(action) {
+                        self.nfRegistryApi.getPolicyActionResource(action, 
'/buckets/' + self.nfRegistryService.bucket.identifier).subscribe(function 
(policy) {
+                            if (policy.status && policy.status === 404) {
+                                // resource does NOT exist
+                            } else {
+                                // resource exists, let's filter out the 
current group and update it
+                                policy.users = policy.users.filter(function 
(user) {
+                                    return (user.identity !== 
userOrGroup.identity) ? true : false;
+                                });
+                                policy.userGroups = 
policy.userGroups.filter(function (group) {
+                                    return (group.identity !== 
userOrGroup.identity) ? true : false;
+                                });
+                                
self.nfRegistryApi.putPolicyActionResource(policy.identifier, policy.action,
+                                    policy.resource, policy.users, 
policy.userGroups).subscribe(
+                                    function (response) {
+                                        // policy removed!!!...now update the 
view
+                                        
self.nfRegistryApi.getPolicies().subscribe(function (response) {
+                                            self.userPerms = {};
+                                            self.groupPerms = {};
+                                            self.filteredGroupPermsData = [];
+                                            self.filteredUserPermsData = [];
+                                            self.userIdentitiesWithPolicies = 
[];
+                                            self.groupIdentitiesWithPolicies = 
[];
+                                            var policies = response;
+                                            policies.forEach(function (policy) 
{
+                                                if 
(policy.resource.indexOf("/buckets/" + 
self.nfRegistryService.bucket.identifier) >= 0) {
+                                                    
self.bucketPolicies.push(policy);
+                                                    
policy.users.forEach(function (user) {
+                                                        var 
userActionsForBucket = self.userPerms[user.identity] || [];
+                                                        
userActionsForBucket.push(policy.action);
+                                                        
self.userPerms[user.identity] = userActionsForBucket;
+
+                                                    });
+                                                    
policy.userGroups.forEach(function (group) {
+                                                        var 
groupActionsForBucket = self.groupPerms[group.identity] || [];
+                                                        
groupActionsForBucket.push(policy.action);
+                                                        
self.groupPerms[group.identity] = groupActionsForBucket;
+
+                                                    });
+                                                }
+                                            });
+                                            self.filterPolicies();
+                                            var snackBarRef = 
self.snackBarService.openCoaster({
+                                                title: 'Success',
+                                                message: 'All permissions 
granted by this policy have be removed for this user/group.',
+                                                verticalPosition: 'bottom',
+                                                horizontalPosition: 'right',
+                                                icon: 'fa fa-check-circle-o',
+                                                color: '#1EB475',
+                                                duration: 3000
+                                            });
+                                        });
+                                    });
+                            }
+                        });
+                    });
+                }
+            });
+    },
+
+    /**
+     * Update bucket name.
+     *
+     * @param username
+     */
+    updateBucketName: function (bucketname) {
+        var self = this;
+        
this.nfRegistryApi.updateBucket(this.nfRegistryService.bucket.identifier, 
bucketname).subscribe(function (response) {
+            if (!response.status || response.status === 200) {
+                self.nfRegistryService.bucket = response;
+                // update the bucket identity in the buckets table
+                self.nfRegistryService.buckets.filter(function (bucket) {
+                    if (self.nfRegistryService.bucket.identifier === 
bucket.identifier) {
+                        bucket.name = response.name;
+                    }
+                });
+                var snackBarRef = self.snackBarService.openCoaster({
+                    title: 'Success',
+                    message: 'This bucket name has been updated.',
+                    verticalPosition: 'bottom',
+                    horizontalPosition: 'right',
+                    icon: 'fa fa-check-circle-o',
+                    color: '#1EB475',
+                    duration: 3000
+                });
+            } else if (response.status === 409) {
+                self._bucketname = self.nfRegistryService.bucket.name;
+                self.dialogService.openConfirm({
+                    title: 'Error',
+                    message: 'This bucket already exists. Please enter a 
different identity/bucket name.',
+                    acceptButton: 'Ok',
+                    acceptButtonColor: 'fds-warn'
+                });
+            }
+        });
+    }
+};
+
+NfRegistryManageBucket.annotations = [
+    new ngCore.Component({
+        template: require('./nf-registry-manage-bucket.html!text')
+    })
+];
+
+NfRegistryManageBucket.parameters = [
+    NfRegistryApi,
+    NfRegistryService,
+    covalentCore.TdDataTableService,
+    fdsDialogsModule.FdsDialogService,
+    fdsSnackBarsModule.FdsSnackBarService,
+    ngRouter.ActivatedRoute,
+    ngRouter.Router,
+    ngMaterial.MatDialog
+];
+
+module.exports = NfRegistryManageBucket;

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 1712ada..7f4ae24 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
@@ -53,7 +53,7 @@ NfRegistryBucketGridListViewer.prototype = {
         this.nfRegistryService.droplet = {};
 
         // subscribe to the route params
-        self.route.params
+        this.$subscription = this.route.params
             .switchMap(function (params) {
                 return new rxjs.Observable.forkJoin(
                     self.nfRegistryApi.getBuckets(),
@@ -82,6 +82,7 @@ NfRegistryBucketGridListViewer.prototype = {
         this.nfRegistryService.explorerViewType = '';
         this.nfRegistryService.setBreadcrumbState('out');
         this.nfRegistryService.filteredDroplets = [];
+        this.$subscription.unsubscribe();
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 3c9e5cc..135408e 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
@@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = 
require('nifi-registry/components/administra
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.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 NfRegistryManageBucket = 
require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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');
 var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
@@ -67,7 +67,7 @@ describe('NfRegistryBucketGridListViewer Component', function 
() {
                 NfRegistryUsersAdministration,
                 NfRegistryManageUser,
                 NfRegistryManageGroup,
-                NfRegistryBucketPermissions,
+                NfRegistryManageBucket,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 a8c1218..d85f68b 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
@@ -50,7 +50,7 @@ NfRegistryDropletGridListViewer.prototype = {
         this.nfRegistryService.explorerViewType = 'grid-list';
 
         // subscribe to the route params
-        self.route.params
+        this.$subscription = this.route.params
             .switchMap(function (params) {
                 return new rxjs.Observable.forkJoin(
                     self.nfRegistryApi.getDroplet(params['bucketId'], 
params['dropletType'], params['dropletId']),
@@ -81,6 +81,7 @@ NfRegistryDropletGridListViewer.prototype = {
         this.nfRegistryService.explorerViewType = '';
         this.nfRegistryService.setBreadcrumbState('out');
         this.nfRegistryService.filteredDroplets = [];
+        this.$subscription.unsubscribe();
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 b41d3c6..772db0a 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
@@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = 
require('nifi-registry/components/administra
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.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 NfRegistryManageBucket = 
require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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');
 var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
@@ -67,7 +67,7 @@ describe('NfRegistryDropletGridListViewer Component', 
function () {
                 NfRegistryUsersAdministration,
                 NfRegistryManageUser,
                 NfRegistryManageGroup,
-                NfRegistryBucketPermissions,
+                NfRegistryManageBucket,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 f1d58f3..7d38992 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
@@ -21,7 +21,7 @@ limitations under the License.
             <td-chips [(ngModel)]="nfRegistryService.dropletsSearchTerms"
                       [items]="nfRegistryService.autoCompleteDroplets"
                       
(add)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name,
 nfRegistryService.activeDropletColumn.sortOrder);"
-                      
(remove)="nfRegistryService.filterDroplets(nfRegistryService.activeDropletColumn.name,
 nfRegistryService.activeDropletColumn.sortOrder);" 
class="push-right-sm"></td-chips>
+                      
(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>
@@ -64,22 +64,24 @@ limitations under the License.
                         <mat-menu class="fds-primary-dropdown-button-menu" 
#primaryButtonDropdownMenu="matMenu"
                                   [overlapTrigger]="false">
                             <button mat-menu-item *ngFor="let action of 
nfRegistryService.dropletActions"
+                                    [disabled]="!droplet.permissions.canDelete"
                                     
(click)="nfRegistryService.executeDropletAction(action, droplet)">
                                 <span>{{action.name}}</span>
                             </button>
                         </mat-menu>
                     </div>
                     <div fxLayout="row">
-                        <div fxFlex="25">
+                        <div fxFlex="25" class="pad-left-sm">
                             <span class="uppercase">Description</span>
                         </div>
                         <div fxFlex="75">
                             <span class="uppercase">Change Log</span>
                         </div>
                     </div>
-                    <div fxLayout="row">
+                    <div fxLayout="row" class="pad-left-sm">
                         <div fxFlex="25">
-                            <p>{{droplet.description}}</p>
+                            <p 
*ngIf="droplet.description">{{droplet.description}}</p>
+                            <p *ngIf="!droplet.description">No description 
specified</p>
                         </div>
                         <div 
id="nifi-registry-explorer-grid-list-viewer-droplet-container-details-change-log"
                              fxFlex="75">
@@ -88,9 +90,12 @@ limitations under the License.
                                          *ngFor="let snapshotMeta of 
droplet.snapshotMetadata; let i = index"
                                          [active]="i === 0 ? true : false">
                                     <div fxLayout="column" 
fxLayoutAlign="space-between stretch">
-                                        <div fxLayout="row" class="md-body-2">
+                                        <div *ngIf="snapshotMeta.comments" 
fxLayout="row" class="md-body-2">
                                             {{snapshotMeta.comments}}
                                         </div>
+                                        <div *ngIf="!snapshotMeta.comments" 
fxLayout="row" class="md-body-2">
+                                            No comments specified
+                                        </div>
                                         <div fxLayout="row" 
class="mat-caption">
                                             {{(snapshotMeta.timestamp/1000 | 
amFromUnix) | amDateFormat:'MMM-DD-YYYY'}} at {{(snapshotMeta.timestamp/1000 | 
amFromUnix) | amDateFormat:'h:mm A'}}
                                         </div>

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 b3ff7e7..2160086 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
@@ -54,7 +54,7 @@ NfRegistryGridListViewer.prototype = {
         this.nfRegistryService.droplet = {};
 
         // subscribe to the route params
-        self.route.params
+        this.$subscription = this.route.params
             .switchMap(function (params) {
                 return new 
rxjs.Observable.forkJoin(self.nfRegistryApi.getDroplets(),
                     self.nfRegistryApi.getBuckets());
@@ -77,6 +77,7 @@ NfRegistryGridListViewer.prototype = {
         this.nfRegistryService.explorerViewType = '';
         this.nfRegistryService.setBreadcrumbState('out');
         this.nfRegistryService.filteredDroplets = [];
+        this.$subscription.unsubscribe();
     }
 };
 

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/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 be04713..991127b 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
@@ -30,7 +30,7 @@ var NfRegistryUsersAdministration = 
require('nifi-registry/components/administra
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.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 NfRegistryManageBucket = 
require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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');
 var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
@@ -67,7 +67,7 @@ describe('NfRegistryGridListViewer Component', function () {
                 NfRegistryUsersAdministration,
                 NfRegistryManageUser,
                 NfRegistryManageGroup,
-                NfRegistryBucketPermissions,
+                NfRegistryManageBucket,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
index 228f9dd..2676cd5 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/explorer/nf-registry-explorer.spec.js
@@ -29,7 +29,7 @@ var NfRegistryUsersAdministration = 
require('nifi-registry/components/administra
 var NfRegistryAddUser = 
require('nifi-registry/components/administration/users/dialogs/add-user/nf-registry-add-user.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 NfRegistryManageBucket = 
require('nifi-registry/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.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');
 var NfRegistryBucketGridListViewer = 
require('nifi-registry/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js');
@@ -64,7 +64,7 @@ describe('NfRegistryExplorer Component', function () {
                 NfRegistryUsersAdministration,
                 NfRegistryManageUser,
                 NfRegistryManageGroup,
-                NfRegistryBucketPermissions,
+                NfRegistryManageBucket,
                 NfRegistryAddUser,
                 NfRegistryWorkflowAdministration,
                 NfRegistryGridListViewer,

http://git-wip-us.apache.org/repos/asf/nifi-registry/blob/6c48025c/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js
----------------------------------------------------------------------
diff --git 
a/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js
 
b/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js
index 77fb7e2..e9e7a5c 100644
--- 
a/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js
+++ 
b/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.js
@@ -19,19 +19,22 @@ var ngCore = require('@angular/core');
 var NfRegistryService = 
require('nifi-registry/services/nf-registry.service.js');
 var NfRegistryApi = require('nifi-registry/services/nf-registry.api.js');
 var ngMaterial = require('@angular/material');
+var nfRegistryAuthGuardService = 
require('nifi-registry/services/nf-registry.auth-guard.service.js');
 
 /**
  * NfRegistryUserLogin constructor.
  *
- * @param nfRegistryApi         The api service.
- * @param nfRegistryService     The nf-registry.service module.
- * @param matDialogRef          The angular material dialog ref.
+ * @param nfRegistryApi                     The api service.
+ * @param nfRegistryService                 The nf-registry.service module.
+ * @param matDialogRef                      The angular material dialog ref.
+ * @param nfRegistryLoginAuthGuard          The login auth guard.
  * @constructor
  */
-function NfRegistryUserLogin(nfRegistryApi, nfRegistryService, matDialogRef) {
+function NfRegistryUserLogin(nfRegistryApi, nfRegistryService, matDialogRef, 
nfRegistryLoginAuthGuard) {
     this.nfRegistryService = nfRegistryService;
     this.nfRegistryApi = nfRegistryApi;
     this.dialogRef = matDialogRef;
+    this.nfRegistryLoginAuthGuard = nfRegistryLoginAuthGuard;
 };
 
 NfRegistryUserLogin.prototype = {
@@ -46,9 +49,11 @@ NfRegistryUserLogin.prototype = {
     login: function (username, password) {
         var self = this;
         this.nfRegistryApi.postToLogin(username.value, 
password.value).subscribe(function(response){
-            if(!response.status || response.status === 200) {
+            if(response || response.status === 200) {
                 //successful login
-                
self.nfRegistryService.router.navigateByUrl(self.nfRegistryService.redirectUrl);
+                self.dialogRef.close();
+                self.nfRegistryService.currentUser.anonymous = false;
+                
self.nfRegistryLoginAuthGuard.checkLogin(self.nfRegistryService.redirectUrl)
             }
         });
     }
@@ -63,7 +68,8 @@ NfRegistryUserLogin.annotations = [
 NfRegistryUserLogin.parameters = [
     NfRegistryApi,
     NfRegistryService,
-    ngMaterial.MatDialogRef
+    ngMaterial.MatDialogRef,
+    nfRegistryAuthGuardService.NfRegistryLoginAuthGuard
 ];
 
 module.exports = NfRegistryUserLogin;

Reply via email to