diff --git a/synapse/federation/federation_base.py b/synapse/federation/federation_base.py
index 671ca1a7ec..ca3c283f45 100644
--- a/synapse/federation/federation_base.py
+++ b/synapse/federation/federation_base.py
@@ -79,16 +79,16 @@ class FederationBase(object):
                     allow_none=True,
                 )
 
-            if not res and pdu.origin != origin:
-                try:
-                    res = yield self.get_pdu(
-                        destinations=[pdu.origin],
-                        event_id=pdu.event_id,
-                        outlier=outlier,
-                        timeout=10000,
-                    )
-                except SynapseError:
-                    pass
+            # if not res and pdu.origin != origin:
+            #     try:
+            #         res = yield self.get_pdu(
+            #             destinations=[pdu.origin],
+            #             event_id=pdu.event_id,
+            #             outlier=outlier,
+            #             timeout=10000,
+            #         )
+            #     except SynapseError:
+            #         pass
 
             if not res:
                 logger.warn(
diff --git a/synapse/federation/transaction_queue.py b/synapse/federation/transaction_queue.py
index f375034d5a..3854602bfd 100644
--- a/synapse/federation/transaction_queue.py
+++ b/synapse/federation/transaction_queue.py
@@ -177,7 +177,7 @@ class TransactionQueue(object):
 
                 @defer.inlineCallbacks
                 def handle_event(event):
-                    should_relay = yield self._should_relay(event)
+                    should_relay = yield self._should_relay(event, False)
                     logger.info("Should relay event %s: %s", event.event_id, should_relay)
                     if not should_relay:
                         return
@@ -249,6 +249,20 @@ class TransactionQueue(object):
         finally:
             self._is_processing = False
 
+    @defer.inlineCallbacks
+    def received_new_event(self, origin, event):
+        should_relay = yield self._should_relay(event, True)
+        logger.info("Should relay event %s: %s", event.event_id, should_relay)
+        if not should_relay:
+            return
+
+        destinations = event.unsigned.get("destinations")
+        destinations = set(destinations)
+
+        logger.debug("Sending %s to %r", event, destinations)
+
+        yield self._send_pdu(event, destinations)
+
     @defer.inlineCallbacks
     def _send_pdu(self, pdu, destinations, span=None):
         # We loop through all destinations to see whether we already have
@@ -352,12 +366,18 @@ class TransactionQueue(object):
 
         return joined_hosts
 
-    def _should_relay(self, event):
+    def _should_relay(self, event, from_federation):
         """Whether we should consider relaying this event.
         """
 
         # XXX: Hook for routing shenanigans
 
+<<<<<<< HEAD
+=======
+        if from_federation and event.unsigned.get("destinations"):
+            return True
+
+>>>>>>> efdec3252... Only relay 'live' events
         send_on_behalf_of = event.internal_metadata.get_send_on_behalf_of()
         is_mine = self.is_mine_id(event.event_id)
         if not is_mine and send_on_behalf_of is None:
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 5053038d02..9350ff989d 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -48,6 +48,7 @@ from synapse.crypto.event_signing import (
     add_hashes_and_signatures,
     compute_event_signature,
 )
+from synapse.events import FrozenEvent
 from synapse.events.validator import EventValidator
 from synapse.replication.http.federation import (
     ReplicationCleanRoomRestServlet,
@@ -111,6 +112,7 @@ class FederationHandler(BaseHandler):
 
         self.store = hs.get_datastore()  # type: synapse.storage.DataStore
         self.federation_client = hs.get_federation_client()
+        self.federation_sender = hs.get_federation_sender()
         self.state_handler = hs.get_state_handler()
         self.server_name = hs.hostname
         self.keyring = hs.get_keyring()
@@ -435,6 +437,10 @@ class FederationHandler(BaseHandler):
 
         logger.info("Thread ID %r", thread_id)
 
+        # Remove destinations field before persisting
+        event_copy = FrozenEvent.from_event(pdu)
+        pdu.unsigned.pop("destinations", None)
+
         yield self._process_received_pdu(
             origin,
             pdu,
@@ -443,6 +449,9 @@ class FederationHandler(BaseHandler):
             thread_id=thread_id,
         )
 
+        if sent_to_us_directly:
+            yield self.federation_sender.received_new_event(origin, event_copy)
+
         if new_thread:
             builder = self.event_builder_factory.new({
                 "type": "org.matrix.new_thread",
diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index 187ca45ac9..118e33140e 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -590,6 +590,7 @@ class EventsStore(StateGroupWorkerStore, EventFederationStore, EventsWorkerStore
                 prev_event_id IN (%s)
                 AND NOT events.outlier
                 AND rejections.event_id IS NULL
+                AND NOT events.internal_event
             """ % (
                 ",".join("?" for _ in batch),
             )
@@ -1290,6 +1291,7 @@ class EventsStore(StateGroupWorkerStore, EventFederationStore, EventsWorkerStore
                         and isinstance(event.content["url"], text_type)
                     ),
                     "thread_id": ctx.thread_id,
+                    "internal_event": event.internal_metadata.is_internal_event(),
                 }
                 for event, ctx in events_and_contexts
             ],