diff --git a/include/trace/events/rv.h b/include/trace/events/rv.h
index 4e0dabffcf29..00f11a8dac3b 100644
--- a/include/trace/events/rv.h
+++ b/include/trace/events/rv.h
@@ -122,6 +122,18 @@ DECLARE_EVENT_CLASS(error_da_monitor_id,
 		__entry->event,
 		__entry->state)
 );
+
+#ifdef CONFIG_RV_MON_WWNR
+/* id is the pid of the task */
+DEFINE_EVENT(event_da_monitor_id, event_wwnr,
+	     TP_PROTO(int id, char *state, char *event, char *next_state, bool safe),
+	     TP_ARGS(id, state, event, next_state, safe));
+
+DEFINE_EVENT(error_da_monitor_id, error_wwnr,
+	     TP_PROTO(int id, char *state, char *event),
+	     TP_ARGS(id, state, event));
+#endif /* CONFIG_RV_MON_WWNR */
+
 #endif /* CONFIG_DA_MON_EVENTS_ID */
 #endif /* _TRACE_RV_H */
 
diff --git a/kernel/trace/rv/Kconfig b/kernel/trace/rv/Kconfig
index e9246b0bec9d..fba2ace2a22b 100644
--- a/kernel/trace/rv/Kconfig
+++ b/kernel/trace/rv/Kconfig
@@ -34,6 +34,14 @@ config RV_MON_WIP
 	  Enable WIP sample monitor, this is a sample monitor that
 	  illustrates the usage of per-cpu monitors.
 
+config RV_MON_WWNR
+	select DA_MON_EVENTS_ID
+	bool "WWNR monitor"
+	help
+	  Enable WWNR sample monitor, this is a sample monitor that
+	  illustrates the usage of per-task monitor. The model is
+	  broken on purpose: it serves to test reactors.
+
 config RV_REACTORS
 	bool "Runtime verification reactors"
 	default y if RV
diff --git a/kernel/trace/rv/Makefile b/kernel/trace/rv/Makefile
index b41109d2750a..af0ff9a46418 100644
--- a/kernel/trace/rv/Makefile
+++ b/kernel/trace/rv/Makefile
@@ -3,3 +3,4 @@
 obj-$(CONFIG_RV) += rv.o
 obj-$(CONFIG_RV_REACTORS) += rv_reactors.o
 obj-$(CONFIG_RV_MON_WIP) += monitors/wip/wip.o
+obj-$(CONFIG_RV_MON_WWNR) += monitors/wwnr/wwnr.o
diff --git a/kernel/trace/rv/monitors/wwnr/wwnr.c b/kernel/trace/rv/monitors/wwnr/wwnr.c
index 8ba01f0f0df8..3fe1ad9125d3 100644
--- a/kernel/trace/rv/monitors/wwnr/wwnr.c
+++ b/kernel/trace/rv/monitors/wwnr/wwnr.c
@@ -10,11 +10,8 @@
 
 #define MODULE_NAME "wwnr"
 
-/*
- * XXX: include required tracepoint headers, e.g.,
- * #include <linux/trace/events/sched.h>
- */
 #include <trace/events/rv.h>
+#include <trace/events/sched.h>
 
 /*
  * This is the self-generated part of the monitor. Generally, there is no need
@@ -37,21 +34,20 @@ DECLARE_DA_MON_PER_TASK(wwnr, char);
  * are translated into model's event.
  *
  */
-static void handle_switch_in(void *data, /* XXX: fill header */)
+static void handle_switch(void *data, bool preempt, struct task_struct *p,
+			  struct task_struct *n, unsigned int prev_state)
 {
-	struct task_struct *p = /* XXX: how do I get p? */;
-	da_handle_event_wwnr(p, switch_in_wwnr);
-}
+	/* start monitoring only after the first suspension */
+	if (prev_state == TASK_INTERRUPTIBLE)
+		da_handle_init_event_wwnr(p, switch_out_wwnr);
+	else
+		da_handle_event_wwnr(p, switch_out_wwnr);
 
-static void handle_switch_out(void *data, /* XXX: fill header */)
-{
-	struct task_struct *p = /* XXX: how do I get p? */;
-	da_handle_event_wwnr(p, switch_out_wwnr);
+	da_handle_event_wwnr(n, switch_in_wwnr);
 }
 
-static void handle_wakeup(void *data, /* XXX: fill header */)
+static void handle_wakeup(void *data, struct task_struct *p)
 {
-	struct task_struct *p = /* XXX: how do I get p? */;
 	da_handle_event_wwnr(p, wakeup_wwnr);
 }
 
@@ -63,9 +59,8 @@ static int start_wwnr(void)
 	if (retval)
 		return retval;
 
-	rv_attach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_in);
-	rv_attach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_out);
-	rv_attach_trace_probe("wwnr", /* XXX: tracepoint */, handle_wakeup);
+	rv_attach_trace_probe("wwnr", sched_switch, handle_switch);
+	rv_attach_trace_probe("wwnr", sched_wakeup, handle_wakeup);
 
 	return 0;
 }
@@ -74,9 +69,8 @@ static void stop_wwnr(void)
 {
 	rv_wwnr.enabled = 0;
 
-	rv_detach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_in);
-	rv_detach_trace_probe("wwnr", /* XXX: tracepoint */, handle_switch_out);
-	rv_detach_trace_probe("wwnr", /* XXX: tracepoint */, handle_wakeup);
+	rv_detach_trace_probe("wwnr", sched_switch, handle_switch);
+	rv_detach_trace_probe("wwnr", sched_wakeup, handle_wakeup);
 
 	da_monitor_destroy_wwnr();
 }
@@ -111,5 +105,5 @@ module_init(register_wwnr);
 module_exit(unregister_wwnr);
 
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR("dot2k: auto-generated");
-MODULE_DESCRIPTION("wwnr");
+MODULE_AUTHOR("Daniel Bristot de Oliveira <bristot@kernel.org>");
+MODULE_DESCRIPTION("wwnr: wakeup while not running monitor.");
