diff --git a/simplenews_scheduler.module b/simplenews_scheduler.module
index 7d35950..a12b99e 100644
--- a/simplenews_scheduler.module
+++ b/simplenews_scheduler.module
@@ -234,10 +238,18 @@ function simplenews_scheduler_cron() {
     $result = db_query("SELECT * FROM {simplenews_scheduler} WHERE %d - last_run > %d AND `sched_interval` = '%s' AND %d < sched_stop_date", $now_time, $seconds, $interval, $now_time);
     while ($row = db_fetch_array($result) ) {
       // if returns with null don't do anything
+      $first_run = intval($row['sched_start']);
+      // because the scheduler runs according to last_run timestamp and the cron
+      // does not run exactly at the scheduled timestamp, this correction fixes
+      // this run's timestamp ($now_time) to the right time by adding a
+      // correct interval.
+      $this_run = $first_run + floor( ($now_time - $first_run) / $seconds ) * $seconds;
+
+      // create a new edition
       $nid = simplenews_scheduler_new_edition($row["snid"]);
       if (isset($nid)) {
-        db_query("UPDATE {simplenews_scheduler} SET last_run = %d WHERE sid = %d", gmmktime(), $row["sid"]);
-        db_query("INSERT INTO {simplenews_scheduler_editions} (snid, edition_snid, date_issued) VALUES (%d, %d, %d)", $row["snid"], $nid, gmmktime());
+        db_query("UPDATE {simplenews_scheduler} SET last_run = %d WHERE sid = %d", $this_run, $row["sid"]);
+        db_query("INSERT INTO {simplenews_scheduler_editions} (snid, edition_snid, date_issued) VALUES (%d, %d, %d)", $row["snid"], $nid, $now_time);
         $node = node_load($nid);
         simplenews_send_node($node);
       }
