diff --git a/kernel/exit.c b/kernel/exit.c
index 08b0df2566aeb55baa8bec80f3271ac93275a6f5..35b90b54afb7e0e03ec2b00797f75e7d226a47ee 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -791,9 +791,6 @@ void __noreturn do_exit(long code)
 		// inform the pb-scheduler knows which syscall triggered the scheduling
 		rq->pb.triggering_syscall.type = sched_trig_EXIT;
 		rq->pb.triggering_syscall.origin = current;
-
-		// inform the plan runtime state
-		plan_rt_state_incr_num_exited_procs();
 	}
 
 	// call the readout before the process is terminated
diff --git a/kernel/sched/pb.c b/kernel/sched/pb.c
index 6563a62e4d27c2b99b064258f85026d25ef91038..2b73632a2eefbcd7976cd055438f445e1a927839 100644
--- a/kernel/sched/pb.c
+++ b/kernel/sched/pb.c
@@ -239,6 +239,13 @@ static void dequeue_task_pb(struct rq *rq, struct task_struct *p, int flags)
 		// remove the exited process from the stack and run the next available
 		plan_rt_state_pop();
 		process_exited = true;
+
+        // only mark the process as exited if it is not expected to do more tasks
+        // (if it would still have child tasks it would be a premature exit)
+        if (cur_node && !cur_node->children) {
+            plan_rt_state_incr_num_exited_procs();
+        }
+
 		//terminate_perf_event(get_pevent_by_pid(prev_proc->pid));
 		plan_rt_state_debug_print();