diff --git a/emper/Runtime.hpp b/emper/Runtime.hpp
index 96931f39828ca04c639d00dbf2c76d5170184dd9..c8a4bbadec6c95910bc1b100a6b8c43115af61af 100644
--- a/emper/Runtime.hpp
+++ b/emper/Runtime.hpp
@@ -5,7 +5,6 @@
 #include <pthread.h>	// for pthread_t
 
 #include <atomic>
-#include <cassert>		 // for assert
 #include <cstdint>		 // for intptr_t
 #include <cstdlib>		 // for abort
 #include <functional>	 // for function
@@ -76,7 +75,11 @@ class Runtime : public Logger<LogSubsystem::RUNTI> {
 	Latch secondWorkerThreadExitLatch;
 
 	RuntimeStrategy* const strategy;
+
+ public:
 	Scheduler& scheduler;
+
+ private:
 	Dispatcher& dispatcher;
 	ContextManager& contextManager;
 	pthread_t* threads;
@@ -176,19 +179,9 @@ class Runtime : public Logger<LogSubsystem::RUNTI> {
 
 	~Runtime();
 
-	inline void schedule(Fiber& fiber) {
-		// Calling schedule() only works from within the EMPER runtime.
-		assert(inRuntime());
+	inline void schedule(Fiber& fiber) { scheduler.schedule(fiber); }
 
-		scheduler.schedule(fiber);
-	}
-
-	inline void schedule(Fiber** fibers, unsigned count) {
-		// Calling schedule() only works from within the EMPER runtime.
-		assert(inRuntime());
-
-		scheduler.schedule(fibers, count);
-	}
+	inline void schedule(Fiber** fibers, unsigned count) { scheduler.schedule(fibers, count); }
 
 	inline void scheduleFromAnywhere(Fiber& fiber) { scheduler.scheduleFromAnywhere(fiber); }
 
@@ -228,8 +221,6 @@ class Runtime : public Logger<LogSubsystem::RUNTI> {
 
 	void printStats(std::ostream& out = std::cout, bool detailed = false);
 
-	static auto inRuntime() -> bool { return Worker::isWorkerThread(); }
-
 	void executeAndWait(std::function<void()> f);
 
 	friend class AbstractWorkStealingScheduler;
diff --git a/emper/Scheduler.hpp b/emper/Scheduler.hpp
index 41160ff3612910003f03836a9a5dd3f4d16396f5..be9e9a0779b8ba8a8a2a48066212f32748448c91 100644
--- a/emper/Scheduler.hpp
+++ b/emper/Scheduler.hpp
@@ -73,14 +73,24 @@ class Scheduler : public Logger<LogSubsystem::SCHED> {
 
 	void recycle(Fiber* fiber) { dispatcher.recycle(fiber); };
 
+	virtual auto nextFiber() -> NextFiberResult = 0;
+
+	friend class Runtime;
+
  public:
 	void schedule(Fiber& fiber) {
+		// Calling schedule() only works from within the EMPER runtime.
+		emper::assertInRuntime();
+
 		LOGD("Scheduling fiber " << &fiber);
 		scheduleInternal(fiber);
 	}
 
 	// TODO: maybe this should also be a specialized function
 	void schedule(Fiber** fibers, unsigned count) {
+		// Calling schedule() only works from within the EMPER runtime.
+		emper::assertInRuntime();
+
 		for (unsigned i = 0; i < count; ++i) {
 			Fiber& fiber = *fibers[i];
 			LOGD("Scheduling batched fiber " << &fiber);
@@ -88,8 +98,6 @@ class Scheduler : public Logger<LogSubsystem::SCHED> {
 		}
 	}
 
-	virtual auto nextFiber() -> NextFiberResult = 0;
-
 	void scheduleFromAnywhere(Fiber& fiber) {
 		LOGD("Scheduling fiber " << &fiber << " from anywhere");
 		scheduleFromAnywhereInternal(fiber);