diff --git a/services/lib/src/Worker.h b/services/lib/src/Worker.h
new file mode 100644
--- /dev/null
+++ b/services/lib/src/Worker.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "GlobalTools.h"
+
+#include <boost/asio.hpp>
+#include <boost/asio/thread_pool.hpp>
+
+#include <atomic>
+#include <memory>
+
+typedef std::function<void()> Task;
+typedef std::function<void(std::unique_ptr<std::string>)> Callback;
+
+namespace comm {
+namespace network {
+
+class Worker {
+  std::unique_ptr<boost::asio::thread_pool> pool;
+
+  Worker() {
+    this->pool =
+        std::make_unique<boost::asio::thread_pool>(tools::getNumberOfCpus());
+  }
+
+  virtual ~Worker() {
+    this->pool->join();
+  }
+
+public:
+  static Worker &getInstance() {
+    static Worker instance;
+    return instance;
+  }
+
+  void schedule(Task task, Callback callback) {
+    boost::asio::post(*this->pool, [task, callback]() {
+      std::unique_ptr<std::string> err = nullptr;
+      try {
+        task();
+      } catch (std::exception &e) {
+        err = std::make_unique<std::string>(e.what());
+      }
+      callback(std::move(err));
+    });
+  }
+};
+
+} // namespace network
+} // namespace comm
\ No newline at end of file