diff --git a/outlineviewer/src/main/native/cpp/main.cpp b/outlineviewer/src/main/native/cpp/main.cpp
index 20f4dcc..0310756 100644
--- a/outlineviewer/src/main/native/cpp/main.cpp
+++ b/outlineviewer/src/main/native/cpp/main.cpp
@@ -6,17 +6,17 @@
 
 #include <GLFW/glfw3.h>
 #include <fmt/format.h>
+#include <glass/Context.h>
+#include <glass/MainMenuBar.h>
+#include <glass/Model.h>
+#include <glass/Storage.h>
+#include <glass/networktables/NetworkTables.h>
+#include <glass/networktables/NetworkTablesSettings.h>
+#include <glass/other/Log.h>
 #include <imgui.h>
 #include <ntcore_cpp.h>
 #include <wpigui.h>
-
-#include "glass/Context.h"
-#include "glass/MainMenuBar.h"
-#include "glass/Model.h"
-#include "glass/Storage.h"
-#include "glass/networktables/NetworkTables.h"
-#include "glass/networktables/NetworkTablesSettings.h"
-#include "glass/other/Log.h"
+#include <wpigui_openurl.h>
 
 namespace gui = wpi::gui;
 
@@ -37,34 +37,47 @@
 static glass::LogData gLog;
 static glass::NetworkTablesFlagsSettings gFlagsSettings;
 static glass::MainMenuBar gMainMenu;
+static unsigned int gPrevMode = NT_NET_MODE_NONE;
+
+/**
+ * Generates the proper title bar title based on current instance state and
+ * event.
+ */
+static std::string MakeTitle(NT_Inst inst, nt::Event event) {
+  auto mode = nt::GetNetworkMode(inst);
+  if (mode & NT_NET_MODE_SERVER) {
+    auto numClients = nt::GetConnections(inst).size();
+    return fmt::format("OutlineViewer - {} Client{} Connected", numClients,
+                       (numClients == 1 ? "" : "s"));
+  } else if (mode & NT_NET_MODE_CLIENT3 || mode & NT_NET_MODE_CLIENT4) {
+    if (event.Is(NT_EVENT_CONNECTED)) {
+      return fmt::format("OutlineViewer - Connected ({})",
+                         event.GetConnectionInfo()->remote_ip);
+    }
+  }
+  return "OutlineViewer - DISCONNECTED";
+}
 
 static void NtInitialize() {
   auto inst = nt::GetDefaultInstance();
   auto poller = nt::CreateListenerPoller(inst);
-  nt::AddPolledListener(
-      poller, inst,
-      NT_EVENT_CONNECTION | NT_EVENT_IMMEDIATE | NT_EVENT_LOGMESSAGE);
+  nt::AddPolledListener(poller, inst, NT_EVENT_CONNECTION | NT_EVENT_IMMEDIATE);
+  nt::AddPolledLogger(poller, 0, 100);
   gui::AddEarlyExecute([inst, poller] {
     auto win = gui::GetSystemWindow();
     if (!win) {
       return;
     }
+    bool updateTitle = false;
+    nt::Event connectionEvent;
+    if (nt::GetNetworkMode(inst) != gPrevMode) {
+      gPrevMode = nt::GetNetworkMode(inst);
+      updateTitle = true;
+    }
     for (auto&& event : nt::ReadListenerQueue(poller)) {
-      if (auto connInfo = event.GetConnectionInfo()) {
-        // update window title when connection status changes
-        if ((nt::GetNetworkMode(inst) & NT_NET_MODE_SERVER) != 0) {
-          // for server mode, just print number of clients connected
-          glfwSetWindowTitle(win,
-                             fmt::format("OutlineViewer - {} Clients Connected",
-                                         nt::GetConnections(inst).size())
-                                 .c_str());
-        } else if ((event.flags & NT_EVENT_CONNECTED) != 0) {
-          glfwSetWindowTitle(win, fmt::format("OutlineViewer - Connected ({})",
-                                              connInfo->remote_ip)
-                                      .c_str());
-        } else {
-          glfwSetWindowTitle(win, "OutlineViewer - DISCONNECTED");
-        }
+      if (event.Is(NT_EVENT_CONNECTION)) {
+        updateTitle = true;
+        connectionEvent = event;
       } else if (auto msg = event.GetLogMessage()) {
         // handle NetworkTables log messages
         const char* level = "";
@@ -79,6 +92,10 @@
                                 msg->filename, msg->line));
       }
     }
+
+    if (updateTitle) {
+      glfwSetWindowTitle(win, MakeTitle(inst, connectionEvent).c_str());
+    }
   });
 
   // NetworkTables table window
@@ -99,7 +116,8 @@
   ImGui::SetNextWindowPos(ImVec2(0, 0));
   int width, height;
   glfwGetWindowSize(gui::GetSystemWindow(), &width, &height);
-  ImGui::SetNextWindowSize(ImVec2(width, height));
+  ImGui::SetNextWindowSize(
+      ImVec2(static_cast<float>(width), static_cast<float>(height)));
 
   ImGui::Begin("Entries", nullptr,
                ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_MenuBar |
@@ -119,6 +137,7 @@
   gui::EmitViewMenu();
   if (ImGui::BeginMenu("View")) {
     gFlagsSettings.DisplayMenu();
+    glass::DisplayNetworkTablesAddMenu(gModel.get());
     ImGui::EndMenu();
   }
 
@@ -139,6 +158,15 @@
     }
     ImGui::EndMenu();
   }
+
+  if (ImGui::BeginMenu("Docs")) {
+    if (ImGui::MenuItem("Online documentation")) {
+      wpi::gui::OpenURL(
+          "https://docs.wpilib.org/en/stable/docs/software/wpilib-tools/"
+          "outlineviewer/");
+    }
+    ImGui::EndMenu();
+  }
   ImGui::EndMenuBar();
 
   // settings popup
@@ -183,6 +211,8 @@
     ImGui::Text("v%s", GetWPILibVersion());
     ImGui::Separator();
     ImGui::Text("Save location: %s", glass::GetStorageDir().c_str());
+    ImGui::Text("%.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate,
+                ImGui::GetIO().Framerate);
     if (ImGui::Button("Close")) {
       ImGui::CloseCurrentPopup();
     }
