diff --git a/src/common/progress_callback.cpp b/src/common/progress_callback.cpp
index 55f334321..0e8a43d33 100644
--- a/src/common/progress_callback.cpp
+++ b/src/common/progress_callback.cpp
@@ -93,6 +93,18 @@ bool ProgressCallback::DisplayFormattedModalConfirmation(const char* format, ...
   return ModalConfirmation(str);
 }
 
+void ProgressCallback::DisplayFormattedModalInformation(const char* format, ...)
+{
+  SmallString str;
+  va_list ap;
+
+  va_start(ap, format);
+  str.FormatVA(format, ap);
+  va_end(ap);
+
+  ModalInformation(str);
+}
+
 void ProgressCallback::UpdateProgressFromStream(ByteStream* pStream)
 {
   u32 streamSize = (u32)pStream->GetSize();
@@ -112,6 +124,7 @@ public:
   bool IsCancellable() const override { return false; }
 
   void SetCancellable(bool cancellable) override {}
+  void SetTitle(const char* title) override {}
   void SetStatusText(const char* statusText) override {}
   void SetProgressRange(u32 range) override {}
   void SetProgressValue(u32 value) override {}
@@ -128,12 +141,7 @@ public:
     Log_InfoPrint(message);
     return false;
   }
-  u32 ModalPrompt(const char* message, u32 nOptions, ...) override
-  {
-    DebugAssert(nOptions > 0);
-    Log_InfoPrint(message);
-    return 0;
-  }
+  void ModalInformation(const char* message) override { Log_InfoPrint(message); }
 };
 
 static NullProgressCallbacks s_nullProgressCallbacks;
@@ -264,6 +272,13 @@ void ConsoleProgressCallback::SetCancellable(bool cancellable)
   Redraw(false);
 }
 
+void ConsoleProgressCallback::SetTitle(const char* title)
+{
+  Clear();
+  std::fprintf(stdout, "== %s ==\n", title);
+  Redraw(false);
+}
+
 void ConsoleProgressCallback::SetStatusText(const char* text)
 {
   BaseProgressCallback::SetStatusText(text);
@@ -387,11 +402,9 @@ bool ConsoleProgressCallback::ModalConfirmation(const char* message)
   return false;
 }
 
-u32 ConsoleProgressCallback::ModalPrompt(const char* message, u32 num_options, ...)
+void ConsoleProgressCallback::ModalInformation(const char* message)
 {
   Clear();
-  DebugAssert(num_options > 0);
   Log_InfoPrint(message);
   Redraw(false);
-  return 0;
 }
diff --git a/src/common/progress_callback.h b/src/common/progress_callback.h
index a6436e47d..9ea431cc1 100644
--- a/src/common/progress_callback.h
+++ b/src/common/progress_callback.h
@@ -17,6 +17,7 @@ public:
 
   virtual void SetCancellable(bool cancellable) = 0;
 
+  virtual void SetTitle(const char* title) = 0;
   virtual void SetStatusText(const char* text) = 0;
   virtual void SetProgressRange(u32 range) = 0;
   virtual void SetProgressValue(u32 value) = 0;
@@ -31,7 +32,7 @@ public:
 
   virtual void ModalError(const char* message) = 0;
   virtual bool ModalConfirmation(const char* message) = 0;
-  virtual u32 ModalPrompt(const char* message, u32 num_options, ...) = 0;
+  virtual void ModalInformation(const char* message) = 0;
 
   void DisplayFormattedError(const char* format, ...);
   void DisplayFormattedWarning(const char* format, ...);
@@ -39,6 +40,7 @@ public:
   void DisplayFormattedDebugMessage(const char* format, ...);
   void DisplayFormattedModalError(const char* format, ...);
   bool DisplayFormattedModalConfirmation(const char* format, ...);
+  void DisplayFormattedModalInformation(const char* format, ...);
 
   void UpdateProgressFromStream(ByteStream* stream);
 
@@ -86,7 +88,7 @@ protected:
   State* m_saved_state;
 };
 
-class ConsoleProgressCallback : public BaseProgressCallback
+class ConsoleProgressCallback final : public BaseProgressCallback
 {
 public:
   static const u32 COLUMNS = 78;
@@ -95,22 +97,23 @@ public:
   ConsoleProgressCallback();
   ~ConsoleProgressCallback();
 
-  virtual void PushState() override;
-  virtual void PopState() override;
+  void PushState() override;
+  void PopState() override;
 
-  virtual void SetCancellable(bool cancellable) override;
-  virtual void SetStatusText(const char* text) override;
-  virtual void SetProgressRange(u32 range) override;
-  virtual void SetProgressValue(u32 value) override;
+  void SetCancellable(bool cancellable) override;
+  void SetTitle(const char* title) override;
+  void SetStatusText(const char* text) override;
+  void SetProgressRange(u32 range) override;
+  void SetProgressValue(u32 value) override;
 
-  virtual void DisplayError(const char* message) override;
-  virtual void DisplayWarning(const char* message) override;
-  virtual void DisplayInformation(const char* message) override;
-  virtual void DisplayDebugMessage(const char* message) override;
+  void DisplayError(const char* message) override;
+  void DisplayWarning(const char* message) override;
+  void DisplayInformation(const char* message) override;
+  void DisplayDebugMessage(const char* message) override;
 
-  virtual void ModalError(const char* message) override;
-  virtual bool ModalConfirmation(const char* message) override;
-  virtual u32 ModalPrompt(const char* message, u32 num_options, ...) override;
+  void ModalError(const char* message) override;
+  bool ModalConfirmation(const char* message) override;
+  void ModalInformation(const char* message) override;
 
 private:
   void Clear();
diff --git a/src/core/host_interface_progress_callback.cpp b/src/core/host_interface_progress_callback.cpp
index 750b85909..897899d01 100644
--- a/src/core/host_interface_progress_callback.cpp
+++ b/src/core/host_interface_progress_callback.cpp
@@ -18,6 +18,11 @@ void HostInterfaceProgressCallback::SetCancellable(bool cancellable)
   Redraw(true);
 }
 
+void HostInterfaceProgressCallback::SetTitle(const char* title)
+{
+  // todo?
+}
+
 void HostInterfaceProgressCallback::SetStatusText(const char* text)
 {
   BaseProgressCallback::SetStatusText(text);
@@ -64,15 +69,20 @@ void HostInterfaceProgressCallback::DisplayInformation(const char* message) { Lo
 
 void HostInterfaceProgressCallback::DisplayDebugMessage(const char* message) { Log_DevPrint(message); }
 
-void HostInterfaceProgressCallback::ModalError(const char* message) { g_host_interface->ReportError(message); }
+void HostInterfaceProgressCallback::ModalError(const char* message)
+{
+  Log_ErrorPrint(message);
+  g_host_interface->ReportError(message);
+}
 
 bool HostInterfaceProgressCallback::ModalConfirmation(const char* message)
 {
+  Log_InfoPrint(message);
   return g_host_interface->ConfirmMessage(message);
 }
 
-u32 HostInterfaceProgressCallback::ModalPrompt(const char* message, u32 num_options, ...)
+void HostInterfaceProgressCallback::ModalInformation(const char* message)
 {
   Log_InfoPrint(message);
-  return 0;
+  g_host_interface->ReportMessage(message);
 }
diff --git a/src/core/host_interface_progress_callback.h b/src/core/host_interface_progress_callback.h
index 85950d9e8..eb8369860 100644
--- a/src/core/host_interface_progress_callback.h
+++ b/src/core/host_interface_progress_callback.h
@@ -2,7 +2,7 @@
 #include "common/progress_callback.h"
 #include "host_interface.h"
 
-class HostInterfaceProgressCallback : public BaseProgressCallback
+class HostInterfaceProgressCallback final : public BaseProgressCallback
 {
 public:
   HostInterfaceProgressCallback();
@@ -11,6 +11,7 @@ public:
   void PopState() override;
 
   void SetCancellable(bool cancellable) override;
+  void SetTitle(const char* title) override;
   void SetStatusText(const char* text) override;
   void SetProgressRange(u32 range) override;
   void SetProgressValue(u32 value) override;
@@ -22,7 +23,7 @@ public:
 
   void ModalError(const char* message) override;
   bool ModalConfirmation(const char* message) override;
-  u32 ModalPrompt(const char* message, u32 num_options, ...) override;
+  void ModalInformation(const char* message) override;
   
 private:
   void Redraw(bool force);
diff --git a/src/duckstation-qt/qtprogresscallback.cpp b/src/duckstation-qt/qtprogresscallback.cpp
index 087ed4e7c..a391fb844 100644
--- a/src/duckstation-qt/qtprogresscallback.cpp
+++ b/src/duckstation-qt/qtprogresscallback.cpp
@@ -29,6 +29,11 @@ void QtProgressCallback::SetCancellable(bool cancellable)
   m_dialog.setCancelButtonText(cancellable ? tr("Cancel") : QString());
 }
 
+void QtProgressCallback::SetTitle(const char* title)
+{
+  m_dialog.setWindowTitle(QString::fromUtf8(title));
+}
+
 void QtProgressCallback::SetStatusText(const char* text)
 {
   BaseProgressCallback::SetStatusText(text);
@@ -83,23 +88,7 @@ bool QtProgressCallback::ModalConfirmation(const char* message)
                                 QMessageBox::No) == QMessageBox::Yes);
 }
 
-u32 QtProgressCallback::ModalPrompt(const char* message, u32 num_options, ...)
+void QtProgressCallback::ModalInformation(const char* message)
 {
-  enum : u32
-  {
-    MAX_OPTIONS = 3,
-  };
-
-  std::array<QString, MAX_OPTIONS> options;
-
-  std::va_list ap;
-  va_start(ap, num_options);
-
-  for (u32 i = 0; i < num_options && i < MAX_OPTIONS; i++)
-    options[i] = QString::fromUtf8(va_arg(ap, const char*));
-
-  va_end(ap);
-
-  return static_cast<u32>(QMessageBox::question(&m_dialog, tr("Question"), QString::fromUtf8(message), options[0],
-                                                options[1], options[2], 0, 0));
+  QMessageBox::information(&m_dialog, tr("Information"), QString::fromUtf8(message));
 }
diff --git a/src/duckstation-qt/qtprogresscallback.h b/src/duckstation-qt/qtprogresscallback.h
index 726c731e9..bbe78f8eb 100644
--- a/src/duckstation-qt/qtprogresscallback.h
+++ b/src/duckstation-qt/qtprogresscallback.h
@@ -13,6 +13,7 @@ public:
   bool IsCancelled() const override;
 
   void SetCancellable(bool cancellable) override;
+  void SetTitle(const char* title) override;
   void SetStatusText(const char* text) override;
   void SetProgressRange(u32 range) override;
   void SetProgressValue(u32 value) override;
@@ -24,7 +25,7 @@ public:
 
   void ModalError(const char* message) override;
   bool ModalConfirmation(const char* message) override;
-  u32 ModalPrompt(const char* message, u32 num_options, ...) override;
+  void ModalInformation(const char* message) override;
 
 private:
   QProgressDialog m_dialog;