diff --git a/src/dht.cpp b/src/dht.cpp
index fadb695f5da0a0b4c2d2c91a54b7824dd6054586..bc4edf7a919a9514c28ffcfa0492c7ea1052b22b 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -1407,7 +1407,7 @@ Dht::announce(const InfoHash& id, sa_family_t af, std::shared_ptr<Value> value,
         return a.value->id == value->id;
     });
     if (a_sr == sr->announce.end())
-        sr->announce.emplace_back(Announce {value, created, callback});
+        sr->announce.emplace_back(Announce {value, std::min(now, created), callback});
     else {
         if (a_sr->value != value) {
             a_sr->value = value;
@@ -2529,12 +2529,15 @@ Dht::processMessage(const uint8_t *buf, size_t buflen, const sockaddr *from, soc
                 auto a_to_remove = std::remove_if(sr->announce.begin(), sr->announce.end(), [&](Announce &a) {
                     if (!a.value || a.value->id != msg.value_id)
                         return false;
-                    if (sr->isAnnounced(msg.value_id, getType(a.value->type), now)) {
+                    auto type = getType(a.value->type);
+                    if (sr->isAnnounced(msg.value_id, type, now)) {
                         if (a.callback) {
                             a.callback(true, sr->getNodes());
                             a.callback = nullptr;
                         }
-                        return true;
+                        if (a.created + type.expiration < now) {
+                            return true;
+                        }
                     }
                     return false;
                 });