diff --git a/Cargo.lock b/Cargo.lock
index c9bce96a..3c9de4ea 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -272,9 +272,9 @@ dependencies = [
 
 [[package]]
 name = "const-oid"
-version = "0.5.2"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "279bc8fc53f788a75c7804af68237d1fce02cde1e275a886a4b320604dc2aeda"
+checksum = "44c32f031ea41b4291d695026c023b95d59db2d8a2c7640800ed56bc8f510f22"
 
 [[package]]
 name = "const_fn"
@@ -394,9 +394,9 @@ dependencies = [
 
 [[package]]
 name = "der"
-version = "0.3.5"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eeb9d92785d1facb50567852ce75d0858630630e7eabea59cf7eb7474051087"
+checksum = "49f215f706081a44cb702c71c39a52c05da637822e9c1645a50b7202689e982d"
 dependencies = [
  "const-oid",
 ]
@@ -1475,9 +1475,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 [[package]]
 name = "pkcs8"
-version = "0.6.1"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9c2f795bc591cb3384cb64082a578b89207ac92bb89c9d98c1ea2ace7cd8110"
+checksum = "09d156817ae0125e8aa5067710b0db24f0984830614f99875a70aa5e3b74db69"
 dependencies = [
  "der",
  "spki",
@@ -1882,8 +1882,8 @@ dependencies = [
 
 [[package]]
 name = "ruma"
-version = "0.1.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.2.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "assign",
  "js_int",
@@ -1903,8 +1903,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-api"
-version = "0.17.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.17.1"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "bytes",
  "http",
@@ -1919,8 +1919,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-api-macros"
-version = "0.17.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.17.1"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -1930,8 +1930,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-appservice-api"
-version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.3.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "ruma-api",
  "ruma-common",
@@ -1944,8 +1944,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-client-api"
-version = "0.10.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.11.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "assign",
  "bytes",
@@ -1964,8 +1964,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-common"
-version = "0.5.3"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.5.4"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "indexmap",
  "js_int",
@@ -1979,8 +1979,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-events"
-version = "0.22.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.23.2"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "indoc",
  "js_int",
@@ -1994,8 +1994,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-events-macros"
-version = "0.22.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.23.2"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -2005,8 +2005,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-federation-api"
-version = "0.1.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.2.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -2020,8 +2020,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-identifiers"
-version = "0.19.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.19.4"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "paste",
  "rand 0.8.3",
@@ -2034,8 +2034,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-identifiers-macros"
-version = "0.19.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.19.4"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "quote",
  "ruma-identifiers-validation",
@@ -2045,12 +2045,12 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-validation"
 version = "0.4.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 
 [[package]]
 name = "ruma-identity-service-api"
-version = "0.1.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.2.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -2062,8 +2062,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-push-gateway-api"
-version = "0.1.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.2.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -2077,8 +2077,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-serde"
-version = "0.4.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.4.1"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "bytes",
  "form_urlencoded",
@@ -2091,8 +2091,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-serde-macros"
-version = "0.4.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.4.1"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -2102,8 +2102,8 @@ dependencies = [
 
 [[package]]
 name = "ruma-signatures"
-version = "0.7.2"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.8.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "base64 0.13.0",
  "ed25519-dalek",
@@ -2115,13 +2115,12 @@ dependencies = [
  "sha2",
  "thiserror",
  "tracing",
- "untrusted",
 ]
 
 [[package]]
 name = "ruma-state-res"
-version = "0.1.0"
-source = "git+https://github.com/ruma/ruma?rev=5a7e2cddcf257e367465cced51442c91e8f557c9#5a7e2cddcf257e367465cced51442c91e8f557c9"
+version = "0.2.0"
+source = "git+https://github.com/DevinR528/ruma?branch=state-closure#95208b9d03876e7c85543fe8655ceb2f7dc76363"
 dependencies = [
  "itertools 0.10.0",
  "js_int",
@@ -2130,7 +2129,6 @@ dependencies = [
  "ruma-events",
  "ruma-identifiers",
  "ruma-serde",
- "ruma-signatures",
  "serde",
  "serde_json",
  "thiserror",
@@ -2444,9 +2442,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
 
 [[package]]
 name = "spki"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9dae7e047abc519c96350e9484a96c6bf1492348af912fd3446dd2dc323f6268"
+checksum = "987637c5ae6b3121aba9d513f869bd2bff11c4cc086c22473befd6649c0bd521"
 dependencies = [
  "der",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index bb449187..c9a81432 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,7 +8,6 @@ repository = "https://gitlab.com/famedly/conduit"
 readme = "README.md"
 version = "0.1.0"
 edition = "2018"
-rust = "1.50"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
@@ -18,7 +17,8 @@ rust = "1.50"
 rocket = { git = "https://github.com/SergioBenitez/Rocket.git", rev = "801e04bd5369eb39e126c75f6d11e1e9597304d8", features = ["tls"] } # Used to handle requests
 
 # Used for matrix spec type definitions and helpers
-ruma = { git = "https://github.com/ruma/ruma", rev = "5a7e2cddcf257e367465cced51442c91e8f557c9", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
+#ruma = { git = "https://github.com/ruma/ruma", rev = "5a7e2cddcf257e367465cced51442c91e8f557c9", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
+ruma = { git = "https://github.com/DevinR528/ruma", branch = "state-closure", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
 #ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
 
 # Used for long polling and federation sender, should be the same as rocket::tokio
diff --git a/rust-toolchain b/rust-toolchain
index 5a5c7211..ba0a7191 100644
--- a/rust-toolchain
+++ b/rust-toolchain
@@ -1 +1 @@
-1.50.0
+1.51.0
diff --git a/src/client_server/membership.rs b/src/client_server/membership.rs
index 87fead2f..5c57b68a 100644
--- a/src/client_server/membership.rs
+++ b/src/client_server/membership.rs
@@ -25,7 +25,7 @@ use ruma::{
         EventType,
     },
     serde::{to_canonical_value, CanonicalJsonObject, CanonicalJsonValue, Raw},
-    state_res::{self, EventMap, RoomVersion},
+    state_res::{self, RoomVersion},
     uint, EventId, RoomId, RoomVersionId, ServerName, UserId,
 };
 use std::{
@@ -883,7 +883,6 @@ pub async fn invite_helper(
             .await?;
 
         let pub_key_map = RwLock::new(BTreeMap::new());
-        let mut auth_cache = EventMap::new();
 
         // We do not add the event_id field to the pdu here because of signature and hashes checks
         let (event_id, value) = match crate::pdu::gen_event_id_canonical_json(&response.event) {
@@ -906,26 +905,19 @@ pub async fn invite_helper(
         )
         .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Origin field is invalid."))?;
 
-        let pdu_id = server_server::handle_incoming_pdu(
-            &origin,
-            &event_id,
-            value,
-            true,
-            &db,
-            &pub_key_map,
-            &mut auth_cache,
-        )
-        .await
-        .map_err(|_| {
-            Error::BadRequest(
-                ErrorKind::InvalidParam,
-                "Error while handling incoming PDU.",
-            )
-        })?
-        .ok_or(Error::BadRequest(
-            ErrorKind::InvalidParam,
-            "Could not accept incoming PDU as timeline event.",
-        ))?;
+        let pdu_id =
+            server_server::handle_incoming_pdu(&origin, &event_id, value, true, &db, &pub_key_map)
+                .await
+                .map_err(|_| {
+                    Error::BadRequest(
+                        ErrorKind::InvalidParam,
+                        "Error while handling incoming PDU.",
+                    )
+                })?
+                .ok_or(Error::BadRequest(
+                    ErrorKind::InvalidParam,
+                    "Could not accept incoming PDU as timeline event.",
+                ))?;
 
         for server in db
             .rooms
diff --git a/src/database/abstraction.rs b/src/database/abstraction.rs
index bf292eb6..f81c9def 100644
--- a/src/database/abstraction.rs
+++ b/src/database/abstraction.rs
@@ -65,7 +65,7 @@ impl DatabaseEngine for SledEngine {
             sled::Config::default()
                 .path(&config.database_path)
                 .cache_capacity(config.cache_capacity as u64)
-                .use_compression(false)
+                .use_compression(true)
                 .open()?,
         )))
     }
diff --git a/src/server_server.rs b/src/server_server.rs
index a9d8b8ce..fa917587 100644
--- a/src/server_server.rs
+++ b/src/server_server.rs
@@ -45,7 +45,7 @@ use ruma::{
     receipt::ReceiptType,
     serde::Raw,
     signatures::{CanonicalJsonObject, CanonicalJsonValue},
-    state_res::{self, Event, EventMap, RoomVersion, StateMap},
+    state_res::{self, Event, RoomVersion, StateMap},
     to_device::DeviceIdOrAllDevices,
     uint, EventId, MilliSecondsSinceUnixEpoch, RoomId, RoomVersionId, ServerName,
     ServerSigningKeyId, UserId,
@@ -612,7 +612,7 @@ pub async fn send_transaction_message_route(
     // TODO: This could potentially also be some sort of trie (suffix tree) like structure so
     // that once an auth event is known it would know (using indexes maybe) all of the auth
     // events that it references.
-    let mut auth_cache = EventMap::new();
+    // let mut auth_cache = EventMap::new();
 
     for pdu in &body.pdus {
         // We do not add the event_id field to the pdu here because of signature and hashes checks
@@ -627,17 +627,9 @@ pub async fn send_transaction_message_route(
         let start_time = Instant::now();
         resolved_map.insert(
             event_id.clone(),
-            handle_incoming_pdu(
-                &body.origin,
-                &event_id,
-                value,
-                true,
-                &db,
-                &pub_key_map,
-                &mut auth_cache,
-            )
-            .await
-            .map(|_| ()),
+            handle_incoming_pdu(&body.origin, &event_id, value, true, &db, &pub_key_map)
+                .await
+                .map(|_| ()),
         );
 
         let elapsed = start_time.elapsed();
@@ -820,7 +812,6 @@ pub fn handle_incoming_pdu<'a>(
     is_timeline_event: bool,
     db: &'a Database,
     pub_key_map: &'a RwLock<BTreeMap<String, BTreeMap<String, String>>>,
-    auth_cache: &'a mut EventMap<Arc<PduEvent>>,
 ) -> AsyncRecursiveResult<'a, Option<Vec<u8>>, String> {
     Box::pin(async move {
         // TODO: For RoomVersion6 we must check that Raw<..> is canonical do we anywhere?: https://matrix.org/docs/spec/rooms/v6#canonical-json
@@ -908,15 +899,9 @@ pub fn handle_incoming_pdu<'a>(
         // 5. Reject "due to auth events" if can't get all the auth events or some of the auth events are also rejected "due to auth events"
         // EDIT: Step 5 is not applied anymore because it failed too often
         debug!("Fetching auth events for {}", incoming_pdu.event_id);
-        fetch_and_handle_events(
-            db,
-            origin,
-            &incoming_pdu.auth_events,
-            pub_key_map,
-            auth_cache,
-        )
-        .await
-        .map_err(|e| e.to_string())?;
+        fetch_and_handle_events(db, origin, &incoming_pdu.auth_events, pub_key_map)
+            .await
+            .map_err(|e| e.to_string())?;
 
         // 6. Reject "due to auth events" if the event doesn't pass auth based on the auth events
         debug!(
@@ -927,9 +912,13 @@ pub fn handle_incoming_pdu<'a>(
         // Build map of auth events
         let mut auth_events = BTreeMap::new();
         for id in &incoming_pdu.auth_events {
-            let auth_event = auth_cache.get(id).ok_or_else(|| {
-                "Auth event not found, event failed recursive auth checks.".to_string()
-            })?;
+            let auth_event = db
+                .rooms
+                .get_pdu(id)
+                .map_err(|e| e.to_string())?
+                .ok_or_else(|| {
+                    "Auth event not found, event failed recursive auth checks.".to_string()
+                })?;
 
             match auth_events.entry((
                 auth_event.kind.clone(),
@@ -963,9 +952,9 @@ pub fn handle_incoming_pdu<'a>(
         let previous_create = if incoming_pdu.auth_events.len() == 1
             && incoming_pdu.prev_events == incoming_pdu.auth_events
         {
-            auth_cache
-                .get(&incoming_pdu.auth_events[0])
-                .cloned()
+            db.rooms
+                .get_pdu(&incoming_pdu.auth_events[0])
+                .map_err(|e| e.to_string())?
                 .filter(|maybe_create| **maybe_create == *create_event)
         } else {
             None
@@ -1008,7 +997,6 @@ pub fn handle_incoming_pdu<'a>(
 
         debug!("Requesting state at event.");
         let mut state_at_incoming_event = None;
-        let mut incoming_auth_events = Vec::new();
 
         if incoming_pdu.prev_events.len() == 1 {
             let prev_event = &incoming_pdu.prev_events[0];
@@ -1031,7 +1019,7 @@ pub fn handle_incoming_pdu<'a>(
                     state_vec.push(prev_event.clone());
                 }
                 state_at_incoming_event = Some(
-                    fetch_and_handle_events(db, origin, &state_vec, pub_key_map, auth_cache)
+                    fetch_and_handle_events(db, origin, &state_vec, pub_key_map)
                         .await
                         .map_err(|_| "Failed to fetch state events locally".to_owned())?
                         .into_iter()
@@ -1069,18 +1057,12 @@ pub fn handle_incoming_pdu<'a>(
             {
                 Ok(res) => {
                     debug!("Fetching state events at event.");
-                    let state_vec = match fetch_and_handle_events(
-                        &db,
-                        origin,
-                        &res.pdu_ids,
-                        pub_key_map,
-                        auth_cache,
-                    )
-                    .await
-                    {
-                        Ok(state) => state,
-                        Err(_) => return Err("Failed to fetch state events.".to_owned()),
-                    };
+                    let state_vec =
+                        match fetch_and_handle_events(&db, origin, &res.pdu_ids, pub_key_map).await
+                        {
+                            Ok(state) => state,
+                            Err(_) => return Err("Failed to fetch state events.".to_owned()),
+                        };
 
                     let mut state = BTreeMap::new();
                     for pdu in state_vec {
@@ -1106,14 +1088,8 @@ pub fn handle_incoming_pdu<'a>(
                     }
 
                     debug!("Fetching auth chain events at event.");
-                    incoming_auth_events = match fetch_and_handle_events(
-                        &db,
-                        origin,
-                        &res.auth_chain_ids,
-                        pub_key_map,
-                        auth_cache,
-                    )
-                    .await
+                    match fetch_and_handle_events(&db, origin, &res.auth_chain_ids, pub_key_map)
+                        .await
                     {
                         Ok(state) => state,
                         Err(_) => return Err("Failed to fetch auth chain.".to_owned()),
@@ -1243,14 +1219,8 @@ pub fn handle_incoming_pdu<'a>(
             for map in &fork_states {
                 let mut state_auth = vec![];
                 for auth_id in map.values().flat_map(|pdu| &pdu.auth_events) {
-                    match fetch_and_handle_events(
-                        &db,
-                        origin,
-                        &[auth_id.clone()],
-                        pub_key_map,
-                        auth_cache,
-                    )
-                    .await
+                    match fetch_and_handle_events(&db, origin, &[auth_id.clone()], pub_key_map)
+                        .await
                     {
                         // This should always contain exactly one element when Ok
                         Ok(events) => state_auth.extend_from_slice(&events),
@@ -1259,31 +1229,9 @@ pub fn handle_incoming_pdu<'a>(
                         }
                     }
                 }
-                auth_cache.extend(
-                    map.iter()
-                        .map(|pdu| (pdu.1.event_id.clone(), pdu.1.clone())),
-                );
                 auth_events.push(state_auth);
             }
 
-            // Add everything we will need to event_map
-            auth_cache.extend(
-                auth_events
-                    .iter()
-                    .map(|pdus| pdus.iter().map(|pdu| (pdu.event_id.clone(), pdu.clone())))
-                    .flatten(),
-            );
-            auth_cache.extend(
-                incoming_auth_events
-                    .into_iter()
-                    .map(|pdu| (pdu.event_id().clone(), pdu)),
-            );
-            auth_cache.extend(
-                state_after
-                    .into_iter()
-                    .map(|(_, pdu)| (pdu.event_id().clone(), pdu)),
-            );
-
             match state_res::StateResolution::resolve(
                 &room_id,
                 room_version_id,
@@ -1299,7 +1247,13 @@ pub fn handle_incoming_pdu<'a>(
                     .into_iter()
                     .map(|pdus| pdus.into_iter().map(|pdu| pdu.event_id().clone()).collect())
                     .collect(),
-                auth_cache,
+                &|id| {
+                    let res = db.rooms.get_pdu(id);
+                    if let Err(e) = &res {
+                        error!("LOOK AT ME Failed to fetch event: {}", e);
+                    }
+                    res.ok().flatten()
+                },
             ) {
                 Ok(new_state) => new_state,
                 Err(_) => {
@@ -1373,7 +1327,6 @@ pub(crate) fn fetch_and_handle_events<'a>(
     origin: &'a ServerName,
     events: &'a [EventId],
     pub_key_map: &'a RwLock<BTreeMap<String, BTreeMap<String, String>>>,
-    auth_cache: &'a mut EventMap<Arc<PduEvent>>,
 ) -> AsyncRecursiveResult<'a, Vec<Arc<PduEvent>>, Error> {
     Box::pin(async move {
         let back_off = |id| match db.globals.bad_event_ratelimiter.write().unwrap().entry(id) {
@@ -1397,84 +1350,73 @@ pub(crate) fn fetch_and_handle_events<'a>(
                     continue;
                 }
             }
-            // a. Look at auth cache
-            let pdu = match auth_cache.get(id) {
+
+            // a. Look in the main timeline (pduid_pdu tree)
+            // b. Look at outlier pdu tree
+            // (get_pdu checks both)
+            let pdu = match db.rooms.get_pdu(&id)? {
                 Some(pdu) => {
-                    // We already have the auth chain for events in cache
-                    pdu.clone()
+                    trace!("Found {} in db", id);
+                    pdu
                 }
-                // b. Look in the main timeline (pduid_pdu tree)
-                // c. Look at outlier pdu tree
-                // (get_pdu checks both)
-                None => match db.rooms.get_pdu(&id)? {
-                    Some(pdu) => {
-                        trace!("Found {} in db", id);
-                        // We need to fetch the auth chain
-                        let _ = fetch_and_handle_events(
-                            db,
+                None => {
+                    // c. Ask origin server over federation
+                    debug!("Fetching {} over federation.", id);
+                    match db
+                        .sending
+                        .send_federation_request(
+                            &db.globals,
                             origin,
-                            &pdu.auth_events,
-                            pub_key_map,
-                            auth_cache,
+                            get_event::v1::Request { event_id: &id },
                         )
-                        .await?;
-                        pdu
-                    }
-                    None => {
-                        // d. Ask origin server over federation
-                        debug!("Fetching {} over federation.", id);
-                        match db
-                            .sending
-                            .send_federation_request(
-                                &db.globals,
+                        .await
+                    {
+                        Ok(res) => {
+                            debug!("Got {} over federation", id);
+                            let (event_id, mut value) =
+                                crate::pdu::gen_event_id_canonical_json(&res.pdu)?;
+                            // This will also fetch the auth chain
+                            match handle_incoming_pdu(
                                 origin,
-                                get_event::v1::Request { event_id: &id },
+                                &event_id,
+                                value.clone(),
+                                false,
+                                db,
+                                pub_key_map,
                             )
                             .await
-                        {
-                            Ok(res) => {
-                                debug!("Got {} over federation", id);
-                                let (event_id, mut value) =
-                                    crate::pdu::gen_event_id_canonical_json(&res.pdu)?;
-                                // This will also fetch the auth chain
-                                match handle_incoming_pdu(
-                                    origin,
-                                    &event_id,
-                                    value.clone(),
-                                    false,
-                                    db,
-                                    pub_key_map,
-                                    auth_cache,
-                                )
-                                .await
-                                {
-                                    Ok(_) => {
-                                        value.insert(
-                                            "event_id".to_owned(),
-                                            CanonicalJsonValue::String(event_id.into()),
-                                        );
+                            {
+                                Ok(_) => {
+                                    value.insert(
+                                        "event_id".to_owned(),
+                                        CanonicalJsonValue::String(event_id.into()),
+                                    );
 
-                                        Arc::new(serde_json::from_value(
-                                            serde_json::to_value(value).expect("canonicaljsonobject is valid value"),
-                                        ).expect("This is possible because handle_incoming_pdu worked"))
-                                    }
-                                    Err(e) => {
-                                        warn!("Authentication of event {} failed: {:?}", id, e);
-                                        back_off(id.clone());
-                                        continue;
-                                    }
+                                    Arc::new(
+                                        serde_json::from_value(
+                                            serde_json::to_value(value)
+                                                .expect("canonicaljsonobject is valid value"),
+                                        )
+                                        .expect(
+                                            "This is possible because handle_incoming_pdu worked",
+                                        ),
+                                    )
+                                }
+                                Err(e) => {
+                                    warn!("Authentication of event {} failed: {:?}", id, e);
+                                    back_off(id.clone());
+                                    continue;
                                 }
                             }
-                            Err(_) => {
-                                warn!("Failed to fetch event: {}", id);
-                                back_off(id.clone());
-                                continue;
-                            }
+                        }
+                        Err(_) => {
+                            warn!("Failed to fetch event: {}", id);
+                            back_off(id.clone());
+                            continue;
                         }
                     }
-                },
+                }
             };
-            auth_cache.entry(id.clone()).or_insert_with(|| pdu.clone());
             pdus.push(pdu);
         }
         Ok(pdus)
@@ -2155,7 +2097,7 @@ pub async fn create_join_event_route(
             ))?;
 
     let pub_key_map = RwLock::new(BTreeMap::new());
-    let mut auth_cache = EventMap::new();
+    // let mut auth_cache = EventMap::new();
 
     // We do not add the event_id field to the pdu here because of signature and hashes checks
     let (event_id, value) = match crate::pdu::gen_event_id_canonical_json(&body.pdu) {
@@ -2178,26 +2120,18 @@ pub async fn create_join_event_route(
     )
     .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Origin field is invalid."))?;
 
-    let pdu_id = handle_incoming_pdu(
-        &origin,
-        &event_id,
-        value,
-        true,
-        &db,
-        &pub_key_map,
-        &mut auth_cache,
-    )
-    .await
-    .map_err(|_| {
-        Error::BadRequest(
+    let pdu_id = handle_incoming_pdu(&origin, &event_id, value, true, &db, &pub_key_map)
+        .await
+        .map_err(|_| {
+            Error::BadRequest(
+                ErrorKind::InvalidParam,
+                "Error while handling incoming PDU.",
+            )
+        })?
+        .ok_or(Error::BadRequest(
             ErrorKind::InvalidParam,
-            "Error while handling incoming PDU.",
-        )
-    })?
-    .ok_or(Error::BadRequest(
-        ErrorKind::InvalidParam,
-        "Could not accept incoming PDU as timeline event.",
-    ))?;
+            "Could not accept incoming PDU as timeline event.",
+        ))?;
 
     let state_ids = db.rooms.state_full_ids(shortstatehash)?;