diff -uNr systemd-228/src/libsystemd/sd-event/sd-event.c systemd-228-new/src/libsystemd/sd-event/sd-event.c
--- systemd-228/src/libsystemd/sd-event/sd-event.c	2017-01-22 15:47:20.840228663 +0000
+++ systemd-228-new/src/libsystemd/sd-event/sd-event.c	2017-01-22 16:31:33.256355140 +0000
@@ -40,6 +40,7 @@
 #include "string-util.h"
 #include "time-util.h"
 #include "util.h"
+#include "virt.h"
 
 #define DEFAULT_ACCURACY_USEC (250 * USEC_PER_MSEC)
 
@@ -2381,14 +2382,21 @@
 static int arm_watchdog(sd_event *e) {
         struct itimerspec its = {};
         usec_t t;
-        int r;
+        int r, v;
 
         assert(e);
         assert(e->watchdog_fd >= 0);
 
-        t = sleep_between(e,
-                          e->watchdog_last + (e->watchdog_period / 2),
-                          e->watchdog_last + (e->watchdog_period * 3 / 4));
+        v = detect_virtualization();
+
+        if (VIRTUALIZATION_IS_VM(v))
+            t = sleep_between(e,
+                              e->watchdog_last + (e->watchdog_period * 1 / 4),
+                              e->watchdog_last + (e->watchdog_period / 2));
+        else
+            t = sleep_between(e,
+                              e->watchdog_last + (e->watchdog_period / 2),
+                              e->watchdog_last + (e->watchdog_period * 3 / 4));
 
         timespec_store(&its.it_value, t);