diff --git a/src/data_transfer.cpp b/src/data_transfer.cpp
index b8475555cc7fc07637360e6fe09083e3ad0d9b5e..f3c5221d5adb2dfe93bb0fd6e2cf2e658e7011e5 100644
--- a/src/data_transfer.cpp
+++ b/src/data_transfer.cpp
@@ -467,10 +467,10 @@ SubOutgoingFileTransfer::emit(DRing::DataTransferEventCode code) const
     if (code == DRing::DataTransferEventCode::wait_peer_acceptance) {
         if (timeoutTask_)
             timeoutTask_->cancel();
-        timeoutTask_ = Manager::instance().scheduleTask([this]() {
+        timeoutTask_ = Manager::instance().scheduleTaskIn([this]() {
             JAMI_WARN() << "FTP#" << getId() << ": timeout. Cancel";
             closeAndEmit(DRing::DataTransferEventCode::timeout_expired);
-        }, std::chrono::steady_clock::now() + std::chrono::minutes(10));
+        }, std::chrono::minutes(10));
     } else if (timeoutTask_) {
         timeoutTask_->cancel();
         timeoutTask_.reset();
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index 944c5eed028992e4b6d18154580ee01e6b138177..c9169b5cdce3cb9578c0575bde19ee7c0404b606 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -2457,12 +2457,11 @@ JamiAccount::replyToIncomingIceMsg(const std::shared_ptr<SIPCall>& call,
                                           /*.from_account = */ from_id,
                                           /*.from_cert = */ from_cert});
 
-    Manager::instance().scheduleTask(
+    Manager::instance().scheduleTaskIn(
         [w = weak(), callId = call->getCallId()]() {
             if (auto shared = w.lock())
                 shared->checkPendingCall(callId);
-        },
-        std::chrono::steady_clock::now() + ICE_NEGOTIATION_TIMEOUT);
+        }, ICE_NEGOTIATION_TIMEOUT);
 }
 
 void
@@ -3220,7 +3219,7 @@ JamiAccount::sendTextMessage(const std::string& to,
         });
 
     // Timeout cleanup
-    Manager::instance().scheduleTask(
+    Manager::instance().scheduleTaskIn(
         [w = weak(), confirm, to, token]() {
             std::unique_lock<std::mutex> l(confirm->lock);
             if (not confirm->replied) {
@@ -3235,8 +3234,7 @@ JamiAccount::sendTextMessage(const std::string& to,
                     this_->messageEngine_.onMessageSent(to, token, false);
                 }
             }
-        },
-        std::chrono::steady_clock::now() + std::chrono::minutes(1));
+        }, std::chrono::minutes(1));
 }
 
 void
diff --git a/src/manager.cpp b/src/manager.cpp
index 2f1520bf2e345f4537658982295ebaf53199b8d6..413cd370377d9e10b834a16fbfd1cecb440cb9c6 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1683,6 +1683,12 @@ Manager::scheduleTask(std::function<void()>&& task, std::chrono::steady_clock::t
     return pimpl_->scheduler_.schedule(std::move(task), when);
 }
 
+std::shared_ptr<Task> Manager::scheduleTaskIn(std::function<void()>&& task,
+                                std::chrono::steady_clock::duration timeout)
+{
+    return pimpl_->scheduler_.scheduleIn(std::move(task), timeout);
+}
+
 // Must be invoked periodically by a timer from the main event loop
 void
 Manager::pollEvents()
diff --git a/src/manager.h b/src/manager.h
index 741673dc4a18746e341651d230b3bc914af64045..db7420e28bd3802b606d83f8068bd9dac188c50e 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -893,6 +893,8 @@ public:
     void addTask(std::function<bool()>&& task);
     std::shared_ptr<Task> scheduleTask(std::function<void()>&& task,
                                        std::chrono::steady_clock::time_point when);
+    std::shared_ptr<Task> scheduleTaskIn(std::function<void()>&& task,
+                                       std::chrono::steady_clock::duration timeout);
 
     std::map<std::string, std::string> getNearbyPeers(const std::string& accountID);