diff --git a/libweave/include/weave/http_client.h b/libweave/include/weave/http_client.h
index 8263d21..401f1c5 100644
--- a/libweave/include/weave/http_client.h
+++ b/libweave/include/weave/http_client.h
@@ -34,16 +34,14 @@
   virtual std::unique_ptr<Response> SendRequestAndBlock(
       const std::string& method,
       const std::string& url,
-      const std::string& data,
-      const std::string& mime_type,
       const Headers& headers,
+      const std::string& data,
       chromeos::ErrorPtr* error) = 0;
 
   virtual int SendRequest(const std::string& method,
                           const std::string& url,
-                          const std::string& data,
-                          const std::string& mime_type,
                           const Headers& headers,
+                          const std::string& data,
                           const SuccessCallback& success_callback,
                           const ErrorCallback& error_callback) = 0;
 
diff --git a/libweave/include/weave/mock_http_client.h b/libweave/include/weave/mock_http_client.h
index 015ed0b..cb1b96e 100644
--- a/libweave/include/weave/mock_http_client.h
+++ b/libweave/include/weave/mock_http_client.h
@@ -26,27 +26,24 @@
  public:
   ~MockHttpClient() override = default;
 
-  MOCK_METHOD6(MockSendRequest,
+  MOCK_METHOD5(MockSendRequest,
                Response*(const std::string&,
                          const std::string&,
-                         const std::string&,
-                         const std::string&,
                          const Headers&,
+                         const std::string&,
                          chromeos::ErrorPtr*));
 
   std::unique_ptr<Response> SendRequestAndBlock(
       const std::string& method,
       const std::string& url,
-      const std::string& data,
-      const std::string& mime_type,
       const Headers& headers,
+      const std::string& data,
       chromeos::ErrorPtr* error) override;
 
   int SendRequest(const std::string& method,
                   const std::string& url,
-                  const std::string& data,
-                  const std::string& mime_type,
                   const Headers& headers,
+                  const std::string& data,
                   const SuccessCallback& success_callback,
                   const ErrorCallback& error_callback) override;
 };
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index 229ba91..8bb47c9 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -41,14 +41,6 @@
 
 namespace {
 
-std::pair<std::string, std::string> BuildAuthHeader(
-    const std::string& access_token_type,
-    const std::string& access_token) {
-  std::string authorization =
-      chromeos::string_utils::Join(" ", access_token_type, access_token);
-  return {"Authorization", authorization};
-}
-
 inline void SetUnexpectedError(chromeos::ErrorPtr* error) {
   chromeos::Error::AddTo(error, FROM_HERE, kErrorDomainGCD,
                          "unexpected_response", "Unexpected GCD error");
@@ -115,18 +107,18 @@
 
   std::unique_ptr<HttpClient::Response> SendAndBlock(
       chromeos::ErrorPtr* error) {
-    return transport_->SendRequestAndBlock(method_, url_, data_, mime_type_,
-                                           headers_, error);
+    return transport_->SendRequestAndBlock(method_, url_, GetFullHeaders(),
+                                           data_, error);
   }
 
   int Send(const HttpClient::SuccessCallback& success_callback,
            const HttpClient::ErrorCallback& error_callback) {
-    return transport_->SendRequest(method_, url_, data_, mime_type_, headers_,
+    return transport_->SendRequest(method_, url_, GetFullHeaders(), data_,
                                    success_callback, error_callback);
   }
 
-  void AddAuthHeader(const std::string& access_token) {
-    headers_.emplace_back(BuildAuthHeader("Bearer", access_token));
+  void SetAccessToken(const std::string& access_token) {
+    access_token_ = access_token;
   }
 
   void SetData(const std::string& data, const std::string& mime_type) {
@@ -136,22 +128,31 @@
 
   void SetFormData(
       const std::vector<std::pair<std::string, std::string>>& data) {
-    data_ = chromeos::data_encoding::WebParamsEncode(data);
-    mime_type_ = http::kWwwFormUrlEncoded;
+    SetData(chromeos::data_encoding::WebParamsEncode(data),
+            http::kWwwFormUrlEncoded);
   }
 
   void SetJsonData(const base::Value& json) {
     std::string data;
-    CHECK(base::JSONWriter::Write(json, &data_));
-    mime_type_ = http::kJsonUtf8;
+    CHECK(base::JSONWriter::Write(json, &data));
+    SetData(data, http::kJsonUtf8);
   }
 
  private:
+  HttpClient::Headers GetFullHeaders() const {
+    HttpClient::Headers headers;
+    if (!access_token_.empty())
+      headers.emplace_back(http::kAuthorization, "Bearer " + access_token_);
+    if (!mime_type_.empty())
+      headers.emplace_back(http::kContentType, mime_type_);
+    return headers;
+  }
+
   std::string method_;
   std::string url_;
   std::string data_;
   std::string mime_type_;
-  std::vector<std::pair<std::string, std::string>> headers_;
+  std::string access_token_;
   HttpClient* transport_{nullptr};
 
   DISALLOW_COPY_AND_ASSIGN(RequestSender);
@@ -676,7 +677,7 @@
 
   RequestSender sender{data->method, data->url, http_client_};
   sender.SetData(data->body, http::kJsonUtf8);
-  sender.AddAuthHeader(access_token_);
+  sender.SetAccessToken(access_token_);
   int request_id =
       sender.Send(base::Bind(&DeviceRegistrationInfo::OnCloudRequestSuccess,
                              AsWeakPtr(), data),
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index 72db07e..77507cd 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -16,6 +16,7 @@
 
 #include "libweave/src/commands/command_manager.h"
 #include "libweave/src/commands/unittest_utils.h"
+#include "libweave/src/http_constants.h"
 #include "libweave/src/states/mock_state_change_queue_interface.h"
 #include "libweave/src/states/state_manager.h"
 #include "libweave/src/storage_impls.h"
@@ -94,7 +95,7 @@
       .WillRepeatedly(Return(status_code));
   EXPECT_CALL(*response, GetContentType())
       .Times(AtLeast(1))
-      .WillRepeatedly(Return("application/json"));
+      .WillRepeatedly(Return(http::kJsonUtf8));
   EXPECT_CALL(*response, GetData())
       .Times(AtLeast(1))
       .WillRepeatedly(ReturnRefOfCopy(text));
@@ -102,8 +103,16 @@
 }
 
 std::pair<std::string, std::string> GetAuthHeader() {
-  return {std::string{"Authorization"},
-          std::string{"Bearer "} + test_data::kAccessToken};
+  return {http::kAuthorization,
+          std::string("Bearer ") + test_data::kAccessToken};
+}
+
+std::pair<std::string, std::string> GetJsonHeader() {
+  return {http::kContentType, http::kJsonUtf8};
+}
+
+std::pair<std::string, std::string> GetFormHeader() {
+  return {http::kContentType, http::kWwwFormUrlEncoded};
 }
 
 }  // anonymous namespace
@@ -229,10 +238,9 @@
   ReloadConfig();
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRefreshToken,
                   GetFormField(data, "refresh_token"));
@@ -258,10 +266,9 @@
   EXPECT_EQ(RegistrationStatus::kConnecting, GetRegistrationStatus());
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRefreshToken,
                   GetFormField(data, "refresh_token"));
@@ -287,10 +294,9 @@
   EXPECT_EQ(RegistrationStatus::kConnecting, GetRegistrationStatus());
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("refresh_token", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRefreshToken,
                   GetFormField(data, "refresh_token"));
@@ -316,10 +322,10 @@
   SetAccessToken();
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("GET", dev_reg_->GetDeviceURL(), _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kGet, dev_reg_->GetDeviceURL(),
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         base::DictionaryValue json;
         json.SetString("channel.supportedType", "xmpp");
         json.SetString("deviceKind", "vendor");
@@ -385,11 +391,11 @@
 
   std::string ticket_url = dev_reg_->GetServiceURL("registrationTickets/") +
                            test_data::kClaimTicketId;
-  EXPECT_CALL(http_client_,
-              MockSendRequest(
-                  "PATCH", ticket_url + "?key=" + test_data::kApiKey, _,
-                  "application/json; charset=utf-8", HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+  EXPECT_CALL(
+      http_client_,
+      MockSendRequest(http::kPatch, ticket_url + "?key=" + test_data::kApiKey,
+                      HttpClient::Headers{GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         auto json = unittests::CreateDictionaryValue(data);
         EXPECT_NE(nullptr, json.get());
         std::string value;
@@ -455,9 +461,9 @@
       })));
 
   EXPECT_CALL(http_client_,
-              MockSendRequest(
-                  "POST", ticket_url + "/finalize?key=" + test_data::kApiKey,
-                  "", _, HttpClient::Headers{}, _))
+              MockSendRequest(http::kPost, ticket_url + "/finalize?key=" +
+                                               test_data::kApiKey,
+                              HttpClient::Headers{}, _, _))
       .WillOnce(InvokeWithoutArgs([]() {
         base::DictionaryValue json;
         json.SetString("id", test_data::kClaimTicketId);
@@ -474,10 +480,9 @@
       }));
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("POST", dev_reg_->GetOAuthURL("token"), _,
-                              "application/x-www-form-urlencoded",
-                              HttpClient::Headers{}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(http::kPost, dev_reg_->GetOAuthURL("token"),
+                              HttpClient::Headers{GetFormHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_EQ("authorization_code", GetFormField(data, "grant_type"));
         EXPECT_EQ(test_data::kRobotAccountAuthCode, GetFormField(data, "code"));
         EXPECT_EQ(test_data::kClientId, GetFormField(data, "client_id"));
@@ -561,10 +566,10 @@
   ASSERT_NE(nullptr, command);
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("PATCH", command_url, _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kPatch, command_url,
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"results":{"status":"Ok"}})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
@@ -575,16 +580,16 @@
   Mock::VerifyAndClearExpectations(&http_client_);
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("PATCH", command_url, _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kPatch, command_url,
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"state":"inProgress"})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
         return ReplyWithJson(200, json);
       })))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"progress":{"progress":18}})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
@@ -595,10 +600,10 @@
   Mock::VerifyAndClearExpectations(&http_client_);
 
   EXPECT_CALL(http_client_,
-              MockSendRequest("PATCH", command_url, _,
-                              "application/json; charset=utf-8",
-                              HttpClient::Headers{GetAuthHeader()}, _))
-      .WillOnce(WithArgs<2>(Invoke([](const std::string& data) {
+              MockSendRequest(
+                  http::kPatch, command_url,
+                  HttpClient::Headers{GetAuthHeader(), GetJsonHeader()}, _, _))
+      .WillOnce(WithArgs<3>(Invoke([](const std::string& data) {
         EXPECT_JSON_EQ(R"({"state":"cancelled"})",
                        *CreateDictionaryValue(data));
         base::DictionaryValue json;
diff --git a/libweave/src/mock_http_client.cc b/libweave/src/mock_http_client.cc
index d4307a4..1f223a9 100644
--- a/libweave/src/mock_http_client.cc
+++ b/libweave/src/mock_http_client.cc
@@ -13,24 +13,22 @@
 std::unique_ptr<HttpClient::Response> MockHttpClient::SendRequestAndBlock(
     const std::string& method,
     const std::string& url,
-    const std::string& data,
-    const std::string& mime_type,
     const Headers& headers,
+    const std::string& data,
     chromeos::ErrorPtr* error) {
   return std::unique_ptr<Response>{
-      MockSendRequest(method, url, data, mime_type, headers, error)};
+      MockSendRequest(method, url, headers, data, error)};
 }
 
 int MockHttpClient::SendRequest(const std::string& method,
                                 const std::string& url,
-                                const std::string& data,
-                                const std::string& mime_type,
                                 const Headers& headers,
+                                const std::string& data,
                                 const SuccessCallback& success_callback,
                                 const ErrorCallback& error_callback) {
   chromeos::ErrorPtr error;
   std::unique_ptr<Response> response{
-      MockSendRequest(method, url, data, mime_type, headers, &error)};
+      MockSendRequest(method, url, headers, data, &error)};
   if (response) {
     success_callback.Run(0, *response);
   } else {
