[NIFIREG-279] upgrade client deps
[NIFIREG-279] configure webpack to work with npm link
[NIFIREG-279] update to latest deps
[NIFIREG-279] upgrade to latest nifi fds 0.2.0
address pr review comments
[NIFIREG-279] update broken unit tests

This closes #209
diff --git a/nifi-registry-core/nifi-registry-web-ui/pom.xml b/nifi-registry-core/nifi-registry-web-ui/pom.xml
index 866b698..337fa6f 100644
--- a/nifi-registry-core/nifi-registry-web-ui/pom.xml
+++ b/nifi-registry-core/nifi-registry-web-ui/pom.xml
@@ -156,11 +156,11 @@
                                     <filtering>false</filtering>
                                     <includes>
                                         <!-- roboto -->
-                                        <include>roboto-fontface/fonts/roboto-slab/Roboto-Slab-Regular.ttf</include>
-                                        <include>roboto-fontface/fonts/roboto/Roboto-Regular.ttf</include>
-                                        <include>roboto-fontface/fonts/roboto/Roboto-Medium.ttf</include>
-                                        <include>roboto-fontface/fonts/roboto/Roboto-Light.ttf</include>
-                                        <include>roboto-fontface/fonts/roboto/Roboto-Bold.ttf</include>
+                                        <include>roboto-fontface/fonts/roboto-slab/Roboto-Slab-Regular.woff2</include>
+                                        <include>roboto-fontface/fonts/roboto/Roboto-Regular.woff2</include>
+                                        <include>roboto-fontface/fonts/roboto/Roboto-Medium.woff2</include>
+                                        <include>roboto-fontface/fonts/roboto/Roboto-Light.woff2</include>
+                                        <include>roboto-fontface/fonts/roboto/Roboto-Bold.woff2</include>
                                         <include>roboto-fontface/LICENSE*</include>
                                         <!-- covalent -->
                                         <include>@covalent/core/common/platform.css</include>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/.stylelintrc.js b/nifi-registry-core/nifi-registry-web-ui/src/main/.stylelintrc.js
index 9d2d729..c07fe3d 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/.stylelintrc.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/.stylelintrc.js
@@ -24,7 +24,7 @@
         }],
         "declaration-empty-line-before": null,
         "selector-type-no-unknown": [true, {
-            "ignoreTypes": ["/mat-/", "/flow-designer-/", "/fds-/"]
+            "ignoreTypes": ["/mat-/", "/flow-designer-/", "/fds-/", "/td-/"]
         }],
         "font-family-no-missing-generic-family-keyword": null
     }
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/package-lock.json b/nifi-registry-core/nifi-registry-web-ui/src/main/package-lock.json
index 27e8dd6..070dce6 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/package-lock.json
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/package-lock.json
@@ -14,104 +14,168 @@
   "//": "See the License for the specific language governing permissions and",
   "//": "limitations under the License.",
   "name": "nifi-registry",
-  "version": "0.0.1",
+  "version": "0.0.5-SNAPSHOT",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
     "@angular/animations": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.0.tgz",
-      "integrity": "sha512-JLR42YHiJppO4ruAkFxgbzghUDtHkXHkKPM8udd2qyt16T7e1OX7EEOrrmldUu59CC56tZnJ/32p4SrYmxyBSA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.1.1.tgz",
+      "integrity": "sha512-9P9Yyf2/IUMs0MR4CfthBaMdizbTh8dDSLJHhMw1PjxPQ3c6mn74uY46NyxcJnCxII9oA2pnnV/O+10JFUFKMw==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/cdk": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.0.tgz",
-      "integrity": "sha1-Q2j2dJ6RXNzHXTJa4z/bP4WogQg=",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.1.0.tgz",
+      "integrity": "sha512-CKZTtLWNSSM+DmZS5IHhhh+Tb3+N3/WnINq55yQrupk0hIsfyssMTBp6GHogE9btfo9+73B5fSK+VNj6VuD/Qw==",
       "requires": {
+        "parse5": "5.1.0",
         "tslib": "1.8.0"
       }
     },
     "@angular/common": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz",
-      "integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.1.1.tgz",
+      "integrity": "sha512-kgLtexfPhAyNFlwJHKBkpwKyt/19pfULIJWJpUahFqXdYE3LkRNMJQqgfz7DCNpAQxG7B6u4ocq1j2Hx206kxw==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/compiler": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz",
-      "integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.1.1.tgz",
+      "integrity": "sha512-wz8Mc45EGax5RKRYYqgXI8lr1d0w+f9BDbHui7b3hQtKM5Mj1QxLXiSOYX0dt3lG4VzrxpO0Xku5tS3D4T1xxQ==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/core": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz",
-      "integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.1.1.tgz",
+      "integrity": "sha512-B6x8IZeu0Qm2H13leEcNzsx0pGKHMvowziurvDnm7W97MaVrYrgbelNsnly4wNX91FzdBtSVXqbe3jijAD9kjA==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/flex-layout": {
-      "version": "5.0.0-beta.14",
-      "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-5.0.0-beta.14.tgz",
-      "integrity": "sha512-/fsOqXFUKdCmzzZx0bZ0HCYwcV+BSbVuIgOhaCrZKHj2rqiWKKPgj1ErU3HMT68bBBGag0u0skTdLGtrBorRIA==",
+      "version": "8.0.0-beta.26",
+      "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.26.tgz",
+      "integrity": "sha512-lXDLlMSNQhidW0grvisIsj/3gqLuYyN2MvABuRYybnFTc233sXGZuOAaulqq663LA0/DP/GNcz6a+A4ZAAlmPA==",
       "requires": {
         "tslib": "1.8.0"
       }
     },
     "@angular/forms": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz",
-      "integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.1.1.tgz",
+      "integrity": "sha512-jz05UIiIY2Zz/nEveL4Pm9mVCAd5O6JwVDWTHKQ64nKYIN9Nepzgb0ASeOBEZA4qP82KTGJtUm2AN4L7fXN6Pw==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/http": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz",
-      "integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==",
+      "version": "8.0.0-beta.10",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-8.0.0-beta.10.tgz",
+      "integrity": "sha512-NV2TGnrpivJvOa4/1O/GQfFocPSib4NUieh2umNpJYa2CYjyYfgWpmh+0wDqh23ThPPxRufywZQkkSeb+X9PRA==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.9.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.9.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+          "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+        }
       }
     },
     "@angular/material": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.2.0.tgz",
-      "integrity": "sha1-hZnjFJ1ISH4+kulB+p3FUXbjoM8=",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.1.1.tgz",
+      "integrity": "sha512-45aaxKuLTrthzhAhG2+OY86wafuRBteZcRjDG7rKZ3Cc3KteUp5QwAi+QbhHzs4O3WXLWTAmuLYJelRqRqqw7g==",
       "requires": {
         "tslib": "1.8.0"
       }
     },
     "@angular/platform-browser": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz",
-      "integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.1.1.tgz",
+      "integrity": "sha512-uP9UIhi9NYTEbfvNj4misBspXkItFopA2pRk083AhHEhOKs79WvMI15w5H5ziIFeH+4UiCvyKrSnPfcjP+Yrvg==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz",
-      "integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.1.1.tgz",
+      "integrity": "sha512-yUazvP4IBNgXjbzo+NKmu7lVYrrplAN3HSkgYszXwd9uvWLtk1CtXER5hSJE5ZE3Lawoh7PU5hOfMYbqtdAbwg==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@angular/router": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz",
-      "integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.1.1.tgz",
+      "integrity": "sha512-UTL/TjokRUd3hdePBrj1ITmBGq+EcVNz3D18lFi96461ZLQeXSbbf3vjQfL6SE53E4+hfKKR7/tOqQOgb5br7A==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@babel/code-frame": {
@@ -1097,11 +1161,18 @@
       }
     },
     "@covalent/core": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@covalent/core/-/core-1.0.0.tgz",
-      "integrity": "sha512-qUGL6CtyHNa3ttKGrvuQY0lJyQR9Dxp04vP0vrXmYrKapVbfYZ82qwJ2+PrX1EcWAQ6b/B2giFe0Q83ePin04g==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@covalent/core/-/core-2.1.0.tgz",
+      "integrity": "sha512-I3/VL76E198y8O2vWXci7uLEfBEB9dO8uZWwaJN3RFlSuS/HCzc/NUrElJ9aRwgmTm8KLQgJheVbg/CRQbn2Ug==",
       "requires": {
-        "tslib": "1.8.0"
+        "tslib": "1.10.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+        }
       }
     },
     "@mrmlnc/readdir-enhanced": {
@@ -1115,9 +1186,9 @@
       }
     },
     "@nifi-fds/core": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@nifi-fds/core/-/core-0.1.0.tgz",
-      "integrity": "sha512-aUoXOjhgQBZSxmzpBeYupIGvtw+J7Os+6n3q9JS22vcr7uVh588UMb1STKH1nVPRtDgkiU9ooGuXp9hkSCnC0w=="
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/@nifi-fds/core/-/core-0.2.0.tgz",
+      "integrity": "sha512-6yadtM2ahtkeFnuYN+D6M0qB81y2F3uBAC6ZovXe1c1lSocXSuJCoFJq9NRW6KFFqYAQnOyZi1+hA1Kw2+UfXg=="
     },
     "@nodelib/fs.stat": {
       "version": "1.1.3",
@@ -5785,12 +5856,12 @@
               "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
               "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
               "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.1",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~1.0.6",
-                "string_decoder": "~0.10.x",
-                "util-deprecate": "~1.0.1"
+                "core-util-is": "1.0.2",
+                "inherits": "2.0.3",
+                "isarray": "1.0.0",
+                "process-nextick-args": "1.0.7",
+                "string_decoder": "0.10.31",
+                "util-deprecate": "1.0.2"
               }
             },
             "string_decoder": {
@@ -5869,7 +5940,7 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "yallist": "3.0.0"
+                "yallist": "3.0.3"
               }
             }
           }
@@ -5922,9 +5993,9 @@
               "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz",
               "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=",
               "requires": {
-                "code-point-at": "1.0.0",
+                "code-point-at": "1.1.0",
                 "is-fullwidth-code-point": "1.0.0",
-                "strip-ansi": "3.0.0"
+                "strip-ansi": "3.0.1"
               }
             },
             "wide-align": {
@@ -5943,7 +6014,7 @@
           "requires": {
             "fs.realpath": "1.0.0",
             "inflight": "1.0.4",
-            "inherits": "2",
+            "inherits": "2.0.3",
             "minimatch": "3.0.4",
             "once": "1.3.0",
             "path-is-absolute": "1.0.0"
@@ -5955,7 +6026,7 @@
               "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=",
               "requires": {
                 "once": "1.3.0",
-                "wrappy": "1"
+                "wrappy": "1.0.2"
               }
             },
             "once": {
@@ -5978,7 +6049,7 @@
           "version": "0.4.24",
           "bundled": true,
           "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
+            "safer-buffer": "2.1.2"
           }
         },
         "ignore-walk": {
@@ -5992,8 +6063,8 @@
           "version": "1.0.6",
           "bundled": true,
           "requires": {
-            "once": "1.3.0",
-            "wrappy": "1"
+            "once": "1.4.0",
+            "wrappy": "1.0.2"
           }
         },
         "inherits": {
@@ -6039,7 +6110,7 @@
               "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz",
               "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=",
               "requires": {
-                "balanced-match": "0.4.1",
+                "balanced-match": "0.4.2",
                 "concat-map": "0.0.1"
               }
             }
@@ -6055,14 +6126,14 @@
           "bundled": true,
           "requires": {
             "safe-buffer": "5.1.2",
-            "yallist": "3.0.0"
+            "yallist": "3.0.3"
           }
         },
         "minizlib": {
           "version": "1.2.1",
           "bundled": true,
           "requires": {
-            "minipass": "2.2.1"
+            "minipass": "2.3.5"
           }
         },
         "mkdirp": {
@@ -6089,8 +6160,8 @@
           "version": "2.3.0",
           "bundled": true,
           "requires": {
-            "debug": "4.1.0",
-            "iconv-lite": "0.4.4",
+            "debug": "4.1.1",
+            "iconv-lite": "0.4.24",
             "sax": "1.2.4"
           }
         },
@@ -6109,7 +6180,7 @@
             "rc": "1.2.7",
             "rimraf": "2.6.1",
             "semver": "5.3.0",
-            "tar": "4"
+            "tar": "4.4.8"
           },
           "dependencies": {
             "debug": {
@@ -6157,8 +6228,8 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "debug": "2.1.2",
-                "iconv-lite": "0.4.4",
+                "debug": "2.6.9",
+                "iconv-lite": "0.4.24",
                 "sax": "1.2.4"
               }
             },
@@ -6169,8 +6240,8 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "ignore-walk": "3.0.0",
-                "npm-bundled": "1.0.1"
+                "ignore-walk": "3.0.1",
+                "npm-bundled": "1.0.6"
               }
             },
             "npmlog": {
@@ -6180,10 +6251,10 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "are-we-there-yet": "~1.1.2",
-                "console-control-strings": "~1.1.0",
-                "gauge": "~2.7.1",
-                "set-blocking": "~2.0.0"
+                "are-we-there-yet": "1.1.5",
+                "console-control-strings": "1.1.0",
+                "gauge": "2.7.4",
+                "set-blocking": "2.0.0"
               }
             },
             "rc": {
@@ -6194,9 +6265,9 @@
               "optional": true,
               "requires": {
                 "deep-extend": "0.5.1",
-                "ini": "~1.3.0",
+                "ini": "1.3.5",
                 "minimist": "1.2.0",
-                "strip-json-comments": "~2.0.1"
+                "strip-json-comments": "2.0.1"
               }
             },
             "rimraf": {
@@ -6206,7 +6277,7 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "glob": "7.0.5"
+                "glob": "7.1.3"
               }
             },
             "semver": {
@@ -6224,7 +6295,7 @@
           "dev": true,
           "optional": true,
           "requires": {
-            "abbrev": "1",
+            "abbrev": "1.1.1",
             "osenv": "0.1.4"
           },
           "dependencies": {
@@ -6235,8 +6306,8 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "os-homedir": "1.0.0",
-                "os-tmpdir": "1.0.0"
+                "os-homedir": "1.0.2",
+                "os-tmpdir": "1.0.2"
               }
             }
           }
@@ -6250,17 +6321,17 @@
           "bundled": true,
           "requires": {
             "ignore-walk": "3.0.1",
-            "npm-bundled": "1.0.1"
+            "npm-bundled": "1.0.6"
           }
         },
         "npmlog": {
           "version": "4.1.2",
           "bundled": true,
           "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
+            "are-we-there-yet": "1.1.5",
+            "console-control-strings": "1.1.0",
+            "gauge": "2.7.4",
+            "set-blocking": "2.0.0"
           }
         },
         "number-is-nan": {
@@ -6275,7 +6346,7 @@
           "version": "1.4.0",
           "bundled": true,
           "requires": {
-            "wrappy": "1"
+            "wrappy": "1.0.2"
           }
         },
         "os-homedir": {
@@ -6290,8 +6361,8 @@
           "version": "0.1.5",
           "bundled": true,
           "requires": {
-            "os-homedir": "1.0.0",
-            "os-tmpdir": "1.0.0"
+            "os-homedir": "1.0.2",
+            "os-tmpdir": "1.0.2"
           }
         },
         "path-is-absolute": {
@@ -6307,9 +6378,9 @@
           "bundled": true,
           "requires": {
             "deep-extend": "0.6.0",
-            "ini": "~1.3.0",
+            "ini": "1.3.5",
             "minimist": "1.2.0",
-            "strip-json-comments": "~2.0.1"
+            "strip-json-comments": "2.0.1"
           },
           "dependencies": {
             "minimist": {
@@ -6322,13 +6393,13 @@
           "version": "2.3.6",
           "bundled": true,
           "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "2.0.0",
+            "safe-buffer": "5.1.2",
+            "string_decoder": "1.1.1",
+            "util-deprecate": "1.0.2"
           }
         },
         "rimraf": {
@@ -6366,16 +6437,16 @@
           "version": "1.0.2",
           "bundled": true,
           "requires": {
-            "code-point-at": "1.0.0",
+            "code-point-at": "1.1.0",
             "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.0"
+            "strip-ansi": "3.0.1"
           }
         },
         "string_decoder": {
           "version": "1.1.1",
           "bundled": true,
           "requires": {
-            "safe-buffer": "~5.1.0"
+            "safe-buffer": "5.1.2"
           }
         },
         "strip-ansi": {
@@ -6418,7 +6489,7 @@
               "dev": true,
               "requires": {
                 "safe-buffer": "5.1.2",
-                "yallist": "3.0.0"
+                "yallist": "3.0.2"
               }
             },
             "minizlib": {
@@ -6428,7 +6499,7 @@
               "dev": true,
               "optional": true,
               "requires": {
-                "minipass": "2.2.1"
+                "minipass": "2.3.4"
               }
             },
             "mkdirp": {
@@ -6457,7 +6528,7 @@
           "version": "1.1.3",
           "bundled": true,
           "requires": {
-            "string-width": "1.0.2 || 2"
+            "string-width": "1.0.2"
           }
         },
         "wrappy": {
@@ -10857,6 +10928,12 @@
       "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
       "dev": true
     },
+    "parse5": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
+      "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
+      "optional": true
+    },
     "parseqs": {
       "version": "0.0.5",
       "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
@@ -12618,9 +12695,9 @@
       }
     },
     "roboto-fontface": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.9.0.tgz",
-      "integrity": "sha512-+G6+JXJWrXU98gUidXWgF1U+T7r21aiyqSWi5ZiZ/TBAWssw/t6DWM8piqNqaLqcO78DVJwfwHzlz8PuCMg0/Q=="
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz",
+      "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g=="
     },
     "run-async": {
       "version": "2.3.0",
@@ -12647,17 +12724,17 @@
       }
     },
     "rxjs": {
-      "version": "5.5.6",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz",
-      "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==",
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
+      "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
       "requires": {
-        "symbol-observable": "1.0.1"
+        "tslib": "1.10.0"
       },
       "dependencies": {
-        "symbol-observable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
-          "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
+        "tslib": {
+          "version": "1.10.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+          "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
         }
       }
     },
@@ -14378,16 +14455,6 @@
       "integrity": "sha512-LO95GIW16x69LuND1nuuwM4pjgFGupg7pZ/4lU86AmchPKrhk0o2tpMU2unXRrqo81iAFe1YJ0nAGEVwsrZAgg==",
       "dev": true
     },
-    "systemjs": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.21.3.tgz",
-      "integrity": "sha512-1x0kczVnT83fq/nE3ysXra9EEhOKv4+cMS95YkexWY8128J2VL8rk/nTWZig8qoY4/ZKZwZQWOECPx3XgAjjiA=="
-    },
-    "systemjs-plugin-text": {
-      "version": "0.0.11",
-      "resolved": "https://registry.npmjs.org/systemjs-plugin-text/-/systemjs-plugin-text-0.0.11.tgz",
-      "integrity": "sha1-hSwlTENq40JYyAYnq3KkkODVx8A="
-    },
     "table": {
       "version": "5.2.3",
       "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz",
@@ -16323,9 +16390,9 @@
       }
     },
     "zone.js": {
-      "version": "0.8.26",
-      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz",
-      "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.0.tgz",
+      "integrity": "sha512-EfygvVnLxPSCMSgJ4h7SoY+XNr7ybdwvvwEQ70lvMFl9coNnciXSyWi8Kg6znK1ubyUSffkCKvleSQpLuUKw0Q=="
     }
   }
 }
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/package.json b/nifi-registry-core/nifi-registry-web-ui/src/main/package.json
index 810a560..37ef7a7 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/package.json
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/package.json
@@ -14,7 +14,7 @@
   "//": "See the License for the specific language governing permissions and",
   "//": "limitations under the License.",
   "name": "nifi-registry",
-  "version": "0.0.1",
+  "version": "0.0.5-SNAPSHOT",
   "description": "",
   "scripts": {
     "start": "npm run watch",
@@ -52,34 +52,32 @@
   "dependencies": {
     "querystring": "0.2.0",
     "reset-css": "4.0.1",
-    "rxjs": "5.5.6",
+    "rxjs": "6.5.2",
     "superagent": "3.8.3",
-    "systemjs": "0.21.3",
-    "systemjs-plugin-text": "0.0.11",
-    "zone.js": "0.8.26",
+    "zone.js": "0.9.0",
     "tslib": "1.8.0",
     "material-design-icons": "3.0.1",
     "jquery": "3.4.1",
-    "@angular/animations": "5.2.0",
-    "@angular/cdk": "5.2.0",
-    "@angular/common": "5.2.0",
-    "@angular/compiler": "5.2.0",
-    "@angular/core": "5.2.0",
-    "@angular/flex-layout": "5.0.0-beta.14",
-    "@angular/forms": "5.2.0",
-    "@angular/http": "5.2.0",
-    "@angular/material": "5.2.0",
-    "@angular/platform-browser": "5.2.0",
-    "@angular/platform-browser-dynamic": "5.2.0",
-    "@angular/router": "5.2.0",
+    "@angular/animations": "8.1.1",
+    "@angular/cdk": "8.1.0",
+    "@angular/common": "8.1.1",
+    "@angular/compiler": "8.1.1",
+    "@angular/core": "8.1.1",
+    "@angular/flex-layout": "8.0.0-beta.26",
+    "@angular/forms": "8.1.1",
+    "@angular/http": "8.0.0-beta.10",
+    "@angular/material": "8.1.1",
+    "@angular/platform-browser": "8.1.1",
+    "@angular/platform-browser-dynamic": "8.1.1",
+    "@angular/router": "8.1.1",
     "angular2-jwt": "0.2.3",
-    "@covalent/core": "1.0.0",
-    "@nifi-fds/core": "0.1.0",
+    "@covalent/core": "2.1.0",
+    "@nifi-fds/core": "0.2.0",
     "angular2-moment": "1.9.0",
     "font-awesome": "4.7.0",
     "moment": "2.22.1",
     "hammerjs": "2.0.8",
-    "roboto-fontface": "0.9.0"
+    "roboto-fontface": "0.10.0"
   },
   "devDependencies": {
     "@babel/core": "7.4.4",
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/systemjs-text-to-html-loader.js b/nifi-registry-core/nifi-registry-web-ui/src/main/systemjs-text-to-html-loader.js
deleted file mode 100644
index 0842730..0000000
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/systemjs-text-to-html-loader.js
+++ /dev/null
@@ -1,30 +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.
- */
-
-/**
- * Removes inline systemjs-style loader syntax for html!text imports
- *
- *   require('./some-module.html!systemjs-plugin')  ->  require('./some-module.html')
- */
-module.exports = function (source) {
-    if (source.indexOf('.html')) {
-        const exp = new RegExp('require\\(([\'"])([^!\\s]*)!text\\1\\)', 'g');
-        source = source.replace(exp, `require($1$2$1)`);
-    }
-
-    return source;
-};
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
index d6e3d2a..21a0a71 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/nf-registry-administration.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 
@@ -46,7 +46,7 @@
 
                 // Spy
                 spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-                }).and.returnValue(Observable.of([{
+                }).and.returnValue(of([{
                     'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
                     'name': 'Flow #1',
                     'description': 'This is flow #1',
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.html
index 70e59ed..b2b6a81 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.html
@@ -17,7 +17,9 @@
 
 <div id="nifi-registry-admin-add-selected-users-to-group-dialog">
     <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center">
-        <span class="md-card-title">Add user to groups</span>
+        <mat-card-title class="ellipsis">
+            Add user to groups
+        </mat-card-title>
         <button mat-icon-button (click)="cancel()">
             <mat-icon color="primary">close</mat-icon>
         </button>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js
index 5c56830..0461bb0 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.js
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-import { TdDataTableService } from '@covalent/core';
+import { TdDataTableService } from '@covalent/core/data-table';
 import NfRegistryApi from 'services/nf-registry.api';
 import { Component } from '@angular/core';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { FdsSnackBarService } from '@nifi-fds/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
 import $ from 'jquery';
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js
index 1714e5c..910cdfa 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups.spec.js
@@ -19,9 +19,9 @@
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryAddUserToGroups
     from 'components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups';
-import { Observable } from 'rxjs';
-import { TdDataTableService } from '@covalent/core';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { of } from 'rxjs';
+import { TdDataTableService } from '@covalent/core/data-table';
+import { FdsSnackBarService } from '@nifi-fds/core';
 
 describe('NfRegistryAddUserToGroups Component isolated unit tests', function () {
     var comp;
@@ -46,9 +46,9 @@
 
         // Spy
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: 1, identity: 'Group 1'}));
+        }).and.returnValue(of({identifier: 1, identity: 'Group 1'}));
         spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: 1, identity: 'Group 1'}));
+        }).and.returnValue(of({identifier: 1, identity: 'Group 1'}));
         spyOn(comp.dialogRef, 'close');
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(comp, 'filterGroups').and.callThrough();
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.html
index 62eec9d..85114c1 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.html
@@ -17,16 +17,18 @@
 
 <div id="nifi-registry-admin-add-user-dialog">
     <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center">
-        <span class="md-card-title">Add User</span>
+        <mat-card-title class="ellipsis">
+            Add User
+        </mat-card-title>
         <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>
+        <div class="fill-available-width">
+            <mat-form-field floatLabel="always" fxFlex>
                 <input #newUserInput matInput floatPlaceholder="always" placeholder="Identity/Username">
-            </mat-input-container>
+            </mat-form-field>
         </div>
         <mat-checkbox [(ngModel)]="keepDialogOpen">
             Keep this dialog open after adding user
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js
index 9739798..e32d99d 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.js
@@ -19,7 +19,7 @@
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialogRef } from '@angular/material';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { FdsSnackBarService } from '@nifi-fds/core';
 
 /**
  * NfRegistryAddUser constructor.
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.spec.js
index e001eb0..c652ab5 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-user/nf-registry-add-user.spec.js
@@ -18,7 +18,7 @@
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryAddUser from 'components/administration/users/dialogs/add-user/nf-registry-add-user';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 
 describe('NfRegistryAddUser Component isolated unit tests', function () {
     var comp;
@@ -41,7 +41,7 @@
 
         // Spy
         spyOn(nfRegistryApi, 'addUser').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'identity': 'New User #1'
         }]));
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.html
index 6f8670c..4a078ea 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.html
@@ -17,7 +17,9 @@
 
 <div id="nifi-registry-admin-add-selected-users-to-group-dialog">
     <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center">
-        <span class="md-card-title">Add users to group</span>
+        <mat-card-title class="ellipsis">
+            Add users to group
+        </mat-card-title>
         <button mat-icon-button (click)="cancel()">
             <mat-icon color="primary">close</mat-icon>
         </button>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js
index c6511fb..b40af3d 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.js
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-import { TdDataTableService} from '@covalent/core';
+import { TdDataTableService } from '@covalent/core/data-table';
 import NfRegistryApi from 'services/nf-registry.api';
 import { Component } from '@angular/core';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { FdsSnackBarService } from '@nifi-fds/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
 import $ from 'jquery';
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.spec.js
index a8d176d..0126892 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group.spec.js
@@ -17,9 +17,9 @@
 
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
-import { Observable } from 'rxjs';
-import { TdDataTableService } from '@covalent/core';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { of } from 'rxjs';
+import { TdDataTableService } from '@covalent/core/data-table';
+import { FdsSnackBarService } from '@nifi-fds/core';
 import NfRegistryAddUsersToGroup from 'components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group';
 
 describe('NfRegistryAddUsersToGroup Component isolated unit tests', function () {
@@ -45,7 +45,7 @@
 
         // Spy
         spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: 1, identity: 'Group 1'}));
+        }).and.returnValue(of({identifier: 1, identity: 'Group 1'}));
         spyOn(comp.dialogRef, 'close');
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(comp, 'filterUsers').and.callThrough();
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.html
index d153651..cfa9f5f 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.html
@@ -17,16 +17,18 @@
 
 <div id="nifi-registry-admin-create-new-group-dialog">
     <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center">
-        <span class="md-card-title">Create New Group</span>
+        <mat-card-title class="ellipsis">
+            Create New Group
+        </mat-card-title>
         <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>
+        <div class="fill-available-width">
+            <mat-form-field floatLabel="always" fxFlex>
                 <input #createNewGroupInput matInput floatPlaceholder="always" placeholder="Display Name">
-            </mat-input-container>
+            </mat-form-field>
         </div>
         <mat-checkbox [(ngModel)]="keepDialogOpen">
             Keep this dialog open after creating group
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js
index e2239d0..52c1965 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.js
@@ -17,7 +17,7 @@
 
 import NfRegistryApi from 'services/nf-registry.api';
 import { Component, ViewChild } from '@angular/core';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { FdsSnackBarService } from '@nifi-fds/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { MatDialogRef } from '@angular/material';
 
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.spec.js
index 8dbb08a..e1258f0 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/dialogs/create-new-group/nf-registry-create-new-group.spec.js
@@ -17,7 +17,7 @@
 
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryCreateNewGroup from 'components/administration/users/dialogs/create-new-group/nf-registry-create-new-group';
 
 describe('NfRegistryCreateNewGroup Component isolated unit tests', function () {
@@ -40,7 +40,7 @@
 
         // Spy
         spyOn(nfRegistryApi, 'createNewGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'identity': 'New Group #1'
         }]));
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html
index 5ba1a1b..8e742cf 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.html
@@ -17,7 +17,9 @@
 
 <div id="nifi-registry-users-administration-perspective" class="mat-elevation-z5">
     <div fxFlex class="pad-top-md pad-bottom-sm pad-left-md pad-right-md">
-        <span class="md-card-title">Authorized Users ({{nfRegistryService.users.length + nfRegistryService.groups.length}})</span>
+        <mat-card-title class="ellipsis">
+            Authorized Users ({{nfRegistryService.users.length + nfRegistryService.groups.length}})
+        </mat-card-title>
         <div flex class="push-right-sm" fxLayout="row" fxLayoutAlign="end center">
             <td-chips class="push-right-sm"
                       [items]="nfRegistryService.autoCompleteUsersAndGroups"
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
index eee0e30..6c001b7 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-administration.js
@@ -15,17 +15,18 @@
  * limitations under the License.
  */
 
-import { FdsDialogService } from '@flow-design-system/dialogs';
+import { FdsDialogService } from '@nifi-fds/core';
 import { Component } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute, Router } from '@angular/router';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialog } from '@angular/material';
-import { Observable } from 'rxjs';
 import nfRegistryAnimations from 'nf-registry.animations';
 import NfStorage from 'services/nf-storage.service';
 import NfRegistryCreateNewGroup from 'components/administration/users/dialogs/create-new-group/nf-registry-create-new-group';
 import NfRegistryAddUser from 'components/administration/users/dialogs/add-user/nf-registry-add-user';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryUsersAdministration constructor.
@@ -60,13 +61,15 @@
         var self = this;
         this.nfRegistryService.inProgress = true;
         this.$subscription = this.route.params
-            .switchMap(function (params) {
-                self.nfRegistryService.adminPerspective = 'users';
-                return Observable.forkJoin(
-                    self.nfRegistryApi.getUsers(),
-                    self.nfRegistryApi.getUserGroups()
-                );
-            })
+            .pipe(
+                switchMap(function (params) {
+                    self.nfRegistryService.adminPerspective = 'users';
+                    return forkJoin(
+                        self.nfRegistryApi.getUsers(),
+                        self.nfRegistryApi.getUserGroups()
+                    );
+                })
+            )
             .subscribe(function (response) {
                 if (!response[0].status || response[0].status === 200) {
                     var users = response[0];
@@ -107,7 +110,8 @@
      */
     addUser: function () {
         this.dialog.open(NfRegistryAddUser, {
-            disableClose: true
+            disableClose: true,
+            width: '400px'
         });
     },
 
@@ -116,7 +120,8 @@
      */
     createNewGroup: function () {
         this.dialog.open(NfRegistryCreateNewGroup, {
-            disableClose: true
+            disableClose: true,
+            width: '400px'
         });
     },
 
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
index af72286..5105baf 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/nf-registry-users-adminstration.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick, async } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute } from '@angular/router';
@@ -37,7 +37,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({})
+                    params: of({})
                 }
             }
         ];
@@ -55,15 +55,15 @@
                 de = fixture.debugElement.query(ngPlatformBrowser.By.css('#nifi-registry-users-administration-perspective'));
 
                 // Spy
-                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(Observable.of({}));
-                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(Observable.of({}));
+                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(of({}));
+                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'getUsers').and.callFake(function () {
-                }).and.returnValue(Observable.of([{
+                }).and.returnValue(of([{
                     'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
                     'identity': 'User #1'
                 }]));
                 spyOn(nfRegistryApi, 'getUserGroups').and.callFake(function () {
-                }).and.returnValue(Observable.of([{
+                }).and.returnValue(of([{
                     'identifier': '5e04b4fb-9513-47bb-aa74-1ae34616bfdc',
                     'identity': 'Group #1'}]));
                 spyOn(nfRegistryService, 'filterUsersAndGroups');
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html
index 31eade4..978010f 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.html
@@ -23,15 +23,15 @@
         </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>
+        <div class="pad-left-md pad-right-md" flex fxLayoutAlign="start center">
+            <mat-form-field floatLabel="always" flex>
                 <input #groupnameInput matInput
                        [disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite || !nfRegistryService.group.configurable"
                        placeholder="Identity/Group Name"
                        value="{{nfRegistryService.group.identity}}"
-                       [(ngModel)]="_groupname">
-            </mat-input-container>
-            <button [disabled]="nfRegistryService.group.identity === _groupname || !nfRegistryService.group.configurable"
+                       [(ngModel)]="groupname">
+            </mat-form-field>
+            <button [disabled]="nfRegistryService.group.identity === groupname || !nfRegistryService.group.configurable"
                     (click)="updateGroupName(groupnameInput.value)"
                     class="input-button"
                     color="fds-regular"
@@ -167,7 +167,9 @@
         <div *ngIf="manageGroupPerspective === 'membership'">
             <div *ngIf="nfRegistryService.group.users" 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.group.users.length}})</span>
+                    <mat-card-title class="ellipsis">
+                        Membership ({{nfRegistryService.group.users.length}})
+                    </mat-card-title>
                     <button color="fds-secondary"
                             [disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite || !nfRegistryService.group.configurable"
                             mat-raised-button
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js
index d41f6e0..4cdc60e 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.js
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-import { TdDataTableService } from '@covalent/core';
-import { FdsDialogService } from '@flow-design-system/dialogs';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { TdDataTableService } from '@covalent/core/data-table';
+import { FdsDialogService, FdsSnackBarService } from '@nifi-fds/core';
 import { Component } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute, Router } from '@angular/router';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialog } from '@angular/material';
 import NfRegistryAddUsersToGroup from 'components/administration/users/dialogs/add-users-to-group/nf-registry-add-users-to-group';
+import { switchMap } from 'rxjs/operators';
 
 /**
  * NfRegistryManageGroup constructor.
@@ -52,7 +52,8 @@
             label: 'Display Name',
             sortable: true,
             tooltip: 'Group name.',
-            width: 100
+            width: 100,
+            active: true
         }
     ];
 
@@ -77,15 +78,17 @@
         var self = this;
         // subscribe to the route params
         this.$subscription = self.route.params
-            .switchMap(function (params) {
-                return self.nfRegistryApi.getUserGroup(params['groupId']);
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return self.nfRegistryApi.getUserGroup(params['groupId']);
+                })
+            )
             .subscribe(function (response) {
                 if (!response.status || response.status === 200) {
                     self.nfRegistryService.sidenav.open();
                     self.nfRegistryService.group = response;
                     self.groupname = response.identity;
-                    self.filterUsers();
+                    self.sortUsers(self.usersColumns.find(usersColumn => usersColumn.active === true));
                 } else if (response.status === 404) {
                     self.router.navigateByUrl('/nifi-registry/administration/users');
                 } else if (response.status === 409) {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js
index 0814755..7427ee4 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-group/nf-registry-manage-group.spec.js
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-import { TestBed, fakeAsync, tick } from '@angular/core/testing';
+import {TestBed, fakeAsync, tick} from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import {of} from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 
 import NfRegistryManageGroup from 'components/administration/users/sidenav/manage-group/nf-registry-manage-group';
-import { ActivatedRoute } from '@angular/router';
+import {ActivatedRoute} from '@angular/router';
 
 describe('NfRegistryManageGroup Component', function () {
     let comp;
@@ -35,7 +35,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({groupId: '123'})
+                    params: of({groupId: '123'})
                 }
             }
         ];
@@ -124,9 +124,9 @@
 
                 //Spy
                 spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
 
                 done();
             });
@@ -134,7 +134,7 @@
 
     it('should have a defined component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -213,7 +213,7 @@
 
     it('should FAIL to get user by id and redirect to admin users perspective', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -233,7 +233,7 @@
 
     it('should FAIL to get user by id and redirect to workflow perspective', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 409
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -254,7 +254,7 @@
     it('should redirect to users perspective', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -337,12 +337,12 @@
     it('should toggle to create the manage bucket privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404,
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -378,7 +378,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -467,11 +467,11 @@
     it('should toggle to update the manage bucket privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -507,7 +507,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -596,7 +596,7 @@
     it('should toggle to remove the manage bucket privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             userGroups: [
                 {
@@ -633,9 +633,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -724,12 +724,12 @@
     it('should toggle to create the manage proxy privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404,
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -765,7 +765,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -854,11 +854,11 @@
     it('should toggle to update the manage proxy privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -894,7 +894,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -983,7 +983,7 @@
     it('should toggle to remove the manage proxy privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             userGroups: [
                 {
@@ -1020,9 +1020,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1111,12 +1111,12 @@
     it('should toggle to create the manage policies privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404,
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -1152,7 +1152,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1241,11 +1241,11 @@
     it('should toggle to update the manage policies privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -1281,7 +1281,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1370,7 +1370,7 @@
     it('should toggle to remove the manage policies privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             userGroups: [
                 {
@@ -1407,9 +1407,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1498,12 +1498,12 @@
     it('should toggle to create the manage tenants privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404,
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -1539,7 +1539,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1628,11 +1628,11 @@
     it('should toggle to update the manage tenants privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             userGroups: [
                 {
                     identifier: '123',
@@ -1668,7 +1668,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1757,7 +1757,7 @@
     it('should toggle to remove the manage tenants privileges for the current group', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             userGroups: [
                 {
@@ -1794,9 +1794,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1889,12 +1889,12 @@
         spyOn(comp.dialog, 'open').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of({});
+                    return of({});
                 }
             };
         });
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -1980,7 +1980,7 @@
         spyOn(comp, 'filterUsers').and.callFake(function () {
         });
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -2059,8 +2059,8 @@
         //assertions
         expect(column.active).toBe(true);
         const filterUsersCall = comp.filterUsers.calls.first();
-        expect(filterUsersCall.args[0]).toBeUndefined();
-        expect(filterUsersCall.args[1]).toBeUndefined();
+        expect(filterUsersCall.args[0]).toBe('identity');
+        expect(filterUsersCall.args[1]).toBe('ASC');
     }));
 
     it('should remove user from group', fakeAsync(function () {
@@ -2069,7 +2069,7 @@
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -2132,7 +2132,7 @@
             }]
         }));
         spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
         });
         // 1st change detection triggers ngOnInit
@@ -2166,13 +2166,13 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -2235,7 +2235,7 @@
             }]
         }));
         spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'test',
             status: 200
@@ -2266,13 +2266,13 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
@@ -2335,7 +2335,7 @@
             }]
         }));
         spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'test',
             status: 409
@@ -2364,7 +2364,7 @@
     it('should destroy the component', fakeAsync(function () {
         spyOn(nfRegistryService.sidenav, 'close');
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'Group #1',
             resourcePermissions: {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
index 2b0a505..71adae2 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.html
@@ -23,16 +23,16 @@
         </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>
+        <div class="pad-left-md pad-right-md" flex fxLayoutAlign="start center">
+            <mat-form-field floatLabel="always" flex>
                 <input #usernameInput
                        matInput
                        [disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity) || !nfRegistryService.user.configurable"
                        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) || !nfRegistryService.user.configurable"
+                       [(ngModel)]="username">
+            </mat-form-field>
+            <button [disabled]="nfRegistryService.user.identity === username || (nfRegistryService.currentUser.identity === nfRegistryService.user.identity) || !nfRegistryService.user.configurable"
                     (click)="updateUserName(usernameInput.value)"
                     data-automation-id="nf-registry-manage-user-save-side-nav"
                     class="input-button"
@@ -173,7 +173,9 @@
         <div *ngIf="manageUserPerspective === 'membership'">
             <div *ngIf="nfRegistryService.user.userGroups" 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>
+                    <mat-card-title class="ellipsis">
+                        Membership ({{nfRegistryService.user.userGroups.length}})
+                    </mat-card-title>
                     <button color="fds-secondary"
                             [disabled]="!nfRegistryService.currentUser.resourcePermissions.tenants.canWrite || canAddNonConfigurableUserToGroup()"
                             mat-raised-button
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
index 0c74799..4d064b5 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.js
@@ -15,15 +15,15 @@
  * limitations under the License.
  */
 
-import { TdDataTableService } from '@covalent/core';
-import { FdsDialogService } from '@flow-design-system/dialogs';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { TdDataTableService } from '@covalent/core/data-table';
+import { FdsDialogService, FdsSnackBarService } from '@nifi-fds/core';
 import { Component } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute, Router } from '@angular/router';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialog } from '@angular/material';
 import NfRegistryAddUserToGroups from 'components/administration/users/dialogs/add-user-to-groups/nf-registry-add-user-to-groups';
+import { switchMap } from 'rxjs/operators';
 
 /**
  * NfRegistryManageUser constructor.
@@ -52,7 +52,8 @@
             label: 'Display Name',
             sortable: true,
             tooltip: 'Group name.',
-            width: 100
+            width: 100,
+            active: true
         }
     ];
 
@@ -77,15 +78,17 @@
         var self = this;
         // subscribe to the route params
         this.$subscription = self.route.params
-            .switchMap(function (params) {
-                return self.nfRegistryApi.getUser(params['userId']);
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return self.nfRegistryApi.getUser(params['userId']);
+                })
+            )
             .subscribe(function (response) {
                 if (!response.status || response.status === 200) {
                     self.nfRegistryService.sidenav.open();
                     self.nfRegistryService.user = response;
                     self.username = response.identity;
-                    self.filterGroups(this.sortBy, this.sortOrder);
+                    self.sortGroups(self.userGroupsColumns.find(userGroupsColumn => userGroupsColumn.active === true));
                 } else if (response.status === 404) {
                     self.router.navigateByUrl('/nifi-registry/administration/users');
                 } else if (response.status === 409) {
@@ -454,7 +457,8 @@
             data: {
                 user: this.nfRegistryService.user,
                 disableClose: true
-            }
+            },
+            width: '400px'
         }).afterClosed().subscribe(function () {
             self.nfRegistryApi.getUser(self.nfRegistryService.user.identifier)
                 .subscribe(function (response) {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.spec.js
index 23b46f5..49b42cc 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/users/sidenav/manage-user/nf-registry-manage-user.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute } from '@angular/router';
@@ -35,7 +35,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({userId: '123'})
+                    params: of({userId: '123'})
                 }
             }
         ];
@@ -93,9 +93,9 @@
 
                 //Spy
                 spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
 
                 done();
             });
@@ -103,7 +103,7 @@
 
     it('should have a defined component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -151,7 +151,7 @@
 
     it('should FAIL to get user by id and redirect to admin users perspective', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -171,7 +171,7 @@
 
     it('should FAIL to get user by id and redirect to workflow perspective', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 409
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -192,7 +192,7 @@
     it('should redirect to users perspective', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -244,11 +244,11 @@
     it('should toggle to create the manage bucket privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -284,7 +284,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -342,11 +342,11 @@
     it('should toggle to update the manage bucket privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -382,7 +382,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -440,7 +440,7 @@
     it('should toggle to remove the manage bucket privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             users: [
                 {
@@ -477,9 +477,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -537,11 +537,11 @@
     it('should toggle to create the manage proxy privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -577,7 +577,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -635,11 +635,11 @@
     it('should toggle to update the manage proxy privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -675,7 +675,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -733,7 +733,7 @@
     it('should toggle to remove the manage proxy privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             users: [
                 {
@@ -770,9 +770,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -830,11 +830,11 @@
     it('should toggle to create the manage policies privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -870,7 +870,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -928,11 +928,11 @@
     it('should toggle to update the manage policies privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -968,7 +968,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1026,7 +1026,7 @@
     it('should toggle to remove the manage policies privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             users: [
                 {
@@ -1063,9 +1063,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1123,11 +1123,11 @@
     it('should toggle to create the manage tenants privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'postPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -1163,7 +1163,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1221,11 +1221,11 @@
     it('should toggle to update the manage tenants privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: []
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [
                 {
                     identifier: '123',
@@ -1261,7 +1261,7 @@
             ]
         }));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1319,7 +1319,7 @@
     it('should toggle to remove the manage tenants privileges for the current user', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 400,
             users: [
                 {
@@ -1356,9 +1356,9 @@
             ]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1420,12 +1420,12 @@
         spyOn(comp.dialog, 'open').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of({});
+                    return of({});
                 }
             };
         });
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1480,7 +1480,7 @@
         spyOn(comp, 'filterGroups').and.callFake(function () {
         });
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1533,8 +1533,8 @@
         //assertions
         expect(column.active).toBe(true);
         const filterGroupsCall = comp.filterGroups.calls.first();
-        expect(filterGroupsCall.args[0]).toBeUndefined();
-        expect(filterGroupsCall.args[1]).toBeUndefined();
+        expect(filterGroupsCall.args[0]).toBe('identity');
+        expect(filterGroupsCall.args[1]).toBe('ASC');
     }));
 
     it('should remove user from group', fakeAsync(function () {
@@ -1543,7 +1543,7 @@
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1575,7 +1575,7 @@
             }
         }));
         spyOn(nfRegistryApi, 'getUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [{
                 identity: 'User #1'
             }],
@@ -1584,7 +1584,7 @@
             }]
         }));
         spyOn(nfRegistryApi, 'updateUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
         });
         // 1st change detection triggers ngOnInit
@@ -1619,13 +1619,13 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1657,7 +1657,7 @@
             }
         }));
         spyOn(nfRegistryApi, 'updateUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'test',
             status: 200
@@ -1688,13 +1688,13 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
@@ -1726,7 +1726,7 @@
             }
         }));
         spyOn(nfRegistryApi, 'updateUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'test',
             status: 409
@@ -1755,7 +1755,7 @@
     it('should destroy the component', fakeAsync(function () {
         spyOn(nfRegistryService.sidenav, 'close');
         spyOn(nfRegistryApi, 'getUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             identity: 'User #1',
             resourcePermissions: {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html
index 8a2c7c5..c46ba7c 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.html
@@ -17,7 +17,9 @@
 
 <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 Policy</span>
+        <mat-card-title class="ellipsis">
+            New Policy
+        </mat-card-title>
         <button mat-icon-button (click)="cancel()">
             <mat-icon color="primary">close</mat-icon>
         </button>
@@ -92,4 +94,4 @@
             Apply
         </button>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js
index 09207db..a437b08 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket.js
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
-import { Observable } from 'rxjs';
 import { Component, ViewChild } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
 import { ActivatedRoute } from '@angular/router';
-import { TdDataTableService } from '@covalent/core';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { TdDataTableService } from '@covalent/core/data-table';
+import { FdsSnackBarService } from '@nifi-fds/core';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryAddPolicyToBucket constructor.
@@ -64,12 +65,14 @@
     ngOnInit: function () {
         var self = this;
         this.route.params
-            .switchMap(function (params) {
-                return Observable.forkJoin(
-                    self.nfRegistryApi.getUsers(),
-                    self.nfRegistryApi.getUserGroups()
-                );
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return forkJoin(
+                        self.nfRegistryApi.getUsers(),
+                        self.nfRegistryApi.getUserGroups()
+                    );
+                })
+            )
             .subscribe(function (response) {
                 self.users = response[0];
                 self.users = self.users.filter(function (user) {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html
index 19f7663..4ceba1a 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.html
@@ -17,16 +17,18 @@
 
 <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>
+        <mat-card-title class="ellipsis">
+            New Bucket
+        </mat-card-title>
         <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>
+        <div class="fill-available-width">
+            <mat-form-field floatLabel="always" fxFlex>
                 <input #newBucketInput matInput floatPlaceholder="always" placeholder="Bucket Name">
-            </mat-input-container>
+            </mat-form-field>
         </div>
         <mat-checkbox #newBucketPublicReadCheckbox [disabled]="protocol === 'http:'" >
             Make publicly visible<i matTooltip="Allows read access to items in this bucket by unauthenticated users. Overrides any specific policies granting read access."
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js
index f529285..e23c60f 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.js
@@ -19,7 +19,7 @@
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialogRef } from '@angular/material';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { FdsSnackBarService } from '@nifi-fds/core';
 
 /**
  * NfRegistryCreateBucket constructor.
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.spec.js
index 5b14455..dd62fa4 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket.spec.js
@@ -18,7 +18,7 @@
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryCreateBucket from 'components/administration/workflow/dialogs/create-bucket/nf-registry-create-bucket';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 
 describe('NfRegistryCreateBucket Component isolated unit tests', function () {
     var comp;
@@ -39,7 +39,7 @@
 
         // Spy
         spyOn(nfRegistryApi, 'createBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({name: 'NewBucket'}));
+        }).and.returnValue(of({name: 'NewBucket'}));
         spyOn(nfRegistryService, 'filterBuckets');
         spyOn(comp.dialogRef, 'close');
     });
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.html
index 07302d0..8e4f3d0 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.html
@@ -17,15 +17,17 @@
 
 <div id="nifi-registry-admin-create-bucket-dialog">
     <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center">
-        <span class="md-card-title">Edit Policy</span>
+        <mat-card-title class="ellipsis">
+            Edit Policy
+        </mat-card-title>
         <button mat-icon-button (click)="cancel()">
             <mat-icon color="primary">close</mat-icon>
         </button>
     </div>
-    <div flex fxLayoutAlign="start center" class="pad-bottom-md">
-        <mat-input-container flex>
+    <div flex fxLayoutAlign="start center">
+        <mat-form-field floatLabel="always" flex>
             <input disabled value="{{userOrGroup.identity}}" #userOrGroupInput matInput placeholder="For This User/Group">
-        </mat-input-container>
+        </mat-form-field>
     </div>
     <div flex fxLayout="row" fxLayoutAlign="start center" class="pad-bottom-md">
         <mat-checkbox [(checked)]="readCheckbox.checked && writeCheckbox.checked && deleteCheckbox.checked" (change)="toggleAllPermissions($event)">
@@ -52,4 +54,4 @@
             Apply
         </button>
     </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
index fb40da7..dfda7b9 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy.js
@@ -15,12 +15,13 @@
  * limitations under the License.
  */
 
-import { Observable } from 'rxjs';
 import { Component, ViewChild } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
 import { ActivatedRoute } from '@angular/router';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryEditBucketPolicy constructor.
@@ -51,12 +52,14 @@
     ngOnInit: function () {
         var self = this;
         this.route.params
-            .switchMap(function (params) {
-                return Observable.forkJoin(
-                    self.nfRegistryApi.getUsers(),
-                    self.nfRegistryApi.getUserGroups()
-                );
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return forkJoin(
+                        self.nfRegistryApi.getUsers(),
+                        self.nfRegistryApi.getUserGroups()
+                    );
+                })
+            )
             .subscribe(function (response) {
                 var users = response[0];
                 var groups = response[1];
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
index fa28b5b..222ad4a 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.html
@@ -16,7 +16,9 @@
 -->
 <div id="nifi-registry-workflow-administration-perspective-buckets-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">Buckets ({{nfRegistryService.buckets.length}})</span>
+        <mat-card-title class="ellipsis">
+            Buckets ({{nfRegistryService.buckets.length}})
+        </mat-card-title>
         <div flex class="push-right-sm" fxLayout="row" fxLayoutAlign="end center">
             <td-chips class="push-right-sm"
                       [items]="nfRegistryService.autoCompleteBuckets"
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
index c823c8c..e8db578 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.js
@@ -22,6 +22,7 @@
 import nfRegistryAnimations from 'nf-registry.animations';
 import { ActivatedRoute } from '@angular/router';
 import { MatDialog } from '@angular/material';
+import { switchMap } from 'rxjs/operators';
 
 /**
  * NfRegistryWorkflowAdministration constructor.
@@ -52,10 +53,12 @@
         var self = this;
         this.nfRegistryService.inProgress = true;
         this.$subscription = this.route.params
-            .switchMap(function (params) {
-                self.nfRegistryService.adminPerspective = 'workflow';
-                return self.nfRegistryApi.getBuckets();
-            })
+            .pipe(
+                switchMap(function (params) {
+                    self.nfRegistryService.adminPerspective = 'workflow';
+                    return self.nfRegistryApi.getBuckets();
+                })
+            )
             .subscribe(function (buckets) {
                 self.nfRegistryService.buckets = buckets;
                 self.nfRegistryService.filterBuckets();
@@ -79,7 +82,8 @@
      */
     createBucket: function () {
         this.dialog.open(NfRegistryCreateBucket, {
-            disableClose: true
+            disableClose: true,
+            width: '400px'
         });
     }
 };
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
index d8a1e52..c2554a6 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/nf-registry-workflow-administration.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick, async } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import * as ngPlatformBrowser from '@angular/platform-browser';
@@ -36,7 +36,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({})
+                    params: of({})
                 }
             }
         ];
@@ -54,10 +54,10 @@
                 de = fixture.debugElement.query(ngPlatformBrowser.By.css('#nifi-registry-workflow-administration-perspective-buckets-container'));
 
                 // Spy
-                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(Observable.of({}));
-                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(Observable.of({}));
+                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(of({}));
+                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-                }).and.returnValue(Observable.of([{name: 'Bucket #1'}]));
+                }).and.returnValue(of([{name: 'Bucket #1'}]));
                 spyOn(nfRegistryService, 'filterBuckets');
 
                 done();
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
index 126aaa7..4486e35 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.html
@@ -17,14 +17,16 @@
 
 <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>
+        <mat-card-title class="ellipsis">
+            {{nfRegistryService.bucket.name}}
+        </mat-card-title>
         <button mat-icon-button data-automation-id="nf-registry-manage-bucket-close-side-nav" (click)="closeSideNav()">
             <mat-icon color="primary">close</mat-icon>
         </button>
     </div>
     <div class="sidenav-content">
         <div class="pad-left-md pad-right-md" flex fxLayoutAlign="start center">
-            <mat-input-container flex>
+            <mat-form-field floatLabel="always" flex>
                 <input #bucketnameInput
                        data-automation-id="nf-registry-manage-bucket-input-name"
                        matInput
@@ -32,7 +34,7 @@
                        placeholder="Identity/Bucket Name"
                        value="{{nfRegistryService.bucket.name}}"
                        [(ngModel)]="bucketname">
-            </mat-input-container>
+            </mat-form-field>
             <button [disabled]="nfRegistryService.bucket.name === bucketname"
                     (click)="updateBucketName(bucketnameInput.value)"
                     data-automation-id="nf-registry-manage-bucket-save-side-nav"
@@ -53,7 +55,9 @@
         </div>
         <div class="pad-top-md pad-left-md pad-right-md">
             <div class="pad-bottom-sm">
-                <span class="md-card-title">Bundle Settings</span>
+                <mat-card-title class="ellipsis">
+                    Bundle Settings
+                </mat-card-title>
             </div>
             <div>
                 <mat-checkbox #bundleRedeployCheckbox
@@ -66,7 +70,9 @@
         </div>
         <div *ngIf="!nfRegistryService.currentUser.anonymous || nfRegistryService.currentUser.resourcePermissions.policies.canRead" class="pad-top-md 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>
+                <mat-card-title class="ellipsis">
+                    Policies ({{userIdentitiesWithPolicies.length + groupIdentitiesWithPolicies.length}})
+                </mat-card-title>
                 <button color="fds-secondary"
                         [disabled]="nfRegistryService.currentUser.anonymous || !canEditBucketPolicies() || !nfRegistryService.currentUser.resourcePermissions.tenants.canRead"
                         mat-raised-button
@@ -146,7 +152,9 @@
         </div>
         <div class="pad-top-md pad-left-md pad-right-md">
             <div class="pad-bottom-sm">
-                <span class="md-card-title">About</span>
+                <mat-card-title class="ellipsis">
+                    About
+                </mat-card-title>
             </div>
             <div>
                 <span class="field-header">Bucket Identifier</span>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
index 367129c..c739c67 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.js
@@ -15,10 +15,8 @@
  * limitations under the License.
  */
 
-import { Observable } from 'rxjs';
-import { TdDataTableService } from '@covalent/core';
-import { FdsDialogService } from '@flow-design-system/dialogs';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { TdDataTableService } from '@covalent/core/data-table';
+import { FdsDialogService, FdsSnackBarService } from '@nifi-fds/core';
 import { Component } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute, Router } from '@angular/router';
@@ -26,6 +24,8 @@
 import { MatDialog } from '@angular/material';
 import NfRegistryAddPolicyToBucket from 'components/administration/workflow/dialogs/add-policy-to-bucket/nf-registry-add-policy-to-bucket';
 import NfRegistryEditBucketPolicy from 'components/administration/workflow/dialogs/edit-bucket-policy/nf-registry-edit-bucket-policy';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryManageBucket constructor.
@@ -50,7 +50,8 @@
             label: 'Display Name',
             sortable: true,
             tooltip: 'User/Group name.',
-            width: 40
+            width: 40,
+            active: true
         },
         {
             name: 'permissions',
@@ -93,12 +94,14 @@
     ngOnInit: function () {
         var self = this;
         this.$subscription = this.route.params
-            .switchMap(function (params) {
-                return Observable.forkJoin(
-                    self.nfRegistryApi.getBucket(params['bucketId']),
-                    self.nfRegistryApi.getPolicies()
-                );
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return forkJoin(
+                        self.nfRegistryApi.getBucket(params['bucketId']),
+                        self.nfRegistryApi.getPolicies()
+                    );
+                })
+            )
             .subscribe(function (response) {
                 if (!response[0].status || response[0].status === 200) {
                     self.nfRegistryService.sidenav.open();
@@ -125,7 +128,7 @@
                                     });
                                 }
                             });
-                            self.filterPolicies(this.sortBy, this.sortOrder);
+                            self.sortBuckets(self.bucketPoliciesColumns.find(bucketPoliciesColumn => bucketPoliciesColumn.active === true));
                         }
                     }
                 } else if (response[0].status === 404) {
@@ -198,7 +201,8 @@
             data: {
                 userOrGroup: userOrGroup,
                 disableClose: true
-            }
+            },
+            width: '400px'
         }).afterClosed().subscribe(function (dialogResult) {
             self.nfRegistryApi.getBucket(self.nfRegistryService.bucket.identifier)
                 .subscribe(function (response) {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
index 48f2a9f..1a853f1 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/administration/workflow/sidenav/manage-bucket/nf-registry-manage-bucket.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 
@@ -35,7 +35,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({bucketId: '123'})
+                    params: of({bucketId: '123'})
                 }
             }
         ];
@@ -66,9 +66,9 @@
 
                 //Spy
                 spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
                 spyOn(nfRegistryService, 'filterDroplets');
 
                 done();
@@ -77,12 +77,12 @@
 
     it('should have a defined component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: 'string',
                 resource: '/buckets/123',
@@ -114,11 +114,11 @@
 
     it('should FAIL to get bucket by id and redirect to workflow perspective', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -139,12 +139,12 @@
     it('should redirect to workflow perspective', fakeAsync(function () {
         // Spy
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: 'string',
                 resource: '/buckets/123',
@@ -183,7 +183,7 @@
         spyOn(comp.dialog, 'open').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of({
+                    return of({
                         userOrGroup: {
                             type: 'user'
                         }
@@ -193,12 +193,12 @@
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '123',
                 resource: '/buckets/123',
@@ -242,7 +242,7 @@
         spyOn(comp.dialog, 'open').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of({
+                    return of({
                         userOrGroup: {
                             type: 'group'
                         }
@@ -252,12 +252,12 @@
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '123',
                 resource: '/buckets/123',
@@ -301,7 +301,7 @@
         spyOn(comp.dialog, 'open').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of({
+                    return of({
                         userOrGroup: {
                             type: 'user'
                         }
@@ -311,12 +311,12 @@
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '123',
                 resource: '/buckets/123',
@@ -360,7 +360,7 @@
         spyOn(comp.dialog, 'open').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of({
+                    return of({
                         userOrGroup: {
                             type: 'group'
                         }
@@ -370,12 +370,12 @@
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '123',
                 resource: '/buckets/123',
@@ -416,12 +416,12 @@
         spyOn(comp, 'filterPolicies').and.callFake(function () {
         });
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: 'string',
                 resource: '/buckets/123',
@@ -452,8 +452,8 @@
         //assertions
         expect(column.active).toBe(true);
         const filterPoliciesCall = comp.filterPolicies.calls.first();
-        expect(filterPoliciesCall.args[0]).toBeUndefined();
-        expect(filterPoliciesCall.args[1]).toBeUndefined();
+        expect(filterPoliciesCall.args[0]).toBe('identity');
+        expect(filterPoliciesCall.args[1]).toBe('ASC');
     }));
 
     it('should remove policy from bucket', fakeAsync(function () {
@@ -463,18 +463,18 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '456',
                 resource: '/buckets/123',
@@ -489,7 +489,7 @@
             }
         ]));
         spyOn(nfRegistryApi, 'getPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             users: [{
                 identity: 'User #1'
             }],
@@ -498,7 +498,7 @@
             }]
         }));
         spyOn(nfRegistryApi, 'putPolicyActionResource').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
         });
         // 1st change detection triggers ngOnInit
@@ -535,18 +535,18 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '456',
                 resource: '/buckets/123',
@@ -561,7 +561,7 @@
             }
         ]));
         spyOn(nfRegistryApi, 'updateBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'test',
             status: 200
@@ -592,18 +592,18 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '456',
                 resource: '/buckets/123',
@@ -618,7 +618,7 @@
             }
         ]));
         spyOn(nfRegistryApi, 'updateBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'test',
             status: 409
@@ -649,18 +649,18 @@
         spyOn(comp.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
         spyOn(comp.snackBarService, 'openCoaster');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: '456',
                 resource: '/buckets/123',
@@ -675,7 +675,7 @@
             }
         ]));
         spyOn(nfRegistryApi, 'updateBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'test',
             status: 400
@@ -704,12 +704,12 @@
     it('should destroy the component', fakeAsync(function () {
         spyOn(nfRegistryService.sidenav, 'close');
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '123',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getPolicies').and.callFake(function () {
-        }).and.returnValue(Observable.of([
+        }).and.returnValue(of([
             {
                 identifier: 'string',
                 resource: '/buckets/123',
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
index 7ef7459..dd0c9e5 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.js
@@ -14,13 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 import { Component } from '@angular/core';
-import { Observable } from 'rxjs';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfStorage from 'services/nf-storage.service';
 import { ActivatedRoute, Router } from '@angular/router';
 import nfRegistryAnimations from 'nf-registry.animations';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryBucketGridListViewer constructor.
@@ -56,13 +58,15 @@
 
         // subscribe to the route params
         this.$subscription = this.route.params
-            .switchMap(function (params) {
-                return Observable.forkJoin(
-                    self.nfRegistryApi.getBuckets(),
-                    self.nfRegistryApi.getDroplets(params['bucketId']),
-                    self.nfRegistryApi.getBucket(params['bucketId'])
-                );
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return forkJoin(
+                        self.nfRegistryApi.getBuckets(),
+                        self.nfRegistryApi.getDroplets(params['bucketId']),
+                        self.nfRegistryApi.getBucket(params['bucketId'])
+                    );
+                })
+            )
             .subscribe(function (response) {
                 if (!response[0].status || response[0].status === 200) {
                     var buckets = response[0];
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
index 2edcf74..55c7842 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-bucket-grid-list-viewer.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute } from '@angular/router';
@@ -35,7 +35,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({bucketId: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'})
+                    params: of({bucketId: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc'})
                 }
             }
         ];
@@ -55,8 +55,8 @@
                 nfRegistryService.explorerViewType = 'grid-list';
 
                 //Spy
-                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(Observable.of({}));
-                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(Observable.of({}));
+                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(of({}));
+                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(of({}));
                 spyOn(nfRegistryService, 'filterDroplets');
 
                 done();
@@ -65,17 +65,17 @@
 
     it('should have a defined component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }]));
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
@@ -120,15 +120,15 @@
 
     it('should FAIL to get buckets, get bucket, and get droplets and redirect to view all buckets', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -148,17 +148,17 @@
 
     it('should destroy the component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }]));
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
index 6dbe655..1d68fb2 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.js
@@ -16,12 +16,13 @@
  */
 
 import { Component } from '@angular/core';
-import { Observable } from 'rxjs';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfStorage from 'services/nf-storage.service';
 import { ActivatedRoute, Router } from '@angular/router';
 import nfRegistryAnimations from 'nf-registry.animations';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryDropletGridListViewer constructor.
@@ -54,14 +55,16 @@
 
         // subscribe to the route params
         this.$subscription = this.route.params
-            .switchMap(function (params) {
-                return Observable.forkJoin(
-                    self.nfRegistryApi.getDroplet(params['bucketId'], params['dropletType'], params['dropletId']),
-                    self.nfRegistryApi.getBucket(params['bucketId']),
-                    self.nfRegistryApi.getBuckets(),
-                    self.nfRegistryApi.getDroplets(params['bucketId'])
-                );
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return 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) {
                 if (!response[0].status || response[0].status === 200) {
                     var droplet = response[0];
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
index 7bbfe3b..5d22c9c 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-droplet-grid-list-viewer.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute } from '@angular/router';
@@ -35,7 +35,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({
+                    params: of({
                         bucketId: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
                         dropletId: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
                         dropletType: 'flow'
@@ -60,8 +60,8 @@
                 nfRegistryService.explorerViewType = 'grid-list';
 
                 //Spy
-                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(Observable.of({}));
-                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(Observable.of({}));
+                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(of({}));
+                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(of({}));
                 spyOn(nfRegistryService, 'filterDroplets');
 
                 done();
@@ -70,7 +70,7 @@
 
     it('should have a defined component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
@@ -87,17 +87,17 @@
             }
         }));
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }]));
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
@@ -148,19 +148,19 @@
 
     it('should FAIL to get buckets, get bucket, get droplets, and get droplet and then redirect to view all buckets', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             status: 404
         }));
         spyOn(comp.router, 'navigateByUrl').and.callFake(function () {
@@ -180,7 +180,7 @@
 
     it('should destroy the component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplet').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
@@ -197,17 +197,17 @@
             }
         }));
         spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }]));
         spyOn(nfRegistryApi, 'getBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
             name: 'Bucket #1'
         }));
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
index fa41287..e0faa83 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.html
@@ -97,10 +97,10 @@
                                              *ngFor="let snapshotMeta of droplet.snapshotMetadata; let i = index"
                                              [active]="i === 0 ? true : false">
                                         <div fxLayout="column" fxLayoutAlign="space-between stretch">
-                                            <div *ngIf="snapshotMeta.comments" fxLayout="row" class="md-body-2">
+                                            <div *ngIf="snapshotMeta.comments" fxLayout="row" class="mat-body-2">
                                                 {{snapshotMeta.comments}}
                                             </div>
-                                            <div *ngIf="!snapshotMeta.comments" fxLayout="row" class="md-body-2">
+                                            <div *ngIf="!snapshotMeta.comments" fxLayout="row" class="mat-body-2">
                                                 No comments specified
                                             </div>
                                             <div fxLayout="row" class="mat-caption">
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
index 189961e..7af9538 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.js
@@ -16,12 +16,13 @@
  */
 
 import { Component } from '@angular/core';
-import { Observable } from 'rxjs';
 import NfRegistryService from 'services/nf-registry.service';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfStorage from 'services/nf-storage.service';
 import { ActivatedRoute } from '@angular/router';
 import nfRegistryAnimations from 'nf-registry.animations';
+import { switchMap } from 'rxjs/operators';
+import { forkJoin } from 'rxjs';
 
 /**
  * NfRegistryGridListViewer constructor.
@@ -56,10 +57,14 @@
 
         // subscribe to the route params
         this.$subscription = this.route.params
-            .switchMap(function (params) {
-                return Observable.forkJoin(self.nfRegistryApi.getDroplets(),
-                    self.nfRegistryApi.getBuckets());
-            })
+            .pipe(
+                switchMap(function (params) {
+                    return forkJoin(
+                        self.nfRegistryApi.getDroplets(),
+                        self.nfRegistryApi.getBuckets()
+                    );
+                })
+            )
             .subscribe(function (response) {
                 var droplets = response[0];
                 var buckets = response[1];
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
index 3f7724b..117f635 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/explorer/grid-list/registry/nf-registry-grid-list-viewer.spec.js
@@ -17,7 +17,7 @@
 
 import { TestBed, fakeAsync, tick } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import { ActivatedRoute } from '@angular/router';
@@ -35,7 +35,7 @@
             {
                 provide: ActivatedRoute,
                 useValue: {
-                    params: Observable.of({})
+                    params: of({})
                 }
             }
         ];
@@ -55,10 +55,10 @@
                 nfRegistryService.perspective = 'explorer';
 
                 // Spy
-                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(Observable.of({}));
-                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(Observable.of({}));
+                spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {}).and.returnValue(of({}));
+                spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {}).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'getBuckets').and.callFake(function () {
-                }).and.returnValue(Observable.of([{
+                }).and.returnValue(of([{
                     identifier: '2f7f9e54-dc09-4ceb-aa58-9fe581319cdc',
                     name: 'Bucket #1'
                 }]));
@@ -70,7 +70,7 @@
 
     it('should have a defined component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
@@ -111,7 +111,7 @@
 
     it('should destroy the component', fakeAsync(function () {
         spyOn(nfRegistryApi, 'getDroplets').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             'identifier': '2e04b4fb-9513-47bb-aa74-1ae34616bfdc',
             'name': 'Flow #1',
             'description': 'This is flow #1',
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.html
index 986e7b3..eee4614 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/dialogs/nf-registry-user-login.html
@@ -17,21 +17,23 @@
 
 <div id="nifi-registry-user-login-dialog">
     <div class="pad-bottom-md" fxLayout="row" fxLayoutAlign="space-between center">
-        <span class="md-card-title">Log In</span>
+        <mat-card-title class="ellipsis">
+            Log In
+        </mat-card-title>
         <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>
+        <div class="fill-available-width">
+            <mat-form-field floatLabel="always" fxFlex>
                 <input #usernameInput matInput floatPlaceholder="always" placeholder="Username">
-            </mat-input-container>
+            </mat-form-field>
         </div>
-        <div class="pad-bottom-md fill-available-width">
-            <mat-input-container floatPlaceholder="always" fxFlex>
+        <div class="fill-available-width">
+            <mat-form-field floatLabel="always" fxFlex>
                 <input #passwordInput type="password" matInput floatPlaceholder="always" placeholder="Password">
-            </mat-input-container>
+            </mat-form-field>
         </div>
     </div>
     <div fxLayout="row">
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/nf-registry-login.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/nf-registry-login.js
index eea633b..2ceec50 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/nf-registry-login.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/login/nf-registry-login.js
@@ -42,7 +42,8 @@
     ngOnInit: function () {
         this.nfRegistryService.perspective = 'login';
         this.dialog.open(NfUserLoginComponent, {
-            disableClose: true
+            disableClose: true,
+            width: '400px'
         });
     }
 };
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/page-not-found/nf-registry-page-not-found.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/page-not-found/nf-registry-page-not-found.js
index b6fe5d4..bc2e4d4 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/page-not-found/nf-registry-page-not-found.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/components/page-not-found/nf-registry-page-not-found.js
@@ -17,7 +17,7 @@
 import { Component } from '@angular/core';
 import NfRegistryService from 'services/nf-registry.service';
 import nfRegistryAnimations from 'nf-registry.animations';
-import { FdsDialogService } from '@flow-design-system/dialogs';
+import { FdsDialogService } from '@nifi-fds/core';
 import { Router } from '@angular/router';
 
 /**
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
index 2a0e771..a29ffba 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry-bootstrap.js
@@ -19,13 +19,6 @@
 import 'zone.js';
 import 'hammerjs';
 
-// patch Observable with appropriate methods
-import 'rxjs/add/operator/switchMap';
-import 'rxjs/add/operator/map';
-import 'rxjs/add/operator/catch';
-import 'rxjs/add/observable/of';
-import 'rxjs/add/observable/forkJoin';
-
 import $ from 'jquery';
 import NfRegistryModule from 'nf-registry.module';
 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
@@ -40,7 +33,6 @@
 import '@covalent/core/common/styles/font/MaterialIcons-Regular.ttf';
 import 'images/registry-logo-web-app.svg';
 import 'images/registry-background-logo.svg';
-import 'locale/messages.es.xlf';
 
 // Comment out this line when developing to assert for unidirectional data flow
 enableProdMode();
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.html
index 9d1e849..9cb589c 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.html
@@ -17,7 +17,7 @@
 
 <mat-progress-spinner id="loading-spinner" *ngIf="nfRegistryService.inProgress" mode="indeterminate"></mat-progress-spinner>
 <mat-sidenav-container>
-    <mat-sidenav #sidenav mode="over" align="end" opened="false" disableClose="true">
+    <mat-sidenav #sidenav mode="over" position="end" opened="false" disableClose="true">
         <router-outlet name="sidenav"></router-outlet>
     </mat-sidenav>
     <div id="nf-registry-app-container">
@@ -83,9 +83,9 @@
                     routerLink="/nifi-registry/administration/workflow">
                 <i class="fa fa-wrench" aria-hidden="true"></i>
             </button>
-            <button matTooltip="Close settings" mat-ripple *ngIf="nfRegistryService.perspective === 'administration'" mat-mini-fab
+            <button color="primary" matTooltip="Close settings" mat-ripple *ngIf="nfRegistryService.perspective === 'administration'" mat-mini-fab
                     routerLink="/nifi-registry/explorer/{{(nfRegistryService.explorerViewType) ? nfRegistryService.explorerViewType : 'grid-list'}}">
-                <mat-icon color="primary">close</mat-icon>
+                <mat-icon>close</mat-icon>
             </button>
         </mat-toolbar>
         <div id="nf-registry-perspectives-container">
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
index b324e37..59c7262 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.module.js
@@ -20,7 +20,7 @@
 import { NgModule } from '@angular/core';
 
 import NfRegistryRoutes from 'nf-registry.routes';
-import fdsCore from '@flow-design-system/core';
+import { FdsCoreModule } from '@nifi-fds/core';
 import NfRegistry from 'nf-registry';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
@@ -64,7 +64,7 @@
     new NgModule({
         imports: [
             MomentModule,
-            fdsCore,
+            FdsCoreModule,
             HttpClientModule,
             NfRegistryRoutes
         ],
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.testbed-factory.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.testbed-factory.js
index 2265001..d71a858 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.testbed-factory.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/nf-registry.testbed-factory.js
@@ -20,14 +20,13 @@
     BrowserDynamicTestingModule,
     platformBrowserDynamicTesting
 } from '@angular/platform-browser-dynamic/testing';
-import { Observable } from 'rxjs';
 import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
 import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { MomentModule } from 'angular2-moment';
 
 import NfRegistryRoutes from 'nf-registry.routes';
 import { APP_BASE_HREF } from '@angular/common';
-import fdsCore from '@flow-design-system/core';
+import { FdsCoreModule } from '@nifi-fds/core';
 import NfRegistry from 'nf-registry';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
@@ -48,30 +47,6 @@
 import NfLoginComponent from 'components/login/nf-registry-login';
 import NfUserLoginComponent from 'components/login/dialogs/nf-registry-user-login';
 
-// rxjs Observable debugger;
-var debuggerOn = false;
-
-/* eslint-disable no-console */
-Observable.prototype.debug = function (message) {
-    return this.do(
-        function (next) {
-            if (debuggerOn) {
-                console.log(message, next);
-            }
-        },
-        function (err) {
-            if (debuggerOn) {
-                console.error('ERROR >>> ', message, err);
-            }
-        },
-        function () {
-            if (debuggerOn) {
-                console.log('Completed.');
-            }
-        }
-    );
-};
-
 const initTestBed = ({ providers } = { providers: [] }) => {
     TestBed.resetTestEnvironment();
 
@@ -85,7 +60,7 @@
             MomentModule,
             HttpClientModule,
             HttpClientTestingModule,
-            fdsCore,
+            FdsCoreModule,
             NfRegistryRoutes
         ],
         declarations: [
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
index 2d2da8e..0c088ea 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.js
@@ -17,8 +17,9 @@
 
 import NfStorage from 'services/nf-storage.service';
 import { HttpClient, HttpHeaders } from '@angular/common/http';
-import { FdsDialogService } from '@flow-design-system/dialogs';
-import { Observable } from 'rxjs';
+import { FdsDialogService } from '@nifi-fds/core';
+import { of } from 'rxjs';
+import { map, catchError } from 'rxjs/operators';
 
 var MILLIS_PER_SECOND = 1000;
 var headers = new Headers({'Content-Type': 'application/json'});
@@ -57,19 +58,20 @@
         var self = this;
         var url = '/nifi-registry-api/' + dropletUri;
         url += '/versions';
-        return this.http.get(url)
-            .map(function (response) {
+        return this.http.get(url).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -83,19 +85,20 @@
     getDroplet: function (bucketId, dropletType, dropletId) {
         var self = this;
         var url = '/nifi-registry-api/buckets/' + bucketId + '/' + dropletType + '/' + dropletId;
-        return this.http.get(url)
-            .map(function (response) {
-                return response || {};
-            })
-            .catch(function (error) {
+        return this.http.get(url).pipe(
+            map(function (response) {
+                return response;
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Flow Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -112,13 +115,14 @@
         if (bucketId) {
             url += '/' + bucketId;
         }
-        return this.http.get(url)
-            .map(function (response) {
-                return response || [];
+        return this.http.get(url).pipe(
+            map(function (response) {
+                return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -134,19 +138,20 @@
      */
     deleteDroplet: function (dropletUri) {
         var self = this;
-        return this.http.delete('/nifi-registry-api/' + dropletUri, headers)
-            .map(function (response) {
+        return this.http.delete('/nifi-registry-api/' + dropletUri, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -157,19 +162,20 @@
      */
     createBucket: function (name, allowPublicRead) {
         var self = this;
-        return this.http.post('/nifi-registry-api/buckets', {'name': name, 'allowPublicRead': allowPublicRead}, headers)
-            .map(function (response) {
+        return this.http.post('/nifi-registry-api/buckets', {'name': name, 'allowPublicRead': allowPublicRead}, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -180,19 +186,20 @@
      */
     deleteBucket: function (bucketId) {
         var self = this;
-        return this.http.delete('/nifi-registry-api/buckets/' + bucketId, headers)
-            .map(function (response) {
+        return this.http.delete('/nifi-registry-api/buckets/' + bucketId, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -204,19 +211,20 @@
     getBucket: function (bucketId) {
         var self = this;
         var url = '/nifi-registry-api/buckets/' + bucketId;
-        return this.http.get(url)
-            .map(function (response) {
+        return this.http.get(url).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Bucket Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -230,19 +238,20 @@
     getBuckets: function () {
         var self = this;
         var url = '/nifi-registry-api/buckets';
-        return this.http.get(url)
-            .map(function (response) {
+        return this.http.get(url).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Buckets Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -252,13 +261,14 @@
      * @returns {*}
      */
     updateBucket: function (updatedBucket) {
-        return this.http.put('/nifi-registry-api/buckets/' + updatedBucket.identifier, updatedBucket, headers)
-            .map(function (response) {
+        return this.http.put('/nifi-registry-api/buckets/' + updatedBucket.identifier, updatedBucket, headers).pipe(
+            map(function (response) {
                 return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -269,19 +279,20 @@
      */
     getUser: function (userId) {
         var self = this;
-        return this.http.get('/nifi-registry-api/tenants/users/' + userId)
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/tenants/users/' + userId).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'User Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -321,19 +332,20 @@
                     canDelete: false
                 }
             }
-        }, headers)
-            .map(function (response) {
+        }, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -347,13 +359,14 @@
         return this.http.put('/nifi-registry-api/tenants/users/' + identifier, {
             'identifier': identifier,
             'identity': identity
-        }, headers)
-            .map(function (response) {
+        }, headers).pipe(
+            map(function (response) {
                 return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -363,19 +376,20 @@
      */
     getUsers: function () {
         var self = this;
-        return this.http.get('/nifi-registry-api/tenants/users')
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/tenants/users').pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Users Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -386,19 +400,20 @@
      */
     deleteUser: function (userId) {
         var self = this;
-        return this.http.delete('/nifi-registry-api/tenants/users/' + userId, headers)
-            .map(function (response) {
+        return this.http.delete('/nifi-registry-api/tenants/users/' + userId, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -408,19 +423,20 @@
      */
     getUserGroups: function () {
         var self = this;
-        return this.http.get('/nifi-registry-api/tenants/user-groups')
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/tenants/user-groups').pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Groups Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -431,19 +447,20 @@
      */
     getUserGroup: function (groupId) {
         var self = this;
-        return this.http.get('/nifi-registry-api/tenants/user-groups/' + groupId)
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/tenants/user-groups/' + groupId).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Group Not Found',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -454,19 +471,20 @@
      */
     deleteUserGroup: function (userGroupId) {
         var self = this;
-        return this.http.delete('/nifi-registry-api/tenants/user-groups/' + userGroupId, headers)
-            .map(function (response) {
+        return this.http.delete('/nifi-registry-api/tenants/user-groups/' + userGroupId, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -483,19 +501,20 @@
             'identifier': identifier,
             'identity': identity,
             'users': users
-        }, headers)
-            .map(function (response) {
+        }, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -511,13 +530,14 @@
             'identifier': identifier,
             'identity': identity,
             'users': users
-        }, headers)
-            .map(function (response) {
+        }, headers).pipe(
+            map(function (response) {
                 return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -527,13 +547,14 @@
      */
     getPolicies: function () {
         var url = '/nifi-registry-api/policies';
-        return this.http.get(url)
-            .map(function (response) {
+        return this.http.get(url).pipe(
+            map(function (response) {
                 return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -545,13 +566,14 @@
      * @returns {*}
      */
     getResourcePoliciesById: function (action, resource, resourceId) {
-        return this.http.get('/nifi-registry-api/policies/' + action + resource + '/' + resourceId)
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/policies/' + action + resource + '/' + resourceId).pipe(
+            map(function (response) {
                 return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -562,13 +584,14 @@
      * @returns {*}
      */
     getPolicyActionResource: function (action, resource) {
-        return this.http.get('/nifi-registry-api/policies/' + action + resource)
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/policies/' + action + resource).pipe(
+            map(function (response) {
                 return response;
+            }),
+            catchError(function (error) {
+                return of(error);
             })
-            .catch(function (error) {
-                return Observable.of(error);
-            });
+        );
     },
 
     /**
@@ -589,19 +612,20 @@
             'action': action,
             'users': users,
             'userGroups': userGroups
-        }, headers)
-            .map(function (response) {
+        }, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -620,19 +644,20 @@
             'action': action,
             'users': users,
             'userGroups': userGroups
-        }, headers)
-            .map(function (response) {
+        }, headers).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: error.error,
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of(error);
-            });
+                return of(error);
+            })
+        );
     },
 
     /**
@@ -655,8 +680,8 @@
             withCredentials: true,
             responseType: 'text'
         };
-        return this.http.post('/nifi-registry-api/access/token/login', null, options)
-            .map(function (jwt) {
+        return this.http.post('/nifi-registry-api/access/token/login', null, options).pipe(
+            map(function (jwt) {
                 // get the payload and store the token with the appropriate expiration
                 var token = self.nfStorage.getJwtPayload(jwt);
                 if (token) {
@@ -664,16 +689,17 @@
                     self.nfStorage.setItem('jwt', jwt, expiration);
                 }
                 return jwt;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 self.dialogService.openConfirm({
                     title: 'Error',
                     message: 'Please contact your System Administrator.',
                     acceptButton: 'Ok',
                     acceptButtonColor: 'fds-warn'
                 });
-                return Observable.of('');
-            });
+                return of('');
+            })
+        );
     },
 
     /**
@@ -684,10 +710,10 @@
     ticketExchange: function () {
         var self = this;
         if (this.nfStorage.hasItem('jwt')) {
-            return Observable.of(self.nfStorage.getItem('jwt'));
+            return of(self.nfStorage.getItem('jwt'));
         }
-        return this.http.post(config.urls.kerberos, null, {responseType: 'text'})
-            .map(function (jwt) {
+        return this.http.post(config.urls.kerberos, null, {responseType: 'text'}).pipe(
+            map(function (jwt) {
                 // get the payload and store the token with the appropriate expiration
                 var token = self.nfStorage.getJwtPayload(jwt);
                 if (token) {
@@ -695,10 +721,11 @@
                     self.nfStorage.setItem('jwt', jwt, expiration);
                 }
                 return jwt;
+            }),
+            catchError(function (error) {
+                return of('');
             })
-            .catch(function (error) {
-                return Observable.of('');
-            });
+        );
     },
 
     /**
@@ -708,12 +735,12 @@
      */
     loadCurrentUser: function () {
         // get the current user
-        return this.http.get(config.urls.currentUser)
-            .map(function (response) {
+        return this.http.get(config.urls.currentUser).pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
-                return Observable.of({
+            }),
+            catchError(function (error) {
+                return of({
                     error: error,
                     resourcePermissions: {
                         anyTopLevelResource: {
@@ -743,7 +770,8 @@
                         }
                     }
                 });
-            });
+            })
+        );
     },
 
     /**
@@ -752,14 +780,15 @@
      * @returns {*}
      */
     getRegistryConfig: function (action, resource) {
-        return this.http.get('/nifi-registry-api/config')
-            .map(function (response) {
+        return this.http.get('/nifi-registry-api/config').pipe(
+            map(function (response) {
                 return response;
-            })
-            .catch(function (error) {
+            }),
+            catchError(function (error) {
                 // If failed, return an empty object.
-                return Observable.of({});
-            });
+                return of({});
+            })
+        );
     }
 
 };
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
index adf88ff..9e6373b 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.api.spec.js
@@ -25,7 +25,7 @@
     NfRegistryResourcesAuthGuard,
     NfRegistryWorkflowsAdministrationAuthGuard
 } from 'services/nf-registry.auth-guard.service';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 
 describe('NfRegistry API w/ Angular testing utils', function () {
     let nfRegistryApi;
@@ -207,7 +207,7 @@
         spyOn(nfRegistryApi.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
@@ -501,7 +501,7 @@
         spyOn(nfRegistryApi.dialogService, 'openConfirm').and.callFake(function () {
             return {
                 afterClosed: function () {
-                    return Observable.of(true);
+                    return of(true);
                 }
             };
         });
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js
index f003e80..8ac6d38 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.js
@@ -18,7 +18,7 @@
 import NfRegistryService from 'services/nf-registry.service';
 import NfStorage from 'services/nf-storage.service';
 import { Router } from '@angular/router';
-import { FdsDialogService } from '@flow-design-system/dialogs';
+import { FdsDialogService } from '@nifi-fds/core';
 import NfRegistryApi from 'services/nf-registry.api';
 
 /**
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.spec.js
index e57af6f..e826fac 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.auth-guard.service.spec.js
@@ -23,7 +23,7 @@
 } from 'services/nf-registry.auth-guard.service';
 import NfRegistryService from 'services/nf-registry.service';
 import NfStorage from 'services/nf-storage.service';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 
 describe('NfRegistry Auth Guard Service NfRegistryResourcesAuthGuard isolated unit tests', function () {
     var nfRegistryService;
@@ -54,13 +54,13 @@
         // Spy
         spyOn(router, 'navigateByUrl');
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(dialogService, 'openConfirm');
     });
 
     it('should navigate to test url (registry security not configured) ', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: true
         }));
         spyOn(nfStorage, 'getItem').and.callFake(function () {
@@ -81,7 +81,7 @@
 
     it('should navigate to test url (registry security configured and we know who you are) ', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false
         }));
         spyOn(nfStorage, 'hasItem').and.callFake(function () {
@@ -101,7 +101,7 @@
 
     it('should navigate to login', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false
         }));
 
@@ -117,7 +117,7 @@
 
     it('should navigate to login (error loading current user)', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             error: {
                 status: 401
             }
@@ -165,13 +165,13 @@
         // Spy
         spyOn(router, 'navigateByUrl');
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(dialogService, 'openConfirm');
     });
 
     it('should navigate to base nifi-registry url', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: true
         }));
         nfRegistryLoginAuthGuard = new NfRegistryLoginAuthGuard(nfRegistryService, nfRegistryApi, nfStorage, router);
@@ -187,7 +187,7 @@
 
     it('should navigate to test url', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false
         }));
         nfRegistryLoginAuthGuard = new NfRegistryLoginAuthGuard(nfRegistryService, nfRegistryApi, nfStorage, router);
@@ -231,13 +231,13 @@
         // Spy
         spyOn(router, 'navigateByUrl');
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(dialogService, 'openConfirm');
     });
 
     it('should navigate to login', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             error: {
                 status: 401
             }
@@ -255,7 +255,7 @@
 
     it('should deny access (registry security not configured) and navigate to administration workflow perspective', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: true
         }));
         nfRegistryUsersAdministrationAuthGuard = new NfRegistryUsersAdministrationAuthGuard(nfRegistryService, nfRegistryApi, nfStorage, router, dialogService);
@@ -276,7 +276,7 @@
 
     it('should deny access (non-admin) and navigate to explorer perspective', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false,
             resourcePermissions: {
                 anyTopLevelResource: {
@@ -324,7 +324,7 @@
 
     it('should deny access (no tenants permissions) and navigate to explorer perspective', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false,
             resourcePermissions: {
                 anyTopLevelResource: {
@@ -372,7 +372,7 @@
 
     it('should deny access (no tenants permissions) and navigate to test url', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false,
             resourcePermissions: {
                 anyTopLevelResource: {
@@ -443,13 +443,13 @@
         // Spy
         spyOn(router, 'navigateByUrl');
         spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-        }).and.returnValue(Observable.of({}));
+        }).and.returnValue(of({}));
         spyOn(dialogService, 'openConfirm');
     });
 
     it('should navigate to login', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             error: {
                 status: 401
             }
@@ -467,7 +467,7 @@
 
     it('should (registry security not configured) navigate to test url', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: true
         }));
         nfRegistryWorkflowsAdministrationAuthGuard = new NfRegistryWorkflowsAdministrationAuthGuard(nfRegistryService, nfRegistryApi, nfStorage, router, dialogService);
@@ -483,7 +483,7 @@
 
     it('should deny access (non-admin) and navigate to explorer perspective', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false,
             resourcePermissions: {
                 anyTopLevelResource: {
@@ -531,7 +531,7 @@
 
     it('should deny access (no buckets permissions) and navigate to users administration perspective', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false,
             resourcePermissions: {
                 anyTopLevelResource: {
@@ -579,7 +579,7 @@
 
     it('should deny access (no tenants permissions) and navigate to test url', function () {
         spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({
+        }).and.returnValue(of({
             anonymous: false,
             resourcePermissions: {
                 anyTopLevelResource: {
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
index 33c41cc..2c36402 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.js
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-import { TdDataTableService } from '@covalent/core';
+import { TdDataTableService } from '@covalent/core/data-table';
 import { Router } from '@angular/router';
-import { FdsDialogService } from '@flow-design-system/dialogs';
-import { FdsSnackBarService } from '@flow-design-system/snackbars';
+import { FdsDialogService, FdsSnackBarService } from '@nifi-fds/core';
 import NfRegistryApi from 'services/nf-registry.api.js';
 import NfStorage from 'services/nf-storage.service.js';
 
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
index 41e3b22..da2ffd7 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/services/nf-registry.service.spec.js
@@ -17,11 +17,12 @@
 
 import { TestBed } from '@angular/core/testing';
 import initTestBed from 'nf-registry.testbed-factory';
-import { Observable } from 'rxjs';
+import { of } from 'rxjs';
 import NfRegistryApi from 'services/nf-registry.api';
 import NfRegistryService from 'services/nf-registry.service';
 import { Router } from '@angular/router';
-import fdsDialogsModule from '@flow-design-system/dialogs';
+import { FdsDialogService } from '@nifi-fds/core';
+
 
 describe('NfRegistry Service isolated unit tests', function () {
     let nfRegistryService;
@@ -669,9 +670,9 @@
                 spyOn(nfRegistryApi.http, 'post').and.callFake(function () {
                 });
                 spyOn(nfRegistryApi, 'ticketExchange').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
                 spyOn(nfRegistryApi, 'loadCurrentUser').and.callFake(function () {
-                }).and.returnValue(Observable.of({}));
+                }).and.returnValue(of({}));
 
                 done();
             });
@@ -680,7 +681,7 @@
     it('should retrieve the snapshot metadata for the given droplet.', function () {
         //Spy
         spyOn(nfRegistryApi, 'getDropletSnapshotMetadata').and.callFake(function () {
-        }).and.returnValue(Observable.of([{
+        }).and.returnValue(of([{
             version: 999
         }]));
 
@@ -706,11 +707,11 @@
         //Spy
         spyOn(nfRegistryService.dialogService, 'openConfirm').and.returnValue({
             afterClosed: function () {
-                return Observable.of(true);
+                return of(true);
             }
         });
         spyOn(nfRegistryApi, 'deleteDroplet').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
+        }).and.returnValue(of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
         spyOn(nfRegistryService, 'filterDroplets').and.callFake(function () {
         });
 
@@ -779,7 +780,7 @@
 
     it('should execute a `delete` action on a bucket.', function () {
         // from the root injector
-        const dialogService = TestBed.get(fdsDialogsModule.FdsDialogService);
+        const dialogService = TestBed.get(FdsDialogService);
 
         //Spy
         spyOn(nfRegistryService, 'filterBuckets').and.callFake(function () {
@@ -787,11 +788,11 @@
         spyOn(dialogService, 'openConfirm').and.callFake(function () {
         }).and.returnValue({
             afterClosed: function () {
-                return Observable.of(true);
+                return of(true);
             }
         });
         spyOn(nfRegistryApi, 'deleteBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
+        }).and.returnValue(of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
 
         // object to be updated by the test
         const bucket = {identifier: '999'};
@@ -831,7 +832,7 @@
 
     it('should execute a `delete` action on a user.', function () {
         // from the root injector
-        const dialogService = TestBed.get(fdsDialogsModule.FdsDialogService);
+        const dialogService = TestBed.get(FdsDialogService);
 
         //Spy
         spyOn(nfRegistryService, 'filterUsersAndGroups').and.callFake(function () {
@@ -839,11 +840,11 @@
         spyOn(dialogService, 'openConfirm').and.callFake(function () {
         }).and.returnValue({
             afterClosed: function () {
-                return Observable.of(true);
+                return of(true);
             }
         });
         spyOn(nfRegistryApi, 'deleteUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
+        }).and.returnValue(of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
 
         // object to be updated by the test
         const user = {identifier: '999'};
@@ -883,7 +884,7 @@
 
     it('should execute a `delete` action on a group.', function () {
         // from the root injector
-        const dialogService = TestBed.get(fdsDialogsModule.FdsDialogService);
+        const dialogService = TestBed.get(FdsDialogService);
 
         //Spy
         spyOn(nfRegistryService, 'filterUsersAndGroups').and.callFake(function () {
@@ -891,11 +892,11 @@
         spyOn(dialogService, 'openConfirm').and.callFake(function () {
         }).and.returnValue({
             afterClosed: function () {
-                return Observable.of(true);
+                return of(true);
             }
         });
         spyOn(nfRegistryApi, 'deleteUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
+        }).and.returnValue(of({identifier: '2e04b4fb-9513-47bb-aa74-1ae34616bfdc', link: null}));
 
         // object to be updated by the test
         const group = {identifier: '999'};
@@ -1005,7 +1006,7 @@
 
     it('should delete all selected buckets.', function () {
         // from the root injector
-        const dialogService = TestBed.get(fdsDialogsModule.FdsDialogService);
+        const dialogService = TestBed.get(FdsDialogService);
 
         //Spy
         spyOn(nfRegistryService, 'filterBuckets').and.callFake(function () {
@@ -1015,11 +1016,11 @@
         spyOn(dialogService, 'openConfirm').and.callFake(function () {
         }).and.returnValue({
             afterClosed: function () {
-                return Observable.of(true);
+                return of(true);
             }
         });
         spyOn(nfRegistryApi, 'deleteBucket').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: 999, link: null}));
+        }).and.returnValue(of({identifier: 999, link: null}));
 
         // object to be updated by the test
         const bucket = {identifier: 999, checked: true};
@@ -1045,7 +1046,7 @@
 
     it('should delete all selected users and groups.', function () {
         // from the root injector
-        const dialogService = TestBed.get(fdsDialogsModule.FdsDialogService);
+        const dialogService = TestBed.get(FdsDialogService);
 
         //Spy
         spyOn(nfRegistryService, 'filterUsersAndGroups').and.callFake(function () {
@@ -1055,13 +1056,13 @@
         spyOn(dialogService, 'openConfirm').and.callFake(function () {
         }).and.returnValue({
             afterClosed: function () {
-                return Observable.of(true);
+                return of(true);
             }
         });
         spyOn(nfRegistryApi, 'deleteUserGroup').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: 999, link: null}));
+        }).and.returnValue(of({identifier: 999, link: null}));
         spyOn(nfRegistryApi, 'deleteUser').and.callFake(function () {
-        }).and.returnValue(Observable.of({identifier: 99, link: null}));
+        }).and.returnValue(of({identifier: 99, link: null}));
 
         // object to be updated by the test
         const group = {identifier: 999, checked: true};
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.dev.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.dev.html
index e3e30d9..33e76d1 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.dev.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.dev.html
@@ -23,8 +23,6 @@
     <meta charset='UTF-8'>
     <meta name='viewport' content='width=device-width, initial-scale=1'>
     <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
-
-    <link rel="stylesheet" href="node_modules/@nifi-fds/core/common/styles/css/flow-design-system.min.css" type="text/css" />
     <!-- Styles will be injected here by webpack -->
 </head>
 <body>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.html b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.html
index a500190..33e76d1 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.html
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/template.html
@@ -23,8 +23,6 @@
     <meta charset='UTF-8'>
     <meta name='viewport' content='width=device-width, initial-scale=1'>
     <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/>
-
-    <link rel="stylesheet" href="nifi-registry/node_modules/@nifi-fds/core/common/styles/css/flow-design-system.min.css" type="text/css" />
     <!-- Styles will be injected here by webpack -->
 </head>
 <body>
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss
index 3a9cd82..a7638ff 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/_structureElements.scss
@@ -81,10 +81,6 @@
   color: white;
 }
 
-body[fds] .td-chip span {
-    font-size: 10px;
-}
-
 #nifi-registry-toolbar span,
 #nifi-registry-toolbar .link {
   color: $grey5;
@@ -151,19 +147,105 @@
   text-transform: uppercase;
 }
 
-body[fds] mat-form-field.td-chips-form-field.mat-input-container {
-  width: unset;
+// TODO: remove after NIFI-6495 is available in NiFi FDS 0.3.0
+body[fds] .mat-menu-panel {
+    min-height: 40px;
 }
 
-body[fds] .md-title {
-  font-weight: normal;
-  color: $grey3;
+// TODO: remove after NIFI-6535 is available in NiFi FDS 0.3.0
+fds-dialog-title {
+    font-size: 20px;
+    font-weight: 400;
+    color: rgba(0, 0, 0, 0.87);
 }
 
-body[fds] .md-subhead {
-  font-weight: lighter;
+// TODO: remove after NIFI-6535 is available in NiFi FDS 0.3.0
+body[fds] {
+    .mat-card-title {
+        font-weight: 400;
+        font-size: 20px;
+    }
 }
 
-body[fds] div .td-data-table {
-  display: flex;
+// TODO: remove after NIFI-6540 is available in NiFi FDS 0.3.0
+body[fds] td-chips .mat-form-field-label-wrapper::after {
+    content: '\f0b0';
+    display: inline-table;
+    font-family: FontAwesome;
+    float: right;
+    margin: 9px 10px 0 0;
+    color: #999;
+}
+
+// TODO: remove after NIFI-6540 is available in NiFi FDS 0.3.0
+body[fds] input.mat-input-element:not([disabled]),
+body[fds] textarea.mat-input-element:not([disabled]) {
+    background-color: unset !important;
+}
+
+// TODO: remove after NIFI-6540 is available in NiFi FDS 0.3.0
+body[fds] td-chips .mat-form-field-appearance-legacy .mat-form-field-infix {
+    padding: 0;
+    border-top: 0;
+}
+
+// TODO: remove after NIFI-6540 is available in NiFi FDS 0.3.0
+body[fds] td-chips .mat-form-field {
+    top: 12px;
+}
+
+// TODO: remove after NIFI-6540 is available in NiFi FDS 0.3.0
+body[fds] .mat-basic-chip {
+    margin: 17px 8px 0 0 !important;
+}
+
+// TODO: remove after NIFI-6540 is available in NiFi FDS 0.3.0
+body[fds] .mat-form-field-empty.mat-form-field-label {
+    top: 21px !important;
+    color: $grey3;
+    font-weight: 300;
+}
+
+// TODO: remove after NIFI-6541 is available in NiFi FDS 0.3.0
+body[fds] .td-expansion-label {
+    font-size: 20px;
+}
+
+// TODO: remove after NIFI-6544 is available in NiFi FDS 0.3.0
+body[fds] .mat-checkbox-layout .mat-checkbox-label {
+    line-height: 24px !important;
+}
+
+// TODO: remove after NIFI-6544 is available in NiFi FDS 0.3.0
+body[fds] .mat-checkbox-inner-container {
+    margin-right: 8px !important;
+}
+
+// TODO: remove after NIFI-6548 is available in NiFi FDS 0.3.0
+body[fds] .mat-raised-button,
+body[fds] .mat-button {
+    min-width: 88px;
+}
+
+// TODO: remove after NIFI-6549 is available in NiFi FDS 0.3.0
+body[fds] .mat-form-field .mat-form-field-label {
+    color: $grey3;
+    font-weight: 300;
+}
+
+// TODO: remove after NIFI-6547 is available in NiFi FDS 0.3.0
+body[fds] .tab-toggle-group > .mat-button-toggle-checked.mat-button-toggle-appearance-standard {
+    color: rgba(0, 0, 0, 0.54);
+}
+
+// TODO: remove after NIFI-6547 is available in NiFi FDS 0.3.0
+body[fds] .tab-toggle-group > .mat-button-toggle-appearance-standard {
+    color: rgba(0, 0, 0, 0.38);
+    background: transparent;
+    border-left: 0;
+}
+
+// TODO: remove after NIFI-6547 is available in NiFi FDS 0.3.0
+body[fds] .tab-toggle-group > .mat-button-toggle-appearance-standard .mat-button-toggle-label-content {
+    line-height: 38px;
 }
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss
index ab211a8..376eb03 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/users/_structureElements.scss
@@ -28,7 +28,7 @@
     overflow-y: auto;
     position: absolute;
     bottom: 30px;
-    top: 142px;
+    top: 132px;
     left: 24px;
     right: 24px;
     overflow-x: hidden;
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/workflow/_structureElements.scss b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/workflow/_structureElements.scss
index ff4c27a..cc132af 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/workflow/_structureElements.scss
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/components/administration/workflow/_structureElements.scss
@@ -28,7 +28,7 @@
     overflow-y: auto;
     position: absolute;
     bottom: 30px;
-    top: 142px;
+    top: 132px;
     left: 24px;
     right: 24px;
     overflow-x: hidden;
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/nf-registry.scss b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/nf-registry.scss
index cdde491..37d9ea4 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/nf-registry.scss
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webapp/theming/nf-registry.scss
@@ -22,9 +22,9 @@
 // Path overrides
 $fa-font-path: './assets/fonts';
 $mat-font-url: './assets/fonts/';
+$fdsFontPath: './node_modules/roboto-fontface/fonts';
 
-@import '~@nifi-fds/core/common/styles/globalVars';
-@import '~@nifi-fds/core/theming/all-theme';
+@import '~@nifi-fds/core/common/styles/flow-design-system';
 @import '~@covalent/core/common/platform.scss';
 @import '~font-awesome/scss/font-awesome';
 @import 'structureElements';
@@ -36,8 +36,8 @@
 
 $primaryColor: $rose1; //$green2
 $primaryColorHover: $rose2; //$green3
-$accentColor: $blue7; //$orange1
-$accentColorHover: $grey4; //$orange2
+$accentColor: $blue-grey1; //$orange1
+$accentColorHover: $blue4; //$orange2
 
 // Include the base styles for Angular Material core. We include this here so that you only
 // have to load a single css file for Angular Material in your app.
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.alias.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.alias.js
index 5558828..44a6681 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.alias.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.alias.js
@@ -18,18 +18,6 @@
 const path = require('path');
 
 module.exports = {
-    // Flow Design System
-    '@flow-design-system/core': path.resolve(__dirname, 'node_modules/@nifi-fds/core/flow-design-system.module.js'),
-    '@flow-design-system/dialogs': path.resolve(__dirname, 'node_modules/@nifi-fds/core/dialogs/fds-dialogs.module.js'),
-    '@flow-design-system/dialog-component': path.resolve(__dirname, 'node_modules/@nifi-fds/core/dialogs/fds-dialog.component.js'),
-    '@flow-design-system/dialog-service': path.resolve(__dirname, 'node_modules/@nifi-fds/core/dialogs/services/dialog.service.js'),
-    '@flow-design-system/confirm-dialog-component': path.resolve(__dirname, 'node_modules/@nifi-fds/core/dialogs/confirm-dialog/confirm-dialog.component.js'),
-    '@flow-design-system/snackbars': path.resolve(__dirname, 'node_modules/@nifi-fds/core/snackbars/fds-snackbars.module.js'),
-    '@flow-design-system/snackbar-component': path.resolve(__dirname, 'node_modules/@nifi-fds/core/snackbars/fds-snackbar.component.js'),
-    '@flow-design-system/snackbar-service': path.resolve(__dirname, 'node_modules/@nifi-fds/core/snackbars/services/snackbar.service.js'),
-    '@flow-design-system/coaster-component': path.resolve(__dirname, 'node_modules/@nifi-fds/core/snackbars/coaster/coaster.component.js'),
-    '@flow-design-system/common/storage-service': path.resolve(__dirname, 'node_modules/@nifi-fds/core/common/services/fds-storage.service.js'),
-
     // Nifi Registry app folders
     'components': path.resolve(__dirname, 'webapp/components'),
     'services': path.resolve(__dirname, 'webapp/services'),
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.common.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.common.js
index 242f864..5f04bce 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.common.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.common.js
@@ -15,10 +15,8 @@
  * limitations under the License.
  */
 
-const webpack = require('webpack');
 const path = require('path');
 const FixStyleOnlyEntriesPlugin = require('webpack-fix-style-only-entries');
-const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 
 const webpackAlias = require('./webpack.alias');
 const loaders = require('./webpack.loader');
@@ -35,6 +33,7 @@
         // SCSS files
         'nf-registry.style.min': [
             path.resolve(__dirname, 'webapp/theming/nf-registry.scss'),
+            path.resolve(__dirname, 'node_modules/@nifi-fds/core/common/styles/flow-design-system.scss')
         ]
     },
 
@@ -62,7 +61,8 @@
     // Change how modules are resolved
     resolve: {
         extensions: ['.ts', '.tsx', '.js'],
-        alias: webpackAlias
+        alias: webpackAlias,
+        symlinks: false
     },
 
     // Polyfill or mock certain Node.js globals and modules
@@ -73,7 +73,6 @@
     module: {
         rules: [
             loaders.ts,
-            loaders.nifiFds,
             loaders.js,
             loaders.html,
             loaders.scss,
@@ -84,13 +83,6 @@
     },
 
     plugins: [
-        // Automatically load modules instead of having to import or require them everywhere
-        // TODO: https://github.com/apache/nifi-fds/pull/12
-        new webpack.ProvidePlugin({
-            '$': 'jquery',
-            jQuery: 'jquery'
-        }),
-
         // Fix style only entry generating an extra js file
         new FixStyleOnlyEntriesPlugin()
     ]
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.karma.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.karma.js
index 135141f..bd4c555 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.karma.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.karma.js
@@ -31,7 +31,6 @@
     module: {
         rules: [
             loaders.tsDev,
-            loaders.nifiFds,
             loaders.jsDev,
             loaders.html,
             loaders.ignoreScss,
diff --git a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.loader.js b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.loader.js
index a432abb..1d9bc7a 100644
--- a/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.loader.js
+++ b/nifi-registry-core/nifi-registry-web-ui/src/main/webpack.loader.js
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 const path = require('path');
 const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 
@@ -63,33 +64,11 @@
         ]
     },
 
-    nifiFds: {
-        /*
-        * Send all js files from @nifi-fds through a custom loader that replaces its usage of inline systemjs text loading
-        * of html files like:
-        *     require('./confirm-dialog.component.html!text')
-        *
-        * with normal require calls that are subsequently loaded via webpack's html-loader like:
-        *     require('./confirm-dialog.component.html')
-        */
-        test: /\.js$/,
-        include: [
-            path.resolve(__dirname, 'node_modules/@nifi-fds/core')
-        ],
-        use: [
-            {
-                loader: 'cache-loader'
-            },
-            {
-                loader: path.resolve(__dirname, 'systemjs-text-to-html-loader')
-            }
-        ]
-    },
-
     js: {
         test: /\.js$/,
         include: [
-            path.resolve(__dirname, 'webapp')
+            path.resolve(__dirname, 'webapp'),
+            path.resolve(__dirname, 'node_modules/@nifi-fds/core')
         ],
         use: [
             {
@@ -110,7 +89,8 @@
     jsDev: {
         test: /\.js$/,
         include: [
-            path.resolve(__dirname, 'webapp')
+            path.resolve(__dirname, 'webapp'),
+            path.resolve(__dirname, 'node_modules/@nifi-fds/core')
         ],
         // prevent these files/patterns from being included in the coverage report
         exclude: [
@@ -137,6 +117,7 @@
             }
         ]
     },
+
     html: {
         test: /\.html$/,
         include: [