diff -ru monit-5.15/libmonit/src/system/Link.c monit-5.15-new/libmonit/src/system/Link.c
--- monit-5.15/libmonit/src/system/Link.c	2015-10-22 14:44:32.000000000 +0100
+++ monit-5.15-new/libmonit/src/system/Link.c	2015-11-02 20:36:50.306476752 +0000
@@ -276,7 +276,7 @@
 
 static void _updateCache() {
 #ifdef HAVE_IFADDRS_H
-        time_t now = Time_now();
+        time_t now = Time_mono_now();
         if (_stats.timestamp != now) {
                 _stats.timestamp = now;
                 if (_stats.addrs) {
diff -ru monit-5.15/libmonit/src/system/Time.c monit-5.15-new/libmonit/src/system/Time.c
--- monit-5.15/libmonit/src/system/Time.c	2015-10-22 14:44:32.000000000 +0100
+++ monit-5.15-new/libmonit/src/system/Time.c	2015-11-03 18:03:39.954877826 +0000
@@ -484,6 +484,19 @@
 	return t.tv_sec;
 }
 
+time_t Time_mono(void) {
+	struct timespec ts;
+	if (clock_gettime(CLOCK_MONOTONIC, &ts))
+                THROW(AssertException, "%s", System_getLastError());
+	return ts.tv_sec;
+}
+
+long long int Time_mono_milli(void) {
+	struct timespec ts;
+	if (clock_gettime(CLOCK_MONOTONIC, &ts))
+                THROW(AssertException, "%s", System_getLastError());
+	return (long long int)ts.tv_sec * 1000  +  (long long int)ts.tv_nsec / 1000000;
+}
 
 long long int Time_milli(void) {
 	struct timeval t;
@@ -492,6 +505,12 @@
 	return (long long int)t.tv_sec * 1000  +  (long long int)t.tv_usec / 1000;
 }
 
+long long int Time_mono_micro(void) {
+	struct timespec ts;
+	if (clock_gettime(CLOCK_MONOTONIC, &ts))
+                THROW(AssertException, "%s", System_getLastError());
+	return (long long int)ts.tv_sec * 1000000  +  (long long int)ts.tv_nsec / 1000;
+}
 
 long long int Time_micro(void) {
 	struct timeval t;
diff -ru monit-5.15/libmonit/src/system/Time.h monit-5.15-new/libmonit/src/system/Time.h
--- monit-5.15/libmonit/src/system/Time.h	2015-10-22 14:44:32.000000000 +0100
+++ monit-5.15-new/libmonit/src/system/Time.h	2015-11-03 18:07:38.962866686 +0000
@@ -111,6 +111,12 @@
  */
 time_t Time_now(void);
 
+/**
+ * Returns the time of the monotonic clock in seconds
+ * @return A time_t representing the systems notion of time [s]
+ * @exception AssertException If time could not be obtained
+ */
+time_t Time_mono(void);
 
 /**
  * Returns the time since the epoch measured in milliseconds.
@@ -121,6 +127,28 @@
  */
 long long int Time_milli(void);
 
+/**
+ * Returns the time of the monotonic clock in milliseconds
+ * @return A 64 bits long representing the systems notion of time [ms]
+ * @exception AssertException If time could not be obtained
+ */
+long long int Time_mono_milli(void);
+
+/**
+ * Returns the time since the epoch measured in microseconds.
+ * @return A 64 bits long representing the systems notion of microseconds
+ * since the <strong>epoch</strong> (January 1, 1970, 00:00:00 GMT) in
+ * Coordinated Universal Time (UTC).
+ * @exception AssertException If time could not be obtained
+ */
+long long int Time_micro(void);
+
+/**
+ * Returns the time of the monotonic clock in microseconds.
+ * @return A 64 bits long representing the systems notion of time [us]
+ * @exception AssertException If time could not be obtained
+ */
+long long int Time_mono_micro(void);
 
 /**
  * Returns the time since the epoch measured in microseconds.
diff -ru monit-5.15/libmonit/src/thread/Thread.h monit-5.15-new/libmonit/src/thread/Thread.h
--- monit-5.15/libmonit/src/thread/Thread.h	2015-10-22 14:44:32.000000000 +0100
+++ monit-5.15-new/libmonit/src/thread/Thread.h	2015-11-02 14:44:46.363461390 +0000
@@ -30,6 +30,7 @@
 #include <assert.h>
 #include <string.h>
 #include <pthread.h>
+#include <time.h>
 #include "system/System.h"
 
 
@@ -125,7 +126,13 @@
  * @exception AssertException If initialization failed
  * @hideinitializer
  */
-#define Sem_init(sem) wrapper(pthread_cond_init(&sem, NULL))
+#define Sem_init(sem) do { \
+        pthread_condattr_t attr; \
+        wrapper(pthread_condattr_init(&attr)); \
+        wrapper(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)); \
+        wrapper(pthread_cond_init(&sem, &attr)); \
+        wrapper(pthread_condattr_destroy(&attr)); \
+    } while (0)
 /**
  * Wait on a semaphore
  * @param sem The semaphore to wait on
@@ -160,7 +167,7 @@
  * the mutex is unlocked and reacquired afterwards
  * @param sem The semaphore to wait on
  * @param mutex A mutex to unlock on wait
- * @param time time to wait
+ * @param time time to wait (monotonic time, as set in Sem_init())
  * @exception AssertException If the timed wait failed
  * @hideinitializer
  */
diff -ru monit-5.15/src/monit.c monit-5.15-new/src/monit.c
--- monit-5.15/src/monit.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/monit.c	2015-11-02 14:45:51.915458334 +0000
@@ -522,7 +522,7 @@
                 atexit(file_finalize);
 
                 if (Run.startdelay) {
-                        time_t now = Time_now();
+                        time_t now = Time_mono();
                         time_t delay = now + Run.startdelay;
 
                         /* sleep can be interrupted by signal => make sure we paused long enough */
@@ -530,7 +530,7 @@
                                 sleep((unsigned int)(delay - now));
                                 if (Run.flags & Run_Stopped)
                                         do_exit();
-                                now = Time_now();
+                                now = Time_mono();
                         }
                 }
 
@@ -821,7 +821,7 @@
         {
                 while (! (Run.flags & Run_Stopped) && ! (Run.flags & Run_DoReload)) {
                         handle_mmonit(NULL);
-                        struct timespec wait = {.tv_sec = Time_now() + Run.polltime, .tv_nsec = 0};
+                        struct timespec wait = {.tv_sec = Time_mono() + Run.polltime, .tv_nsec = 0};
                         Sem_timeWait(heartbeatCond, heartbeatMutex, wait);
                 }
         }
diff -ru monit-5.15/src/net.c monit-5.15-new/src/net.c
--- monit-5.15/src/net.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/net.c	2015-11-03 18:08:58.306862987 +0000
@@ -385,7 +385,7 @@
                         break;
         }
         while (Net_canRead(socket, read_timeout) && ! (Run.flags & Run_Stopped)) {
-                long long stopped = Time_micro();
+                long long stopped = Time_mono_micro();
                 struct sockaddr_storage in_addr;
                 socklen_t addrlen = sizeof(in_addr);
                 do {
@@ -500,7 +500,7 @@
         _setPingOptions(s, addr);
         uint16_t id = getpid() & 0xFFFF;
         for (int retry = 1; retry <= maxretries; retry++) {
-                long long started = Time_micro();
+                long long started = Time_mono_micro();
                 if (_sendPing(hostname, s, addr, size, retry, maxretries, id, started) && (response = _receivePing(hostname, s, addr, retry, maxretries, id, started, timeout)) >= 0.)
                         break;
         }
diff -ru monit-5.15/src/process/process_common.c monit-5.15-new/src/process/process_common.c
--- monit-5.15/src/process/process_common.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/process/process_common.c	2015-11-02 20:31:01.782492998 +0000
@@ -119,7 +119,7 @@
 
 /**
  * Get the actual time as a floating point number
- * @return time in seconds
+ * @return time in [100ms]
  */
 double get_float_time(void) {
         struct timeval t;
@@ -128,6 +128,18 @@
         return (double) t.tv_sec * 10 + (double) t.tv_usec / 100000.0;
 }
 
+/**
+ * Get the monotonic time as a floating point number
+ * @return time in seconds
+ */
+double get_float_mono_time(void) {
+        struct timespec ts;
+
+		int ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+		ASSERT(!ret);
+
+        return (double) ts.tv_sec + (double) ts.tv_nsec / 1e9;
+}
 
 /**
  * Connects child and parent in a process tree
diff -ru monit-5.15/src/process/process_sysdep.h monit-5.15-new/src/process/process_sysdep.h
--- monit-5.15/src/process/process_sysdep.h	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/process/process_sysdep.h	2015-11-02 19:29:41.182664559 +0000
@@ -34,6 +34,7 @@
 boolean_t used_system_cpu_sysdep(SystemInfo_T *);
 
 double get_float_time(void);
+double get_float_mono_time(void);
 
 int    initprocesstree_sysdep(ProcessTree_T **);
 void   fillprocesstree(ProcessTree_T *, int);
diff -ru monit-5.15/src/process/sysdep_LINUX.c monit-5.15-new/src/process/sysdep_LINUX.c
--- monit-5.15/src/process/sysdep_LINUX.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/process/sysdep_LINUX.c	2015-11-02 19:19:41.230692525 +0000
@@ -282,13 +282,13 @@
                                 buf[j] = ' ';
 
                 /* Set the data in ptree only if all process related reads succeeded (prevent partial data in the case that continue was called during data gathering) */
-                pt[i].time = get_float_time();
+                pt[i].time = get_float_mono_time();
                 pt[i].pid = stat_pid;
                 pt[i].ppid = stat_ppid;
                 pt[i].uid = stat_uid;
                 pt[i].euid = stat_euid;
                 pt[i].gid = stat_gid;
-                pt[i].starttime = get_starttime() + (time_t)(stat_item_starttime / HZ);
+                pt[i].starttime = (time_t)(stat_item_starttime / HZ);
                 pt[i].cmdline = Str_dup(*buf ? buf : procname);
                 pt[i].cputime = ((float)(stat_item_utime + stat_item_stime) * 10.0) / HZ; // jiffies -> seconds = 1 / HZ. HZ is defined in "asm/param.h" and it is usually 1/100s but on alpha system it is 1/1024s
                 pt[i].cpu_percent = 0;
diff -ru monit-5.15/src/process.c monit-5.15-new/src/process.c
--- monit-5.15/src/process.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/process.c	2015-11-02 18:41:22.682799665 +0000
@@ -114,7 +114,7 @@
                 s->inf->priv.process.uid               = pt[leaf].uid;
                 s->inf->priv.process.euid              = pt[leaf].euid;
                 s->inf->priv.process.gid               = pt[leaf].gid;
-                s->inf->priv.process.uptime            = Time_now() - pt[leaf].starttime;
+                s->inf->priv.process.uptime            = Time_mono() - pt[leaf].starttime;
                 s->inf->priv.process.children          = pt[leaf].children_sum;
                 s->inf->priv.process.mem_kbyte         = pt[leaf].mem_kbyte;
                 s->inf->priv.process.zombie            = pt[leaf].zombie;
@@ -315,7 +315,7 @@
 time_t getProcessUptime(pid_t pid, ProcessTree_T *pt, int treesize) {
         if (pt) {
                 int leaf = findprocess(pid, pt, treesize);
-                return (time_t)((leaf >= 0 && leaf < treesize) ? Time_now() - pt[leaf].starttime : -1);
+                return (time_t)((leaf >= 0 && leaf < treesize) ? Time_mono() - pt[leaf].starttime : -1);
         } else {
                 return 0;
         }
diff -ru monit-5.15/src/socket.c monit-5.15-new/src/socket.c
--- monit-5.15/src/socket.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/socket.c	2015-11-02 18:11:23.710883520 +0000
@@ -580,7 +580,7 @@
         Port_T p = P;
         TRY
         {
-                long long start = Time_milli();
+                long long start = Time_mono_milli();
                 switch (p->family) {
                         case Socket_Unix:
                                 _testUnix(p);
@@ -595,7 +595,7 @@
                                 break;
                 }
                 p->is_available = true;
-                p->response = (Time_milli() - start) / 1000.;
+                p->response = (Time_mono_milli() - start) / 1000.;
         }
         ELSE
         {
diff -ru monit-5.15/src/ssl/Ssl.c monit-5.15-new/src/ssl/Ssl.c
--- monit-5.15/src/ssl/Ssl.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/ssl/Ssl.c	2015-11-02 18:09:18.614889351 +0000
@@ -160,9 +160,9 @@
 
 
 static boolean_t _retry(int socket, int *timeout, int (*callback)(int socket, time_t milliseconds)) {
-        long long start = Time_milli();
+        long long start = Time_mono_milli();
         if (callback(socket, *timeout)) {
-                long long stop = Time_milli();
+                long long stop = Time_mono_milli();
                 if (stop >= start && (*timeout -= stop - start) > 0) // Reduce timeout with guard against backward clock jumps
                         return true;
         }
diff -ru monit-5.15/src/validate.c monit-5.15-new/src/validate.c
--- monit-5.15/src/validate.c	2015-10-22 14:44:25.000000000 +0100
+++ monit-5.15-new/src/validate.c	2015-11-04 14:18:06.923481323 +0000
@@ -584,7 +584,7 @@
         ASSERT(s);
         State_Type rv = State_Succeeded;
         if (s->timestamplist) {
-                time_t now = Time_now();
+                time_t now = Time_now();  // Time_now() because time stamps are not recorded in monotonic ticks
                 for (Timestamp_T t = s->timestamplist; t; t = t->next) {
                         if (t->test_changes) {
                                 /* if we are testing for changes only, the value is variable */
@@ -959,7 +959,7 @@
  */
 static boolean_t _checkSkip(Service_T s) {
         ASSERT(s);
-        time_t now = Time_now();
+        time_t now = Time_now();   // using Time_now() instead of Time_mono() because there is no monotonic cron tab entry anyway
         if (s->every.type == Every_SkipCycles) {
                 s->every.spec.cycle.counter++;
                 if (s->every.spec.cycle.counter < s->every.spec.cycle.number) {
@@ -1281,7 +1281,7 @@
         ASSERT(s);
         ASSERT(s->program);
         State_Type rv = State_Succeeded;
-        time_t now = Time_now();
+        time_t now = Time_now();  // used by cervlet.c to show when to programme was started -> ok to be non-monotonic
         Process_T P = s->program->P;
         if (P) {
                 if (Process_exitStatus(P) < 0) { // Program is still running
