diff --git a/include/opendht/http.h b/include/opendht/http.h
index e3248a8f61d16de19d5427a29f2af47b8c7cca5c..9e2602154e845ac197c9f0e963fa045a799d7545 100644
--- a/include/opendht/http.h
+++ b/include/opendht/http.h
@@ -104,6 +104,22 @@ private:
     std::shared_ptr<dht::Logger> logger_;
 };
 
+
+class Resolver {
+    Resolver(asio::io_context& ctx, const std::string& host, const std::string& service = "80");
+
+    using ResolvedCb = std::function<void(const asio::error_code&, const asio::ip::basic_resolver_results<asio::ip::tcp>&)>;
+    void addOnResolved(ResolvedCb cb);
+
+private:
+    std::mutex cbsMutex_;
+    asio::ip::tcp::resolver resolver_;
+    asio::error_code error_;
+    asio::ip::basic_resolver_results<asio::ip::tcp> endpoints_;
+    std::queue<ResolvedCb> cbs_;
+    bool completed_ {false};
+};
+
 class OPENDHT_PUBLIC Request
 {
 public:
@@ -138,12 +154,13 @@ private:
 
     size_t get_content_length(const std::string str);
 
-    std::string service_;
+    Resolver resolver_;
+    /* std::string service_;
     std::string host_;
 
     asio::ip::tcp::resolver resolver_;
     asio::ip::basic_resolver_results<asio::ip::tcp> endpoints_;
-
+*/
     Id id_;
     static Id ids_;
     std::shared_ptr<Connection> conn_;
diff --git a/src/http.cpp b/src/http.cpp
index c9833ac17247b560577c4bf34a3fcda6ec567106..0ee54513fbcd9c4839d3c2959bc361ee23e51194 100644
--- a/src/http.cpp
+++ b/src/http.cpp
@@ -477,4 +477,43 @@ Request::get_content_length(const std::string str)
     return content_length;
 }
 
+
+Resolver::Resolver(asio::io_context& ctx, const std::string& host, const std::string& service)
+{
+    resolver_.async_resolve({host, service}, [this]
+        (const asio::error_code& ec, asio::ip::tcp::resolver::results_type endpoints)
+    {
+        std::lock_guard<std::mutex> lock(cbsMutex_);
+        while (not cbs_.empty()) {
+            cbs_.front()(ec, endpoints);
+            cbs_.pop();
+        }
+        error_ = ec;
+        endpoints_ = endpoints;
+        completed_ = true;
+    }
+}
+
+void
+Resolver::addOnResolved(ResolvedCb cb)
+{
+    std::lock_guard<std::mutex> lock(cbsMutex_);
+    if (completed_) {
+        cb(error_, endpoints_);
+    } else {
+        cbs_.push(std::move(cb));
+    }
+}
+
+/*
+private:
+    std::mutex cbsMutex_;
+    std::queue<ResolvedCb> cbs_;
+
+    asio::ip::tcp::resolver resolver_;
+    asio::error_code error_;
+    asio::ip::basic_resolver_results<asio::ip::tcp> endpoints_;
+} */
+
+
 } // namespace http