diff --git a/src/appservice_server.rs b/src/appservice_server.rs
index 27d0c0d3..42918577 100644
--- a/src/appservice_server.rs
+++ b/src/appservice_server.rs
@@ -5,6 +5,7 @@ use ruma::api::{IncomingResponse, OutgoingRequest, SendAccessToken};
 use std::{
     convert::{TryFrom, TryInto},
     fmt::Debug,
+    mem,
     time::Duration,
 };
 
@@ -45,22 +46,21 @@ where
     *reqwest_request.timeout_mut() = Some(Duration::from_secs(30));
 
     let url = reqwest_request.url().clone();
-    let mut reqwest_response = globals.reqwest_client().execute(reqwest_request).await?;
+    let mut response = globals.reqwest_client().execute(reqwest_request).await?;
 
-    // Because reqwest::Response -> http::Response is complicated:
-    let status = reqwest_response.status();
-    let mut http_response = http::Response::builder().status(status);
-    let headers = http_response.headers_mut().unwrap();
+    // reqwest::Response -> http::Response conversion
+    let status = response.status();
+    let mut http_response_builder = http::Response::builder()
+        .status(status)
+        .version(response.version());
+    mem::swap(
+        response.headers_mut(),
+        http_response_builder
+            .headers_mut()
+            .expect("http::response::Builder is usable"),
+    );
 
-    for (k, v) in reqwest_response.headers_mut().drain() {
-        if let Some(key) = k {
-            headers.insert(key, v);
-        }
-    }
-
-    let status = reqwest_response.status();
-
-    let body = reqwest_response.bytes().await.unwrap_or_else(|e| {
+    let body = response.bytes().await.unwrap_or_else(|e| {
         warn!("server error: {}", e);
         Vec::new().into()
     }); // TODO: handle timeout
@@ -76,7 +76,7 @@ where
     }
 
     let response = T::IncomingResponse::try_from_http_response(
-        http_response
+        http_response_builder
             .body(body)
             .expect("reqwest body is valid http body"),
     );
diff --git a/src/database/pusher.rs b/src/database/pusher.rs
index 7c7abb3b..75c2efb6 100644
--- a/src/database/pusher.rs
+++ b/src/database/pusher.rs
@@ -16,7 +16,7 @@ use ruma::{
 };
 use sled::IVec;
 
-use std::{convert::TryFrom, fmt::Debug};
+use std::{convert::TryFrom, fmt::Debug, mem};
 
 #[derive(Debug, Clone)]
 pub struct PushData {
@@ -114,24 +114,23 @@ where
     //*reqwest_request.timeout_mut() = Some(Duration::from_secs(5));
 
     let url = reqwest_request.url().clone();
-    let reqwest_response = globals.reqwest_client().execute(reqwest_request).await;
+    let response = globals.reqwest_client().execute(reqwest_request).await;
 
-    // Because reqwest::Response -> http::Response is complicated:
-    match reqwest_response {
-        Ok(mut reqwest_response) => {
-            let status = reqwest_response.status();
-            let mut http_response = http::Response::builder().status(status);
-            let headers = http_response.headers_mut().unwrap();
+    match response {
+        Ok(mut response) => {
+            // reqwest::Response -> http::Response conversion
+            let status = response.status();
+            let mut http_response_builder = http::Response::builder()
+                .status(status)
+                .version(response.version());
+            mem::swap(
+                response.headers_mut(),
+                http_response_builder
+                    .headers_mut()
+                    .expect("http::response::Builder is usable"),
+            );
 
-            for (k, v) in reqwest_response.headers_mut().drain() {
-                if let Some(key) = k {
-                    headers.insert(key, v);
-                }
-            }
-
-            let status = reqwest_response.status();
-
-            let body = reqwest_response.bytes().await.unwrap_or_else(|e| {
+            let body = response.bytes().await.unwrap_or_else(|e| {
                 warn!("server error {}", e);
                 Vec::new().into()
             }); // TODO: handle timeout
@@ -147,7 +146,7 @@ where
             }
 
             let response = T::IncomingResponse::try_from_http_response(
-                http_response
+                http_response_builder
                     .body(body)
                     .expect("reqwest body is valid http body"),
             );
diff --git a/src/server_server.rs b/src/server_server.rs
index 1e58067e..908a54e6 100644
--- a/src/server_server.rs
+++ b/src/server_server.rs
@@ -43,6 +43,7 @@ use std::{
     convert::{TryFrom, TryInto},
     fmt::Debug,
     future::Future,
+    mem,
     net::{IpAddr, SocketAddr},
     pin::Pin,
     result::Result as StdResult,
@@ -219,24 +220,23 @@ where
     *reqwest_request.timeout_mut() = Some(Duration::from_secs(30));
 
     let url = reqwest_request.url().clone();
-    let reqwest_response = globals.reqwest_client().execute(reqwest_request).await;
+    let response = globals.reqwest_client().execute(reqwest_request).await;
 
-    // Because reqwest::Response -> http::Response is complicated:
-    match reqwest_response {
-        Ok(mut reqwest_response) => {
-            let status = reqwest_response.status();
-            let mut http_response = http::Response::builder().status(status);
-            let headers = http_response.headers_mut().unwrap();
+    match response {
+        Ok(mut response) => {
+            // reqwest::Response -> http::Response conversion
+            let status = response.status();
+            let mut http_response_builder = http::Response::builder()
+                .status(status)
+                .version(response.version());
+            mem::swap(
+                response.headers_mut(),
+                http_response_builder
+                    .headers_mut()
+                    .expect("http::response::Builder is usable"),
+            );
 
-            for (k, v) in reqwest_response.headers_mut().drain() {
-                if let Some(key) = k {
-                    headers.insert(key, v);
-                }
-            }
-
-            let status = reqwest_response.status();
-
-            let body = reqwest_response.bytes().await.unwrap_or_else(|e| {
+            let body = response.bytes().await.unwrap_or_else(|e| {
                 warn!("server error {}", e);
                 Vec::new().into()
             }); // TODO: handle timeout
@@ -254,7 +254,7 @@ where
             }
 
             let response = T::IncomingResponse::try_from_http_response(
-                http_response
+                http_response_builder
                     .body(body)
                     .expect("reqwest body is valid http body"),
             );