diff --git a/libev/ev.c b/libev/ev.c
index 4187b18..57e6037 100644
--- a/libev/ev.c
+++ b/libev/ev.c
@@ -2382,6 +2382,21 @@ time_update (EV_P_ ev_tstamp max_block)
     }
 }
 
+static void _ev_timer_start (EV_P_ ev_timer *w);
+
+static void
+start_deferred_timers (EV_P)
+{
+    ev_timer *w, *next;
+    for (w=deferred_timers; w; w=next) {
+        _ev_timer_start(EV_A_ w);
+        next = w->next;
+        w->deferred = 0;
+        w->next = NULL;
+    }
+    deferred_timers = NULL;
+}
+
 void
 ev_run (EV_P_ int flags)
 {
@@ -2499,6 +2514,9 @@ ev_run (EV_P_ int flags)
         time_update (EV_A_ waittime + sleeptime);
       }
 
+      /* using the refreshed time, start all requested timers */
+      start_deferred_timers(EV_A);
+
       /* queue pending timers and reschedule them */
       timers_reify (EV_A); /* relative timers called last */
 #if EV_PERIODIC_ENABLE
@@ -2699,6 +2717,21 @@ ev_io_stop (EV_P_ ev_io *w)
 void noinline
 ev_timer_start (EV_P_ ev_timer *w)
 {
+    /* add the timer to a linked list to be started at the end of the
+     * loop
+     */
+    if (w->deferred) {
+        /* already in the list */
+        return;
+    }
+    w->next = deferred_timers;
+    deferred_timers = w;
+    w->deferred = 1;
+}
+
+static void noinline
+_ev_timer_start (EV_P_ ev_timer *w)
+{
   if (expect_false (ev_is_active (w)))
     return;
 
@@ -2723,6 +2756,23 @@ ev_timer_start (EV_P_ ev_timer *w)
 void noinline
 ev_timer_stop (EV_P_ ev_timer *w)
 {
+  if (w->deferred) {
+    /* remove the timer from the deferred list if it's there */
+    if (deferred_timers == w) {
+        deferred_timers = deferred_timers->next;
+    } else {
+        ev_timer *wl;
+        for (wl=deferred_timers; wl; wl=wl->next) {
+            if (wl->next == w) {
+                wl->next = wl->next->next;
+				break;
+            }
+        }
+    }
+    w->deferred = 0;
+    w->next = NULL;
+  }
+
   clear_pending (EV_A_ (W)w);
   if (expect_false (!ev_is_active (w)))
     return;
diff --git a/libev/ev.h b/libev/ev.h
index 27c1778..fa5a57c 100644
--- a/libev/ev.h
+++ b/libev/ev.h
@@ -311,6 +311,11 @@ typedef struct ev_timer
   EV_WATCHER_TIME (ev_timer)
 
   ev_tstamp repeat; /* rw */
+  /* all timers need to be listable, since we're deferring ev_timer_start 
+   * so we can do a batch start on the timers
+   */
+  int deferred;
+  struct ev_timer *next;
 } ev_timer;
 
 /* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */
diff --git a/libev/ev_vars.h b/libev/ev_vars.h
index 5ee3ed1..f830bae 100644
--- a/libev/ev_vars.h
+++ b/libev/ev_vars.h
@@ -199,5 +199,7 @@ VAR (acquire_cb, void (*acquire_cb)(EV_P))
 VAR (invoke_cb , void (*invoke_cb) (EV_P))
 #endif
 
+VARx(ev_timer *, deferred_timers)
+
 #undef VARx
 
diff --git a/libev/ev_wrap.h b/libev/ev_wrap.h
index 2c195c5..49358d6 100644
--- a/libev/ev_wrap.h
+++ b/libev/ev_wrap.h
@@ -96,6 +96,7 @@
 #define release_cb ((loop)->release_cb)
 #define acquire_cb ((loop)->acquire_cb)
 #define invoke_cb ((loop)->invoke_cb)
+#define deferred_timers ((loop)->deferred_timers)
 #else
 #undef EV_WRAP_H
 #undef now_floor
@@ -193,4 +194,5 @@
 #undef release_cb
 #undef acquire_cb
 #undef invoke_cb
+#undef deferred_timers
 #endif
