diff --git a/wpigui/src/main/native/cpp/portable-file-dialogs.cpp b/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
index 0d94475..2e2ac7b 100644
--- a/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
+++ b/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
@@ -5,7 +5,7 @@
 //
 //  Portable File Dialogs
 //
-//  Copyright © 2018—2020 Sam Hocevar <sam@hocevar.net>
+//  Copyright © 2018—2022 Sam Hocevar <sam@hocevar.net>
 //
 //  This library is free software. It comes without any warranty, to
 //  the extent permitted by applicable law. You can redistribute it
@@ -20,13 +20,15 @@
 #ifndef WIN32_LEAN_AND_MEAN
 #   define WIN32_LEAN_AND_MEAN 1
 #endif
-#include <Windows.h>
+#pragma comment(lib, "Advapi32.lib")
+#include <windows.h>
 #include <commdlg.h>
-#include <ShlObj.h>
-#include <ShObjIdl.h> // IFileDialog
+#include <shlobj.h>
+#include <shobjidl.h> // IFileDialog
 #include <shellapi.h>
 #include <strsafe.h>
 #include <future>     // std::async
+#include <userenv.h>  // GetUserProfileDirectory()
 
 #elif __EMSCRIPTEN__
 #include <emscripten.h>
@@ -43,9 +45,11 @@
 #include <cstdio>     // popen()
 #include <cstdlib>    // std::getenv()
 #include <fcntl.h>    // fcntl()
-#include <unistd.h>   // read(), pipe(), dup2()
+#include <unistd.h>   // read(), pipe(), dup2(), getuid()
 #include <csignal>    // ::kill, std::signal
+#include <sys/stat.h> // stat()
 #include <sys/wait.h> // waitpid()
+#include <pwd.h>      // getpwnam()
 #endif
 
 #ifdef _WIN32
@@ -91,7 +95,7 @@
         {
         public:
             proc(dll const &lib, std::string const &sym)
-              : m_proc(reinterpret_cast<T *>(::GetProcAddress(lib.handle, sym.c_str())))
+              : m_proc(reinterpret_cast<T *>((void *)::GetProcAddress(lib.handle, sym.c_str())))
             {}
 
             operator bool() const { return m_proc != nullptr; }
@@ -175,6 +179,7 @@
 #endif
 };
 
+
 // internal free functions implementations
 
 #if _WIN32
@@ -227,8 +232,55 @@
         str.compare(0, prefix.size(), prefix) == 0;
 }
 
+// This is necessary until C++17 which will have std::filesystem::is_directory
+
+static inline bool is_directory(std::string const &path)
+{
+#if _WIN32
+    auto attr = GetFileAttributesA(path.c_str());
+    return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY);
+#elif __EMSCRIPTEN__
+    // TODO
+    return false;
+#else
+    struct stat s;
+    return stat(path.c_str(), &s) == 0 && S_ISDIR(s.st_mode);
+#endif
+}
+
+// This is necessary because getenv is not thread-safe
+
+static inline std::string getenv(std::string const &str)
+{
+#if _WIN32
+    char *buf = nullptr;
+    size_t size = 0;
+    if (_dupenv_s(&buf, &size, str.c_str()) == 0 && buf)
+    {
+        std::string ret(buf);
+        free(buf);
+        return ret;
+    }
+    return "";
+#else
+    auto buf = std::getenv(str.c_str());
+    return buf ? buf : "";
+#endif
+}
+
 } // namespace internal
 
+//
+// The path class provides some platform-specific path constants
+//
+
+class path : protected internal::platform
+{
+public:
+    static std::string home();
+    static std::string separator();
+};
+
 // settings implementation
 
 settings::settings(bool resync)
@@ -237,6 +289,11 @@
 
     if (flags(flag::is_scanned))
         return;
+        
+    auto pfd_verbose = internal::getenv("PFD_VERBOSE");
+    auto match_no = std::regex("(|0|no|false)", std::regex_constants::icase);
+    if (!std::regex_match(pfd_verbose, match_no))
+        flags(flag::is_verbose) = true;
 
 #if _WIN32
     flags(flag::is_vista) = internal::is_vista();
@@ -249,10 +306,10 @@
     // If multiple helpers are available, try to default to the best one
     if (flags(flag::has_zenity) && flags(flag::has_kdialog))
     {
-        auto desktop_name = std::getenv("XDG_SESSION_DESKTOP");
-        if (desktop_name && desktop_name == std::string("gnome"))
+        auto desktop_name = internal::getenv("XDG_SESSION_DESKTOP");
+        if (desktop_name == std::string("gnome"))
             flags(flag::has_kdialog) = false;
-        else if (desktop_name && desktop_name == std::string("KDE"))
+        else if (desktop_name == std::string("KDE"))
             flags(flag::has_zenity) = false;
     }
 #endif
@@ -314,6 +371,59 @@
     return const_cast<bool &>(static_cast<settings const *>(this)->flags(in_flag));
 }
 
+// path implementation
+std::string path::home()
+{
+#if _WIN32
+    // First try the USERPROFILE environment variable
+    auto user_profile = internal::getenv("USERPROFILE");
+    if (user_profile.size() > 0)
+        return user_profile;
+    // Otherwise, try GetUserProfileDirectory()
+    HANDLE token = nullptr;
+    DWORD len = MAX_PATH;
+    char buf[MAX_PATH] = { '\0' };
+    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token))
+    {
+        dll userenv("userenv.dll");
+        dll::proc<BOOL WINAPI (HANDLE, LPSTR, LPDWORD)> get_user_profile_directory(userenv, "GetUserProfileDirectoryA");
+        get_user_profile_directory(token, buf, &len);
+        CloseHandle(token);
+        if (*buf)
+            return buf;
+    }
+#elif __EMSCRIPTEN__
+    return "/";
+#else
+    // First try the HOME environment variable
+    auto home = internal::getenv("HOME");
+    if (home.size() > 0)
+        return home;
+    // Otherwise, try getpwuid_r()
+    size_t len = 4096;
+#if defined(_SC_GETPW_R_SIZE_MAX)
+    auto size_max = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size_max != -1)
+        len = size_t(size_max);
+#endif
+    std::vector<char> buf(len);
+    struct passwd pwd, *result;
+    if (getpwuid_r(getuid(), &pwd, buf.data(), buf.size(), &result) == 0)
+        return result->pw_dir;
+#endif
+    return "/";
+}
+
+std::string path::separator()
+{
+#if _WIN32
+    return "\\";
+#else
+    return "/";
+#endif
+}
+
+
 // executor implementation
 
 std::string internal::executor::result(int *exit_code /* = nullptr */)
@@ -333,8 +443,12 @@
         auto previous_windows = m_windows;
         EnumWindows(&enum_windows_callback, (LPARAM)this);
         for (auto hwnd : m_windows)
-            if (previous_windows.find(hwnd) == previous_windows.end())
+            if (previous_windows.find(hwnd) == previous_windows.end()) 
+            {
                 SendMessage(hwnd, WM_CLOSE, 0, 0);
+                // Also send IDNO in case of a Yes/No or Abort/Retry/Ignore messagebox
+                SendMessage(hwnd, WM_COMMAND, IDNO, 0);
+            }
     }
 #elif __EMSCRIPTEN__ || __NX__
     // FIXME: do something
@@ -579,7 +693,7 @@
         // crash with error “default context is already set”.
         sizeof(act_ctx),
         ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID,
-        "shell32.dll", 0, 0, sys_dir.c_str(), (LPCSTR)124,
+        "shell32.dll", 0, 0, sys_dir.c_str(), (LPCSTR)124, nullptr, 0,
     };
 
     return ::CreateActCtxA(&act_ctx);
@@ -850,6 +964,13 @@
 
         return "";
     });
+#elif __EMSCRIPTEN__
+    // FIXME: do something
+    (void)in_type;
+    (void)title;
+    (void)default_path;
+    (void)filters;
+    (void)options;
 #else
     auto command = desktop_helper();
 
@@ -872,7 +993,14 @@
         }
 
         if (default_path.size())
-            script += " default location " + osascript_quote(default_path);
+        {
+            if (in_type == type::folder || is_directory(default_path))
+                script += " default location ";
+            else
+                script += " default name ";
+            script += osascript_quote(default_path);
+        }
+
         script += " with prompt " + osascript_quote(title);
 
         if (in_type == type::open)
@@ -896,11 +1024,17 @@
                 if (pat == "*" || pat == "*.*")
                     has_filter = false;
                 else if (internal::starts_with(pat, "*."))
-                    filter_list += (filter_list.size() == 0 ? "" : ",") +
-                                   osascript_quote(pat.substr(2, pat.size() - 2));
+                    filter_list += "," + osascript_quote(pat.substr(2, pat.size() - 2));
             }
             if (has_filter && filter_list.size() > 0)
-                script += " of type {" + filter_list + "}";
+            {
+                // There is a weird AppleScript bug where file extensions of length != 3 are
+                // ignored, e.g. type{"txt"} works, but type{"json"} does not. Fortunately if
+                // the whole list starts with a 3-character extension, everything works again.
+                // We use "///" for such an extension because we are sure it cannot appear in
+                // an actual filename.
+                script += " of type {\"///\"" + filter_list + "}";
+            }
         }
 
         if (in_type == type::open && (options & opt::multiselect))
@@ -922,7 +1056,14 @@
     else if (is_zenity())
     {
         command.push_back("--file-selection");
-        command.push_back("--filename=" + default_path);
+
+        // If the default path is a directory, make sure it ends with "/" otherwise zenity will
+        // open the file dialog in the parent directory.
+        auto filename_arg = "--filename=" + default_path;
+        if (in_type != type::folder && !ends_with(default_path, "/") && internal::is_directory(default_path))
+            filename_arg += "/";
+        command.push_back(filename_arg);
+
         command.push_back("--title");
         command.push_back(title);
         command.push_back("--separator=\n");
@@ -1062,7 +1203,7 @@
     }
 
     // Set the dialog title and option to select folders
-    ifd->SetOptions(FOS_PICKFOLDERS);
+    ifd->SetOptions(FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM);
     ifd->SetTitle(m_wtitle.c_str());
 
     hr = ifd->Show(GetActiveWindow());
@@ -1072,15 +1213,27 @@
         hr = ifd->GetResult(&item);
         if (SUCCEEDED(hr))
         {
-            wchar_t* wselected = nullptr;
-            item->GetDisplayName(SIGDN_FILESYSPATH, &wselected);
-            item->Release();
-
-            if (wselected)
+            wchar_t* wname = nullptr;
+            // This is unlikely to fail because we use FOS_FORCEFILESYSTEM, but try
+            // to output a debug message just in case.
+            if (SUCCEEDED(item->GetDisplayName(SIGDN_FILESYSPATH, &wname)))
             {
-                result = internal::wstr2str(std::wstring(wselected));
-                internal::platform::dll::proc<void WINAPI (LPVOID)>(internal::platform::ole32_dll(), "CoTaskMemFree")(wselected);
+                result = internal::wstr2str(std::wstring(wname));
+                internal::platform::dll::proc<void WINAPI (LPVOID)>(internal::platform::ole32_dll(), "CoTaskMemFree")(wname);
             }
+            else
+            {
+                if (SUCCEEDED(item->GetDisplayName(SIGDN_NORMALDISPLAY, &wname)))
+                {
+                    auto name = internal::wstr2str(std::wstring(wname));
+                    internal::platform::dll::proc<void WINAPI (LPVOID)>(internal::platform::ole32_dll(), "CoTaskMemFree")(wname);
+                    fputs("pfd: failed to get path\n", stderr);
+                }
+                else
+                    fputs("pfd: item of unknown type selected\n", stderr);
+            }
+
+            item->Release();
         }
     }
 
@@ -1161,6 +1314,10 @@
 
     // Display the new icon
     Shell_NotifyIconW(NIM_ADD, nid.get());
+#elif __EMSCRIPTEN__
+    // FIXME: do something
+    (void)title;
+    (void)message;
 #else
     auto command = desktop_helper();
 
@@ -1274,45 +1431,45 @@
     {
         std::string script = "display dialog " + osascript_quote(text) +
                              " with title " + osascript_quote(title);
+        auto if_cancel = button::cancel;
         switch (_choice)
         {
             case choice::ok_cancel:
                 script += "buttons {\"OK\", \"Cancel\"}"
                           " default button \"OK\""
                           " cancel button \"Cancel\"";
-                m_mappings[256] = button::cancel;
                 break;
             case choice::yes_no:
                 script += "buttons {\"Yes\", \"No\"}"
                           " default button \"Yes\""
                           " cancel button \"No\"";
-                m_mappings[256] = button::no;
+                if_cancel = button::no;
                 break;
             case choice::yes_no_cancel:
                 script += "buttons {\"Yes\", \"No\", \"Cancel\"}"
                           " default button \"Yes\""
                           " cancel button \"Cancel\"";
-                m_mappings[256] = button::cancel;
                 break;
             case choice::retry_cancel:
                 script += "buttons {\"Retry\", \"Cancel\"}"
                           " default button \"Retry\""
                           " cancel button \"Cancel\"";
-                m_mappings[256] = button::cancel;
                 break;
             case choice::abort_retry_ignore:
                 script += "buttons {\"Abort\", \"Retry\", \"Ignore\"}"
-                          " default button \"Retry\""
+                          " default button \"Abort\""
                           " cancel button \"Retry\"";
-                m_mappings[256] = button::cancel;
+                if_cancel = button::retry;
                 break;
             case choice::ok: default:
                 script += "buttons {\"OK\"}"
                           " default button \"OK\""
                           " cancel button \"OK\"";
-                m_mappings[256] = button::ok;
+                if_cancel = button::ok;
                 break;
         }
+        m_mappings[1] = if_cancel;
+        m_mappings[256] = if_cancel;
         script += " with icon ";
         switch (_icon)
         {
@@ -1356,6 +1513,7 @@
 
         command.insert(command.end(), { "--title", title,
                                         "--width=300", "--height=0", // sensible defaults
+                                        "--no-markup", // do not interpret text as Pango markup
                                         "--text", text,
                                         "--icon-name=dialog-" + get_icon_name(_icon) });
     }
@@ -1411,8 +1569,7 @@
     auto ret = m_async->result(&exit_code);
     // osascript will say "button returned:Cancel\n"
     // and others will just say "Cancel\n"
-    if (exit_code < 0 || // this means cancel
-        internal::ends_with(ret, "Cancel\n"))
+    if (internal::ends_with(ret, "Cancel\n"))
         return button::cancel;
     if (internal::ends_with(ret, "OK\n"))
         return button::ok;
diff --git a/wpigui/src/main/native/cpp/wpigui.cpp b/wpigui/src/main/native/cpp/wpigui.cpp
index b1e1143..a93ca2b 100644
--- a/wpigui/src/main/native/cpp/wpigui.cpp
+++ b/wpigui/src/main/native/cpp/wpigui.cpp
@@ -9,7 +9,9 @@
 #include <cstring>
 
 #include <GLFW/glfw3.h>
+#include <IconsFontAwesome6.h>
 #include <imgui.h>
+#include <imgui_FontAwesomeSolid.h>
 #include <imgui_ProggyDotted.h>
 #include <imgui_impl_glfw.h>
 #include <imgui_internal.h>
@@ -104,7 +106,13 @@
 void gui::CreateContext() {
   gContext = new Context;
   AddFont("ProggyDotted", [](ImGuiIO& io, float size, const ImFontConfig* cfg) {
-    return ImGui::AddFontProggyDotted(io, size, cfg);
+    auto font = ImGui::AddFontProggyDotted(io, size, cfg);
+    static const ImWchar icons_ranges[] = {ICON_MIN_FA, ICON_MAX_16_FA, 0};
+    ImFontConfig icons_cfg;
+    icons_cfg.MergeMode = true;
+    icons_cfg.PixelSnapH = true;
+    ImGui::AddFontFontAwesomeSolid(io, size, &icons_cfg, icons_ranges);
+    return font;
   });
   PlatformCreateContext();
 }
@@ -115,7 +123,49 @@
   gContext = nullptr;
 }
 
-bool gui::Initialize(const char* title, int width, int height) {
+static void UpdateFontScale() {
+  // Scale based on OS window content scaling
+  float windowScale = 1.0;
+#ifndef __APPLE__
+  glfwGetWindowContentScale(gContext->window, &windowScale, nullptr);
+#endif
+  // map to closest font size: 0 = 0.5x, 1 = 0.75x, 2 = 1.0x, 3 = 1.25x,
+  // 4 = 1.5x, 5 = 1.75x, 6 = 2x
+  int fontScale =
+      gContext->userScale + static_cast<int>((windowScale - 1.0) * 4);
+  if (fontScale < 0) {
+    fontScale = 0;
+  }
+  if (gContext->fontScale != fontScale) {
+    gContext->reloadFonts = true;
+    gContext->fontScale = fontScale;
+  }
+}
+
+// the range is based on 13px being the "nominal" 100% size and going from
+// ~0.5x (7px) to ~2.0x (25px)
+static void ReloadFonts() {
+  auto& io = ImGui::GetIO();
+  io.Fonts->Clear();
+  gContext->fonts.clear();
+  float size = 7.0f + gContext->fontScale * 3.0f;
+  bool first = true;
+  for (auto&& makeFont : gContext->makeFonts) {
+    if (makeFont.second) {
+      ImFontConfig cfg;
+      std::snprintf(cfg.Name, sizeof(cfg.Name), "%s", makeFont.first);
+      ImFont* font = makeFont.second(io, size, &cfg);
+      if (first) {
+        ImGui::GetIO().FontDefault = font;
+        first = false;
+      }
+      gContext->fonts.emplace_back(font);
+    }
+  }
+}
+
+bool gui::Initialize(const char* title, int width, int height,
+                     ImGuiConfigFlags configFlags) {
   gContext->title = title;
   gContext->width = width;
   gContext->height = height;
@@ -125,6 +175,7 @@
   // Setup window
   glfwSetErrorCallback(ErrorCallback);
   glfwInitHint(GLFW_JOYSTICK_HAT_BUTTONS, GLFW_FALSE);
+  glfwInitHint(GLFW_COCOA_CHDIR_RESOURCES, GLFW_FALSE);
   PlatformGlfwInitHints();
   if (!glfwInit()) {
     return false;
@@ -137,6 +188,7 @@
   ImGui::CreateContext();
   ImPlot::CreateContext();
   ImGuiIO& io = ImGui::GetIO();
+  io.ConfigFlags |= configFlags;
 
   // Hook ini handler to save settings
   ImGuiSettingsHandler iniHandler;
@@ -265,20 +317,9 @@
   SetStyle(static_cast<Style>(gContext->style));
 
   // Load Fonts
-  // this range is based on 13px being the "nominal" 100% size and going from
-  // ~0.5x (7px) to ~2.0x (25px)
-  for (auto&& makeFont : gContext->makeFonts) {
-    if (makeFont.second) {
-      auto& font = gContext->fonts.emplace_back();
-      for (int i = 0; i < Font::kScaledLevels; ++i) {
-        float size = 7.0f + i * 3.0f;
-        ImFontConfig cfg;
-        std::snprintf(cfg.Name, sizeof(cfg.Name), "%s-%d", makeFont.first,
-                      static_cast<int>(size));
-        font.scaled[i] = makeFont.second(io, size, &cfg);
-      }
-    }
-  }
+  UpdateFontScale();
+  ReloadFonts();
+  gContext->reloadFonts = false;  // init renderer will do this
 
   if (!PlatformInitRenderer()) {
     return false;
@@ -293,12 +334,18 @@
     // Poll and handle events (inputs, window resize, etc.)
     glfwPollEvents();
     gContext->isPlatformRendering = true;
+    UpdateFontScale();
+    if (gContext->reloadFonts) {
+      ReloadFonts();
+      // PlatformRenderFrame() will clear reloadFonts flag
+    }
     PlatformRenderFrame();
     gContext->isPlatformRendering = false;
 
+    auto& io = ImGui::GetIO();
+
     // custom saving
     if (gContext->saveSettings) {
-      auto& io = ImGui::GetIO();
       if (io.WantSaveIniSettings) {
         gContext->saveSettings(false);
         io.WantSaveIniSettings = false;  // reset flag
@@ -332,18 +379,6 @@
   // Start the Dear ImGui frame
   ImGui::NewFrame();
 
-  // Scale based on OS window content scaling
-  float windowScale = 1.0;
-#ifndef __APPLE__
-  glfwGetWindowContentScale(gContext->window, &windowScale, nullptr);
-#endif
-  // map to closest font size: 0 = 0.5x, 1 = 0.75x, 2 = 1.0x, 3 = 1.25x,
-  // 4 = 1.5x, 5 = 1.75x, 6 = 2x
-  gContext->fontScale = std::clamp(
-      gContext->userScale + static_cast<int>((windowScale - 1.0) * 4), 0,
-      Font::kScaledLevels - 1);
-  ImGui::GetIO().FontDefault = gContext->fonts[0].scaled[gContext->fontScale];
-
   for (size_t i = 0; i < gContext->earlyExecutors.size(); ++i) {
     auto& execute = gContext->earlyExecutors[i];
     if (execute) {
@@ -427,10 +462,6 @@
   return gContext->makeFonts.size() - 1;
 }
 
-ImFont* gui::GetFont(int font) {
-  return gContext->fonts[font].scaled[gContext->fontScale];
-}
-
 void gui::SetStyle(Style style) {
   gContext->style = static_cast<int>(style);
   switch (style) {
@@ -497,14 +528,11 @@
     }
 
     if (ImGui::BeginMenu("Zoom")) {
-      for (int i = 0; i < Font::kScaledLevels && (25 * (i + 2)) <= 200; ++i) {
+      for (int i = 0; i < kFontScaledLevels && (25 * (i + 2)) <= 200; ++i) {
         char label[20];
         std::snprintf(label, sizeof(label), "%d%%", 25 * (i + 2));
         bool selected = gContext->userScale == i;
-        bool enabled = (gContext->fontScale - gContext->userScale + i) >= 0 &&
-                       (gContext->fontScale - gContext->userScale + i) <
-                           Font::kScaledLevels;
-        if (ImGui::MenuItem(label, nullptr, &selected, enabled)) {
+        if (ImGui::MenuItem(label, nullptr, &selected)) {
           gContext->userScale = i;
         }
       }
diff --git a/wpigui/src/main/native/cpp/wpigui_openurl.cpp b/wpigui/src/main/native/cpp/wpigui_openurl.cpp
new file mode 100644
index 0000000..b913ceb
--- /dev/null
+++ b/wpigui/src/main/native/cpp/wpigui_openurl.cpp
@@ -0,0 +1,28 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include "wpigui_openurl.h"
+
+#if _WIN32
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <Windows.h>
+#include <shellapi.h>
+#else
+#include <unistd.h>
+#endif
+
+void wpi::gui::OpenURL(const std::string& url) {
+#ifdef _WIN32
+  ShellExecuteA(nullptr, "open", url.c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+#else
+#ifdef __APPLE__
+  static constexpr const char* opencmd = "open";
+#else
+  static constexpr const char* opencmd = "xdg-open";
+#endif
+  execlp(opencmd, opencmd, url.c_str(), static_cast<const char*>(nullptr));
+#endif
+}
diff --git a/wpigui/src/main/native/directx11/wpigui_directx11.cpp b/wpigui/src/main/native/directx11/wpigui_directx11.cpp
index 771a2ed..0ef2485 100644
--- a/wpigui/src/main/native/directx11/wpigui_directx11.cpp
+++ b/wpigui/src/main/native/directx11/wpigui_directx11.cpp
@@ -69,8 +69,9 @@
           nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags,
           featureLevelArray, 2, D3D11_SDK_VERSION, &sd,
           &gPlatformContext->pSwapChain, &gPlatformContext->pd3dDevice,
-          &featureLevel, &gPlatformContext->pd3dDeviceContext) != S_OK)
+          &featureLevel, &gPlatformContext->pd3dDeviceContext) != S_OK) {
     return false;
+  }
 
   CreateRenderTarget();
   return true;
@@ -133,6 +134,11 @@
 }
 
 void gui::PlatformRenderFrame() {
+  if (gContext->reloadFonts) {
+    ImGui_ImplDX11_InvalidateDeviceObjects();
+    ImGui_ImplDX11_CreateDeviceObjects();
+    gContext->reloadFonts = false;
+  }
   ImGui_ImplDX11_NewFrame();
 
   CommonRenderFrame();
diff --git a/wpigui/src/main/native/include/wpigui.h b/wpigui/src/main/native/include/wpigui.h
index d4602b5..db74291 100644
--- a/wpigui/src/main/native/include/wpigui.h
+++ b/wpigui/src/main/native/include/wpigui.h
@@ -30,8 +30,10 @@
  * @param title main application window title
  * @param width main application window width
  * @param height main application window height
+ * @param configFlags ImGui configuration flags
  */
-bool Initialize(const char* title, int width, int height);
+bool Initialize(const char* title, int width, int height,
+                ImGuiConfigFlags configFlags = ImGuiConfigFlags_None);
 
 /**
  * Runs main GUI loop.  On some OS'es this must be called from the main thread.
diff --git a/wpigui/src/main/native/include/wpigui_internal.h b/wpigui/src/main/native/include/wpigui_internal.h
index 4c8a22c..f4d352b 100644
--- a/wpigui/src/main/native/include/wpigui_internal.h
+++ b/wpigui/src/main/native/include/wpigui_internal.h
@@ -26,10 +26,7 @@
   int style = 0;
 };
 
-struct Font {
-  static constexpr int kScaledLevels = 9;
-  ImFont* scaled[kScaledLevels];
-};
+constexpr int kFontScaledLevels = 9;
 
 struct Context : public SavedSettings {
   std::atomic_bool exit{false};
@@ -56,12 +53,14 @@
   std::vector<std::function<void()>> lateExecutors;
 
   int fontScale = 2;  // updated by main loop
-  std::vector<Font> fonts;
+  std::vector<ImFont*> fonts;
 
   std::vector<GLFWimage> icons;
 
   std::string iniPath = "imgui.ini";
   bool resetOnExit = false;
+
+  bool reloadFonts = false;  // reload fonts in next PlatformRenderFrame()
 };
 
 extern Context* gContext;
diff --git a/wpigui/src/main/native/include/wpigui_openurl.h b/wpigui/src/main/native/include/wpigui_openurl.h
new file mode 100644
index 0000000..5de0828
--- /dev/null
+++ b/wpigui/src/main/native/include/wpigui_openurl.h
@@ -0,0 +1,18 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#pragma once
+
+#include <string>
+
+namespace wpi::gui {
+
+/**
+ * Opens a URL in the default browser.
+ *
+ * @param url URL to open
+ */
+void OpenURL(const std::string& url);
+
+}  // namespace wpi::gui
diff --git a/wpigui/src/main/native/metal/wpigui_metal.mm b/wpigui/src/main/native/metal/wpigui_metal.mm
index 95c78c4..a1024ed 100644
--- a/wpigui/src/main/native/metal/wpigui_metal.mm
+++ b/wpigui/src/main/native/metal/wpigui_metal.mm
@@ -84,6 +84,12 @@
     id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
     [renderEncoder pushDebugGroup:@"WPI GUI"];
 
+    if (gContext->reloadFonts) {
+      ImGui_ImplMetal_DestroyFontsTexture();
+      ImGui_ImplMetal_CreateFontsTexture(gPlatformContext->layer.device);
+      gContext->reloadFonts = false;
+    }
+
     // Start the Dear ImGui frame
     ImGui_ImplMetal_NewFrame(renderPassDescriptor);
 
diff --git a/wpigui/src/main/native/opengl2/wpigui_opengl2.cpp b/wpigui/src/main/native/opengl2/wpigui_opengl2.cpp
new file mode 100644
index 0000000..afc9fea
--- /dev/null
+++ b/wpigui/src/main/native/opengl2/wpigui_opengl2.cpp
@@ -0,0 +1,136 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+#include <cstdio>
+
+#include <GLFW/glfw3.h>
+#include <imgui.h>
+#include <imgui_impl_glfw.h>
+#include <imgui_impl_opengl2.h>
+
+#include "wpigui.h"
+#include "wpigui_internal.h"
+
+using namespace wpi::gui;
+
+static bool gPlatformValid = false;
+
+namespace wpi {
+
+void gui::PlatformCreateContext() {}
+
+void gui::PlatformDestroyContext() {}
+
+void gui::PlatformGlfwInitHints() {}
+
+void gui::PlatformGlfwWindowHints() {
+  // GL 2.1
+  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
+  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
+
+  // enable 4xMSAA
+  glfwWindowHint(GLFW_SAMPLES, 4);
+}
+
+bool gui::PlatformInitRenderer() {
+  glfwMakeContextCurrent(gContext->window);
+
+  glfwSwapInterval(1);  // Enable vsync
+
+  // Turn on multisampling
+  glEnable(GL_MULTISAMPLE);
+
+  // Setup Platform/Renderer bindings
+  ImGui_ImplGlfw_InitForOpenGL(gContext->window, true);
+
+  ImGui_ImplOpenGL2_Init();
+
+  gPlatformValid = true;
+  return true;
+}
+
+void gui::PlatformRenderFrame() {
+  if (gContext->reloadFonts) {
+    ImGui_ImplOpenGL2_DestroyFontsTexture();
+    ImGui_ImplOpenGL2_CreateFontsTexture();
+    gContext->reloadFonts = false;
+  }
+  ImGui_ImplOpenGL2_NewFrame();
+
+  CommonRenderFrame();
+
+  int display_w, display_h;
+  glfwGetFramebufferSize(gContext->window, &display_w, &display_h);
+  glViewport(0, 0, display_w, display_h);
+  glClearColor(gContext->clearColor.x, gContext->clearColor.y,
+               gContext->clearColor.z, gContext->clearColor.w);
+  glClear(GL_COLOR_BUFFER_BIT);
+  ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData());
+
+  glfwSwapBuffers(gContext->window);
+}
+
+void gui::PlatformShutdown() {
+  gPlatformValid = false;
+  ImGui_ImplOpenGL2_Shutdown();
+}
+
+void gui::PlatformFramebufferSizeChanged(int width, int height) {}
+
+static inline GLenum GLPixelFormat(PixelFormat format) {
+  switch (format) {
+    case kPixelRGBA:
+      return GL_RGBA;
+    case kPixelBGRA:
+      return GL_BGRA;
+    default:
+      return GL_RGBA;
+  }
+}
+
+ImTextureID gui::CreateTexture(PixelFormat format, int width, int height,
+                               const unsigned char* data) {
+  if (!gPlatformValid) {
+    return nullptr;
+  }
+
+  // Create a OpenGL texture identifier
+  GLuint texture;
+  glGenTextures(1, &texture);
+  glBindTexture(GL_TEXTURE_2D, texture);
+
+  // Setup filtering parameters for display
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+  // Upload pixels into texture
+  glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
+               GLPixelFormat(format), GL_UNSIGNED_BYTE, data);
+
+  return reinterpret_cast<ImTextureID>(static_cast<uintptr_t>(texture));
+}
+
+void gui::UpdateTexture(ImTextureID texture, PixelFormat format, int width,
+                        int height, const unsigned char* data) {
+  GLuint glTexture = static_cast<GLuint>(reinterpret_cast<uintptr_t>(texture));
+  if (glTexture == 0) {
+    return;
+  }
+  glBindTexture(GL_TEXTURE_2D, glTexture);
+  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GLPixelFormat(format),
+                  GL_UNSIGNED_BYTE, data);
+}
+
+void gui::DeleteTexture(ImTextureID texture) {
+  if (!gPlatformValid) {
+    return;
+  }
+  GLuint glTexture = static_cast<GLuint>(reinterpret_cast<uintptr_t>(texture));
+  if (glTexture != 0) {
+    glDeleteTextures(1, &glTexture);
+  }
+}
+
+}  // namespace wpi
diff --git a/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp b/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp
index c85ad04..2f75929 100644
--- a/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp
+++ b/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp
@@ -76,6 +76,11 @@
 }
 
 void gui::PlatformRenderFrame() {
+  if (gContext->reloadFonts) {
+    ImGui_ImplOpenGL3_DestroyFontsTexture();
+    ImGui_ImplOpenGL3_CreateFontsTexture();
+    gContext->reloadFonts = false;
+  }
   ImGui_ImplOpenGL3_NewFrame();
 
   CommonRenderFrame();
