diff --git a/include/opendht/scheduler.h b/include/opendht/scheduler.h
index 6959cb34efa4dcdff2668c2836217da9543201b5..a79ad1e6c111272d13c2ae6807dc6f1c0171b948 100644
--- a/include/opendht/scheduler.h
+++ b/include/opendht/scheduler.h
@@ -39,6 +39,7 @@ public:
     struct Job {
         bool done;
         bool cancelled;
+		time_point time;
         std::function<void()> do_;
     };
 
@@ -51,8 +52,10 @@ public:
      * @return pointer to the newly scheduled job.
      */
     std::shared_ptr<Scheduler::Job> add(time_point time, std::function<void()> job_func) {
-        auto job = std::make_shared<Job>(Job {false, false, std::move(job_func)});
-        timers.emplace(std::move(time), job);
+		auto scheduled_time = std::max(time, now); /* This should prevent running an auto rescheduling job forever
+													  before the Scheduler::run method ends. */
+        auto job = std::make_shared<Job>(Job {false, false, scheduled_time, std::move(job_func)});
+        timers.emplace(std::move(scheduled_time), job);
         return job;
     }
 
@@ -80,7 +83,12 @@ public:
         syncTime();
         while (not timers.empty()) {
             auto timer = timers.begin();
-            if (timer->first > now)
+			/*
+			 * Running jobs scheduled before "now" prevents run+rescheduling
+			 * loops before this method ends. It is garanteed by the fact that a
+			 * job will at least be scheduled for "now" and not before.
+			 */
+			if (not (timer->first < now))
                 break;
 
             auto& job = timer->second;
diff --git a/src/dht.cpp b/src/dht.cpp
index 98197f7152e4c4d873bf810b532747871c1d8a3d..5df3bc3ac1d060d303ac2896b88708b38b649481 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -970,6 +970,9 @@ Dht::searchStep(std::shared_ptr<Search> sr)
             }
         }
     }
+
+    /* periodic searchStep scheduling. */
+    sr->nextSearchStep = scheduler.edit(sr->nextSearchStep, sr->getNextStepTime(types, now));
 }