diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java b/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java
index 853dd94..7c58250 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java
@@ -18,7 +18,6 @@
 import org.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiView;
-import org.onosproject.ui.UiViewHidden;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -29,6 +28,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.SequenceInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import static com.google.common.collect.ImmutableList.of;
 import static com.google.common.io.ByteStreams.toByteArray;
@@ -41,9 +43,13 @@
 
     private static final String NAV_HTML = "nav.html";
 
-    private static final String INJECT_VIEW_ITEMS_START = "<!-- {INJECTED-VIEW-NAV-START} -->";
-    private static final String INJECT_VIEW_ITEMS_END = "<!-- {INJECTED-VIEW-NAV-END} -->";
+    private static final String INJECT_VIEW_ITEMS_START =
+            "<!-- {INJECTED-VIEW-NAV-START} -->";
+    private static final String INJECT_VIEW_ITEMS_END =
+            "<!-- {INJECTED-VIEW-NAV-END} -->";
 
+    private static final String HDR_FORMAT =
+            "<div class=\"nav-hdr\">%s</div>\n";
     private static final String NAV_FORMAT =
             "<a ng-click=\"navCtrl.hideNav()\" href=\"#/%s\">%s</a>\n";
 
@@ -51,31 +57,60 @@
     @Produces(MediaType.TEXT_HTML)
     public Response getNavigation() throws IOException {
         UiExtensionService service = get(UiExtensionService.class);
-        InputStream navTemplate = getClass().getClassLoader().getResourceAsStream(NAV_HTML);
-        String js = new String(toByteArray(navTemplate));
+        InputStream navTemplate =
+                getClass().getClassLoader().getResourceAsStream(NAV_HTML);
+        String html = new String(toByteArray(navTemplate));
 
-        int p1s = split(js, 0, INJECT_VIEW_ITEMS_START);
-        int p1e = split(js, 0, INJECT_VIEW_ITEMS_END);
-        int p2s = split(js, p1e, null);
+        int p1s = split(html, 0, INJECT_VIEW_ITEMS_START);
+        int p1e = split(html, 0, INJECT_VIEW_ITEMS_END);
+        int p2s = split(html, p1e, null);
 
         StreamEnumeration streams =
-                new StreamEnumeration(of(stream(js, 0, p1s),
+                new StreamEnumeration(of(stream(html, 0, p1s),
                                          includeNavItems(service),
-                                         stream(js, p1e, p2s)));
+                                         stream(html, p1e, p2s)));
 
         return Response.ok(new SequenceInputStream(streams)).build();
     }
 
-    // Produces an input stream including nav item injections from all extensions.
+    // Produces an input stream of nav item injections from all extensions.
     private InputStream includeNavItems(UiExtensionService service) {
+        List<UiExtension> extensions = service.getExtensions();
         StringBuilder sb = new StringBuilder("\n");
-        for (UiExtension extension : service.getExtensions()) {
-            for (UiView view : extension.views()) {
-                if (!(view instanceof UiViewHidden)) {
-                    sb.append(String.format(NAV_FORMAT, view.id(), view.label()));
-                }
+
+        for (UiView.Category cat : UiView.Category.values()) {
+            if (cat == UiView.Category.HIDDEN) {
+                continue;
+            }
+
+            List<UiView> catViews = getViewsForCat(extensions, cat);
+            if (!catViews.isEmpty()) {
+                addCatHeader(sb, cat);
+                addCatItems(sb, catViews);
             }
         }
+
         return new ByteArrayInputStream(sb.toString().getBytes());
     }
+
+    private List<UiView> getViewsForCat(List<UiExtension> extensions,
+                                        UiView.Category cat) {
+        List<UiView> views = new ArrayList<>();
+        for (UiExtension extension : extensions) {
+            views.addAll(extension.views().stream().filter(
+                    view -> cat.equals(view.category())
+            ).collect(Collectors.toList()));
+        }
+        return views;
+    }
+
+    private void addCatHeader(StringBuilder sb, UiView.Category cat) {
+        sb.append(String.format(HDR_FORMAT, cat.label()));
+    }
+
+    private void addCatItems(StringBuilder sb, List<UiView> catViews) {
+        for (UiView view : catViews) {
+            sb.append(String.format(NAV_FORMAT, view.id(), view.label()));
+        }
+    }
 }
