diff --git a/wpigui/src/main/native/cpp/portable-file-dialogs.cpp b/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
index 1330fa7..0d94475 100644
--- a/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
+++ b/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
@@ -35,6 +35,11 @@
 #ifndef _POSIX_C_SOURCE
 #   define _POSIX_C_SOURCE 2 // for popen()
 #endif
+#ifdef __APPLE__
+#   ifndef _DARWIN_C_SOURCE
+#       define _DARWIN_C_SOURCE
+#   endif
+#endif
 #include <cstdio>     // popen()
 #include <cstdlib>    // std::getenv()
 #include <fcntl.h>    // fcntl()
@@ -46,11 +51,21 @@
 #ifdef _WIN32
 #include <set>
 #endif
-#include <iostream>
 #include <regex>
 #include <thread>
 #include <chrono>
 
+// Versions of mingw64 g++ up to 9.3.0 do not have a complete IFileDialog
+#ifndef PFD_HAS_IFILEDIALOG
+#   define PFD_HAS_IFILEDIALOG 1
+#   if (defined __MINGW64__ || defined __MINGW32__) && defined __GXX_ABI_VERSION
+#       if __GXX_ABI_VERSION <= 1013
+#           undef PFD_HAS_IFILEDIALOG
+#           define PFD_HAS_IFILEDIALOG 0
+#       endif
+#   endif
+#endif
+
 //
 // Below this are all the method implementations.
 //
@@ -90,6 +105,18 @@
         HMODULE handle;
     };
 
+    // Helper class around CoInitialize() and CoUnInitialize()
+    class ole32_dll : public dll
+    {
+    public:
+        ole32_dll();
+        ~ole32_dll();
+        bool is_initialized();
+
+    private:
+        HRESULT m_state;
+    };
+
     // Helper class around CreateActCtx() and ActivateActCtx()
     class new_style_context
     {
@@ -489,6 +516,30 @@
 }
 #endif // _WIN32
 
+// ole32_dll implementation
+
+#if _WIN32
+internal::platform::ole32_dll::ole32_dll()
+    : dll("ole32.dll")
+{
+    // Use COINIT_MULTITHREADED because COINIT_APARTMENTTHREADED causes crashes.
+    // See https://github.com/samhocevar/portable-file-dialogs/issues/51
+    auto coinit = proc<HRESULT WINAPI (LPVOID, DWORD)>(*this, "CoInitializeEx");
+    m_state = coinit(nullptr, COINIT_MULTITHREADED);
+}
+
+internal::platform::ole32_dll::~ole32_dll()
+{
+    if (is_initialized())
+        proc<void WINAPI ()>(*this, "CoUninitialize")();
+}
+
+bool internal::platform::ole32_dll::is_initialized()
+{
+    return m_state == S_OK || m_state == S_FALSE;
+}
+#endif
+
 // new_style_context implementation
 
 #if _WIN32
@@ -595,13 +646,17 @@
     }
 }
 
-// THis is only used for debugging purposes
-std::ostream& operator <<(std::ostream &s, std::vector<std::string> const &v)
+// This is only used for debugging purposes
+void print_command(std::vector<std::string> const &v)
 {
-    int not_first = 0;
-    for (auto &e : v)
-        s << (not_first++ ? " " : "") << e;
-    return s;
+    fputs("pfd: ", stderr);
+    for (size_t i = 0; i < v.size(); ++i) {
+        if (i > 0) {
+            fputc(' ', stderr);
+        }
+        fputs(v[i].c_str(), stderr);
+    }
+    fputc('\n', stderr);
 }
 
 // Properly quote a string for Powershell: replace ' or " with '' or ""
@@ -634,7 +689,9 @@
  public:
 #if _WIN32
     static int CALLBACK bffcallback(HWND hwnd, UINT uMsg, LPARAM, LPARAM pData);
+#if PFD_HAS_IFILEDIALOG
     std::string select_folder_vista(IFileDialog *ifd, bool force_path);
+#endif
 
     std::wstring m_wtitle;
     std::wstring m_wdefault_path;
@@ -668,13 +725,16 @@
         m_impl->m_wdefault_path = internal::str2wstr(default_path);
         auto wfilter_list = internal::str2wstr(filter_list);
 
+        // Initialise COM. This is required for the new folder selection window,
+        // (see https://github.com/samhocevar/portable-file-dialogs/pull/21)
+        // and to avoid random crashes with GetOpenFileNameW() (see
+        // https://github.com/samhocevar/portable-file-dialogs/issues/51)
+        internal::platform::ole32_dll ole32;
+
         // Folder selection uses a different method
         if (in_type == type::folder)
         {
-            internal::platform::dll ole32("ole32.dll");
-
-            auto status = internal::platform::dll::proc<HRESULT WINAPI (LPVOID, DWORD)>(ole32, "CoInitializeEx")
-                              (nullptr, COINIT_APARTMENTTHREADED);
+#if PFD_HAS_IFILEDIALOG
             if (flags(flag::is_vista))
             {
                 // On Vista and higher we should be able to use IFileDialog for folder selection
@@ -686,6 +746,7 @@
                 if (SUCCEEDED(hr))
                     return m_impl->select_folder_vista(ifd, options & opt::force_path);
             }
+#endif
 
             BROWSEINFOW bi;
             memset(&bi, 0, sizeof(bi));
@@ -695,9 +756,7 @@
 
             if (flags(flag::is_vista))
             {
-                // This hangs on Windows XP, as reported here:
-                // https://github.com/samhocevar/portable-file-dialogs/pull/21
-                if (status == S_OK)
+                if (ole32.is_initialized())
                     bi.ulFlags |= BIF_NEWDIALOGSTYLE;
                 bi.ulFlags |= BIF_EDITBOX;
                 bi.ulFlags |= BIF_STATUSTEXT;
@@ -713,8 +772,6 @@
                 ret = internal::wstr2str(buffer);
                 delete[] buffer;
             }
-            if (status == S_OK)
-                internal::platform::dll::proc<void WINAPI ()>(ole32, "CoUninitialize")();
             return ret;
         }
 
@@ -750,37 +807,36 @@
 
         internal::platform::dll comdlg32("comdlg32.dll");
 
+        // Apply new visual style (required for windows XP)
+        internal::platform::new_style_context ctx;
+
         if (in_type == type::save)
         {
             if (!(options & opt::force_overwrite))
                 ofn.Flags |= OFN_OVERWRITEPROMPT;
 
-            // using set context to apply new visual style (required for windows XP)
-            internal::platform::new_style_context ctx;
-
             internal::platform::dll::proc<BOOL WINAPI (LPOPENFILENAMEW)> get_save_file_name(comdlg32, "GetSaveFileNameW");
             if (get_save_file_name(&ofn) == 0)
                 return "";
             return internal::wstr2str(woutput.c_str());
         }
+        else
+        {
+            if (options & opt::multiselect)
+                ofn.Flags |= OFN_ALLOWMULTISELECT;
+            ofn.Flags |= OFN_PATHMUSTEXIST;
 
-        if (options & opt::multiselect)
-            ofn.Flags |= OFN_ALLOWMULTISELECT;
-        ofn.Flags |= OFN_PATHMUSTEXIST;
-
-        // using set context to apply new visual style (required for windows XP)
-        internal::platform::new_style_context ctx;
-
-        internal::platform::dll::proc<BOOL WINAPI (LPOPENFILENAMEW)> get_open_file_name(comdlg32, "GetOpenFileNameW");
-        if (get_open_file_name(&ofn) == 0)
-            return "";
+            internal::platform::dll::proc<BOOL WINAPI (LPOPENFILENAMEW)> get_open_file_name(comdlg32, "GetOpenFileNameW");
+            if (get_open_file_name(&ofn) == 0)
+                return "";
+        }
 
         std::string prefix;
         for (wchar_t const *p = woutput.c_str(); *p; )
         {
             auto filename = internal::wstr2str(p);
-            p += filename.size();
-            // In multiselect mode, we advance p one step more and
+            p += wcslen(p);
+            // In multiselect mode, we advance p one wchar further and
             // check for another filename. If there is one and the
             // prefix is empty, it means we just read the prefix.
             if ((options & opt::multiselect) && *++p && prefix.empty())
@@ -895,7 +951,10 @@
             case type::folder: command.push_back("--getexistingdirectory"); break;
         }
         if (options & opt::multiselect)
-            command.push_back(" --multiple");
+        {
+            command.push_back("--multiple");
+            command.push_back("--separate-output");
+        }
 
         command.push_back(default_path);
 
@@ -909,7 +968,10 @@
     }
 
     if (flags(flag::is_verbose))
-        std::cerr << "pfd: " << command << std::endl;
+        print_command(command);
+
+    if (!available())
+        fputs("pfd: Unable to find zenity/matedialog/qarma/kdialog to open file chooser\n", stderr);
 
     m_async->start_process(command);
 #endif
@@ -923,8 +985,8 @@
     auto ret = m_async->result();
     // Strip potential trailing newline (zenity). Also strip trailing slash
     // added by osascript for consistency with other backends.
-    while (ret.back() == '\n' || ret.back() == '/')
-        ret = ret.substr(0, ret.size() - 1);
+    while (!ret.empty() && (ret.back() == '\n' || ret.back() == '/'))
+        ret.pop_back();
     return ret;
 #endif
 }
@@ -965,6 +1027,7 @@
     return 0;
 }
 
+#if PFD_HAS_IFILEDIALOG
 std::string internal::file_dialog::Impl::select_folder_vista(IFileDialog *ifd, bool force_path)
 {
     std::string result;
@@ -1016,8 +1079,7 @@
             if (wselected)
             {
                 result = internal::wstr2str(std::wstring(wselected));
-                internal::platform::dll ole32("ole32.dll");
-                internal::platform::dll::proc<void WINAPI (LPVOID)>(ole32, "CoTaskMemFree")(wselected);
+                internal::platform::dll::proc<void WINAPI (LPVOID)>(internal::platform::ole32_dll(), "CoTaskMemFree")(wselected);
             }
         }
     }
@@ -1027,6 +1089,7 @@
     return result;
 }
 #endif
+#endif
 
 // notify implementation
 
@@ -1127,7 +1190,10 @@
     }
 
     if (flags(flag::is_verbose))
-        std::cerr << "pfd: " << command << std::endl;
+        print_command(command);
+
+    if (!available())
+        fputs("pfd: Unable to find zenity/matedialog/qarma/kdialog to open file chooser\n", stderr);
 
     m_async->start_process(command);
 #endif
@@ -1141,7 +1207,9 @@
                         icon _icon /* = icon::info */)
 {
 #if _WIN32
-    UINT style = MB_TOPMOST;
+    // Use MB_SYSTEMMODAL rather than MB_TOPMOST to ensure the message window is brought
+    // to front. See https://github.com/samhocevar/portable-file-dialogs/issues/52
+    UINT style = MB_SYSTEMMODAL;
     switch (_icon)
     {
         case icon::warning: style |= MB_ICONWARNING; break;
@@ -1168,11 +1236,11 @@
     m_mappings[IDRETRY] = button::retry;
     m_mappings[IDIGNORE] = button::ignore;
 
-    m_async->start_func([this, text, title, style](int* exit_code) -> std::string
+    m_async->start_func([text, title, style](int* exit_code) -> std::string
     {
         auto wtext = internal::str2wstr(text);
         auto wtitle = internal::str2wstr(title);
-        // using set context to apply new visual style (required for all windows versions)
+        // Apply new visual style (required for all Windows versions)
         internal::platform::new_style_context ctx;
         *exit_code = MessageBoxW(GetActiveWindow(), wtext.c_str(), wtitle.c_str(), style);
         return "";
@@ -1328,7 +1396,10 @@
     }
 
     if (flags(flag::is_verbose))
-        std::cerr << "pfd: " << command << std::endl;
+        print_command(command);
+
+    if (!available())
+        fputs("pfd: Unable to find zenity/matedialog/qarma/kdialog to open file chooser\n", stderr);
 
     m_async->start_process(command);
 #endif
diff --git a/wpigui/src/main/native/cpp/wpigui.cpp b/wpigui/src/main/native/cpp/wpigui.cpp
index 4b200b5..b1e1143 100644
--- a/wpigui/src/main/native/cpp/wpigui.cpp
+++ b/wpigui/src/main/native/cpp/wpigui.cpp
@@ -15,7 +15,6 @@
 #include <imgui_internal.h>
 #include <implot.h>
 #include <stb_image.h>
-#include <wpi/fs.h>
 
 #include "wpigui_internal.h"
 
@@ -34,7 +33,9 @@
     gContext->width = width;
     gContext->height = height;
   }
-  PlatformRenderFrame();
+  if (!gContext->isPlatformRendering) {
+    PlatformRenderFrame();
+  }
 }
 
 static void FramebufferSizeCallback(GLFWwindow* window, int width, int height) {
@@ -96,8 +97,8 @@
   out_buf->appendf(
       "[MainWindow][GLOBAL]\nwidth=%d\nheight=%d\nmaximized=%d\n"
       "xpos=%d\nypos=%d\nuserScale=%d\nstyle=%d\n\n",
-      gContext->width, gContext->height, gContext->maximized, gContext->xPos,
-      gContext->yPos, gContext->userScale, gContext->style);
+      gContext->width, gContext->height, gContext->maximized ? 1 : 0,
+      gContext->xPos, gContext->yPos, gContext->userScale, gContext->style);
 }
 
 void gui::CreateContext() {
@@ -146,7 +147,12 @@
   iniHandler.WriteAllFn = IniWriteAll;
   ImGui::GetCurrentContext()->SettingsHandlers.push_back(iniHandler);
 
-  io.IniFilename = gContext->iniPath.c_str();
+  if (gContext->loadSettings) {
+    gContext->loadSettings();
+    io.IniFilename = nullptr;
+  } else {
+    io.IniFilename = gContext->iniPath.c_str();
+  }
 
   for (auto&& initialize : gContext->initializers) {
     if (initialize) {
@@ -155,7 +161,11 @@
   }
 
   // Load INI file
-  ImGui::LoadIniSettingsFromDisk(io.IniFilename);
+  if (gContext->loadIniSettings) {
+    gContext->loadIniSettings();
+  } else if (io.IniFilename) {
+    ImGui::LoadIniSettingsFromDisk(io.IniFilename);
+  }
 
   // Set initial window settings
   glfwWindowHint(GLFW_MAXIMIZED, gContext->maximized ? GLFW_TRUE : GLFW_FALSE);
@@ -282,7 +292,23 @@
   while (!glfwWindowShouldClose(gContext->window) && !gContext->exit) {
     // Poll and handle events (inputs, window resize, etc.)
     glfwPollEvents();
+    gContext->isPlatformRendering = true;
     PlatformRenderFrame();
+    gContext->isPlatformRendering = false;
+
+    // custom saving
+    if (gContext->saveSettings) {
+      auto& io = ImGui::GetIO();
+      if (io.WantSaveIniSettings) {
+        gContext->saveSettings(false);
+        io.WantSaveIniSettings = false;  // reset flag
+      }
+    }
+  }
+
+  // Save (if custom save)
+  if (gContext->saveSettings) {
+    gContext->saveSettings(true);
   }
 
   // Cleanup
@@ -292,8 +318,8 @@
   ImGui::DestroyContext();
 
   // Delete the save file if requested.
-  if (gContext->resetOnExit) {
-    fs::remove(fs::path{gContext->iniPath});
+  if (!gContext->saveSettings && gContext->resetOnExit) {
+    std::remove(gContext->iniPath.c_str());
   }
 
   glfwDestroyWindow(gContext->window);
@@ -367,6 +393,14 @@
   }
 }
 
+void gui::ConfigureCustomSaveSettings(std::function<void()> load,
+                                      std::function<void()> loadIni,
+                                      std::function<void(bool)> save) {
+  gContext->loadSettings = load;
+  gContext->loadIniSettings = loadIni;
+  gContext->saveSettings = save;
+}
+
 GLFWwindow* gui::GetSystemWindow() {
   return gContext->window;
 }
@@ -416,27 +450,31 @@
   gContext->clearColor = color;
 }
 
-void gui::ConfigurePlatformSaveFile(const std::string& name) {
-  gContext->iniPath = name;
+std::string gui::GetPlatformSaveFileDir() {
 #if defined(_MSC_VER)
   const char* env = std::getenv("APPDATA");
   if (env) {
-    gContext->iniPath = env + std::string("/" + name);
+    return env + std::string("/");
   }
 #elif defined(__APPLE__)
   const char* env = std::getenv("HOME");
   if (env) {
-    gContext->iniPath = env + std::string("/Library/Preferences/" + name);
+    return env + std::string("/Library/Preferences/");
   }
 #else
   const char* xdg = std::getenv("XDG_CONFIG_HOME");
   const char* env = std::getenv("HOME");
   if (xdg) {
-    gContext->iniPath = xdg + std::string("/" + name);
+    return xdg + std::string("/");
   } else if (env) {
-    gContext->iniPath = env + std::string("/.config/" + name);
+    return env + std::string("/.config/");
   }
 #endif
+  return "";
+}
+
+void gui::ConfigurePlatformSaveFile(const std::string& name) {
+  gContext->iniPath = GetPlatformSaveFileDir() + name;
 }
 
 void gui::EmitViewMenu() {
@@ -473,7 +511,9 @@
       ImGui::EndMenu();
     }
 
-    ImGui::MenuItem("Reset UI on Exit?", nullptr, &gContext->resetOnExit);
+    if (!gContext->saveSettings) {
+      ImGui::MenuItem("Reset UI on Exit?", nullptr, &gContext->resetOnExit);
+    }
     ImGui::EndMenu();
   }
 }
diff --git a/wpigui/src/main/native/include/portable-file-dialogs.h b/wpigui/src/main/native/include/portable-file-dialogs.h
index dffa71e..95d5f43 100644
--- a/wpigui/src/main/native/include/portable-file-dialogs.h
+++ b/wpigui/src/main/native/include/portable-file-dialogs.h
@@ -210,7 +210,7 @@
 class open_file : public internal::file_dialog
 {
 public:
-    open_file(std::string const &title,
+    explicit open_file(std::string const &title,
               std::string const &default_path = "",
               std::vector<std::string> const &filters = { "All Files", "*" },
               opt options = opt::none)
@@ -223,7 +223,7 @@
 class save_file : public internal::file_dialog
 {
 public:
-    save_file(std::string const &title,
+    explicit save_file(std::string const &title,
               std::string const &default_path = "",
               std::vector<std::string> const &filters = { "All Files", "*" },
               opt options = opt::none)
@@ -236,7 +236,7 @@
 class select_folder : public internal::file_dialog
 {
 public:
-    select_folder(std::string const &title,
+    explicit select_folder(std::string const &title,
                   std::string const &default_path = "",
                   opt options = opt::none)
       : file_dialog(type::folder, title, default_path, {}, options)
@@ -246,4 +246,3 @@
 };
 
 } // namespace pfd
-
diff --git a/wpigui/src/main/native/include/wpigui.h b/wpigui/src/main/native/include/wpigui.h
index 7860f0d..d4602b5 100644
--- a/wpigui/src/main/native/include/wpigui.h
+++ b/wpigui/src/main/native/include/wpigui.h
@@ -80,6 +80,36 @@
 void AddLateExecute(std::function<void()> execute);
 
 /**
+ * Customizes save/load behavior.
+ *
+ * By default, the integrated ImGui functions are used for this;
+ * ImGui::LoadIniSettingsFromDisk(io.IniFilename) is called at startup, and
+ * ImGui default automatic save file handling is used via io.IniFilename.
+ *
+ * Calling this function results in the load function being called at startup,
+ * io.IniFilename set to null (which disables ImGui's integrated file saving),
+ * and the save function being called when io.WantSaveIniSettings is true.
+ * The loadIni function should call ImGui::LoadIniSettingsFromMemory() to load
+ * ImGui save data, and the save function should call
+ * ImGui::SaveIniSettingsToMemory() to get ImGui save data.
+ *
+ * The load function is called PRIOR to AddInit() functions, and the loadIni
+ * function is called AFTER to AddInit() functions.  This allows initialize
+ * functions that use custom storage to handle the loaded values, and initialize
+ * functions that use INI storage to add hooks prior to the load INI occurring.
+ *
+ * This must be called prior to Initialize().
+ *
+ * @param load load function
+ * @param loadIni load INI function
+ * @param save save function; false is passed periodically, true is passed once
+ *             when the main loop is exiting
+ */
+void ConfigureCustomSaveSettings(std::function<void()> load,
+                                 std::function<void()> loadIni,
+                                 std::function<void(bool exiting)> save);
+
+/**
  * Gets GLFW window handle.
  */
 GLFWwindow* GetSystemWindow();
@@ -138,6 +168,14 @@
 void SetClearColor(ImVec4 color);
 
 /**
+ * Gets the (platform-specific) absolute directory for save files.
+ *
+ * @return Absolute path, including trailing "/". Empty string if directory
+ *         could not be determined.
+ */
+std::string GetPlatformSaveFileDir();
+
+/**
  * Configures a save file (.ini) in a platform specific location. On Windows,
  * the .ini is saved in %APPDATA%; on macOS the .ini is saved in
  * ~/Library/Preferences; on Linux the .ini is stored in $XDG_CONFIG_HOME or
diff --git a/wpigui/src/main/native/include/wpigui_internal.h b/wpigui/src/main/native/include/wpigui_internal.h
index 13e504c..4c8a22c 100644
--- a/wpigui/src/main/native/include/wpigui_internal.h
+++ b/wpigui/src/main/native/include/wpigui_internal.h
@@ -19,7 +19,7 @@
   bool loadedWidthHeight = false;
   int width;
   int height;
-  int maximized = 0;
+  bool maximized = false;
   int xPos = -1;
   int yPos = -1;
   int userScale = 2;
@@ -37,9 +37,13 @@
   std::string title;
   int defaultWidth;
   int defaultHeight;
+  bool isPlatformRendering{false};
 
   GLFWwindow* window = nullptr;
 
+  std::function<void()> loadSettings;
+  std::function<void()> loadIniSettings;
+  std::function<void(bool exiting)> saveSettings;
   std::vector<std::function<void()>> initializers;
   std::vector<std::function<void(float scale)>> windowScalers;
   std::vector<std::pair<
