diff --git a/synapse/federation/replication.py b/synapse/federation/replication.py
index 1b9e3ece092d17f46adec18189a3a434c429e3ca..88184caecd17f1313e0c5cc7423b3810f7292b80 100644
--- a/synapse/federation/replication.py
+++ b/synapse/federation/replication.py
@@ -864,6 +864,9 @@ class _TransactionQueue(object):
 
             for deferred in deferreds:
                 if code == 200:
+                    if retry_last_ts:
+                        # this host is alive! reset retry schedule
+                        self.store.set_destination_retry_timings(destination, 0, 0)
                     deferred.callback(None)
                 else:
                     self.start_retrying(destination, retry_interval)
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 925eb5376e2019be04b9e0c914e70d34595b76c7..7a79e2d1175f10dd62c0873098010add35c73ac0 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -207,6 +207,12 @@ class FederationHandler(BaseHandler):
                 e.msg,
                 affected=event.event_id,
             )
+            
+        # if we're receiving valid events from an origin,
+        # it's probably a good idea to mark it as not in retry-state
+        # for sending (although this is a bit of a leap)
+        if ((self.store.get_destination_retry_timings(origin))[0]):
+            self.store.set_destination_retry_timings(origin, 0, 0)
 
         room = yield self.store.get_room(event.room_id)