diff --git a/shell.nix b/shell.nix
index 0a45aabc5..25e692bab 100644
--- a/shell.nix
+++ b/shell.nix
@@ -8,6 +8,7 @@ pkgs.mkShell {
     # For documentation
     doxygen
     python3Packages.sphinx
+    python3Packages.sphinx-rtd-theme
   ];
 
   buildInputs = with pkgs; [
diff --git a/src/event/Thread.cxx b/src/event/Thread.cxx
index 70e1feb4f..f8e9308f0 100644
--- a/src/event/Thread.cxx
+++ b/src/event/Thread.cxx
@@ -8,6 +8,7 @@
 #include "lib/fmt/ExceptionFormatter.hxx"
 #include "util/Domain.hxx"
 #include "Log.hxx"
+#include <boost/stacktrace.hpp>
 
 #ifdef HAVE_URING
 #include "util/ScopeExit.hxx"
@@ -54,7 +55,8 @@ EventThread::Run() noexcept
 		} catch (...) {
 			FmtInfo(event_domain,
 				"RTIOThread could not get realtime scheduling, continuing anyway: {}",
-				std::current_exception());
+				/* std::current_exception()); */
+        boost::stacktrace::to_string(boost::stacktrace::stacktrace()));
 		}
 	} else {
 #ifdef HAVE_URING
diff --git a/src/lib/yajl/Callbacks.hxx b/src/lib/yajl/Callbacks.hxx
index f2bc9ffe3..16163daf1 100644
--- a/src/lib/yajl/Callbacks.hxx
+++ b/src/lib/yajl/Callbacks.hxx
@@ -7,7 +7,7 @@
 
 #include <string_view>
 
-#include <yajl_parse.h>
+#include <yajl/yajl_parse.h>
 
 namespace Yajl {
 
diff --git a/src/lib/yajl/Gen.hxx b/src/lib/yajl/Gen.hxx
index 84efdbcce..7d778790a 100644
--- a/src/lib/yajl/Gen.hxx
+++ b/src/lib/yajl/Gen.hxx
@@ -3,7 +3,7 @@
 
 #pragma once
 
-#include <yajl_gen.h>
+#include <yajl/yajl_gen.h>
 
 #include <algorithm>
 #include <span>
diff --git a/src/lib/yajl/Handle.hxx b/src/lib/yajl/Handle.hxx
index 28e4fe942..a821d0cd5 100644
--- a/src/lib/yajl/Handle.hxx
+++ b/src/lib/yajl/Handle.hxx
@@ -3,7 +3,7 @@
 
 #pragma once
 
-#include <yajl_parse.h>
+#include <yajl/yajl_parse.h>
 
 #include <utility>
 
diff --git a/src/thread/Util.cxx b/src/thread/Util.cxx
index 0ba3d9d06..9e84ed944 100644
--- a/src/thread/Util.cxx
+++ b/src/thread/Util.cxx
@@ -12,6 +12,7 @@
 #include <string.h>
 #include <sys/types.h>
 #include <errno.h>
+#include "lib/fmt/RuntimeError.hxx"
 #elif defined(_WIN32)
 #include <windows.h>
 #endif
@@ -271,7 +272,7 @@ SetThreadRealtime()
 {
 #ifdef __linux__
 	struct sched_param sched_param;
-	sched_param.sched_priority = 40;
+	sched_param.sched_priority = 20;
 
 	int policy = SCHED_FIFO;
 #ifdef SCHED_RESET_ON_FORK
@@ -284,9 +285,13 @@ SetThreadRealtime()
 		DBusError error;
 		DBusConnection *system_bus;
 
-		if (!(system_bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error))) {
-			throw MakeErrno("could not connect to dbus");
-    }
+		dbus_error_init(&error);
+
+		system_bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+		if (dbus_error_is_set(&error)) {
+			throw FmtRuntimeError("could not connect to dbus: %s", error.message);
+		}
+		dbus_error_free(&error);
 
 		int max_realtime_priority;
 		if ((max_realtime_priority = rtkit_get_max_realtime_priority(system_bus)) < 0) {
@@ -295,12 +300,12 @@ SetThreadRealtime()
 		}
 
 		if (max_realtime_priority < sched_param.sched_priority) {
-			dbus_connection_unref(system_bus);
-			throw MakeErrno("maximum realtime priority is below 40");
+			sched_param.sched_priority = max_realtime_priority;
+			/* dbus_connection_unref(system_bus); */
+			/* throw MakeErrno("maximum realtime priority is below 40"); */
 		}
 
-    pid_t pid = getpid();
-		if (rtkit_make_realtime(system_bus, pid, sched_param.sched_priority) < 0) {
+		if (rtkit_make_realtime(system_bus, 0, sched_param.sched_priority) < 0) {
 			dbus_connection_unref(system_bus);
 			throw MakeErrno("failed to request realtime scheduling");
 		}
@@ -313,4 +318,4 @@ SetThreadRealtime()
 	// 	throw MakeErrno("sched_setscheduler failed");
 	// }
 #endif	// __linux__
-}
\ No newline at end of file
+}