diff --git a/http/app.hpp b/http/app.hpp
index f982618..f8d4d97 100644
--- a/http/app.hpp
+++ b/http/app.hpp
@@ -7,6 +7,7 @@
 #include "async_resp.hpp"
 #include "http_request.hpp"
 #include "http_server.hpp"
+#include "io_context_singleton.hpp"
 #include "logging.hpp"
 #include "routing.hpp"
 #include "routing/dynamicrule.hpp"
@@ -14,7 +15,6 @@
 #include <sys/socket.h>
 #include <systemd/sd-daemon.h>
 
-#include <boost/asio/io_context.hpp>
 #include <boost/asio/ip/address.hpp>
 #include <boost/asio/ip/tcp.hpp>
 #include <boost/asio/ssl/context.hpp>
@@ -44,11 +44,6 @@
                                            raw_socket_t, ssl_socket_t>;
     using server_type = Server<App, socket_type>;
 
-    explicit App(std::shared_ptr<boost::asio::io_context> ioIn =
-                     std::make_shared<boost::asio::io_context>()) :
-        io(std::move(ioIn))
-    {}
-
     template <typename Adaptor>
     void handleUpgrade(const std::shared_ptr<Request>& req,
                        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
@@ -89,13 +84,8 @@
         server->loadCertificate();
     }
 
-    std::optional<boost::asio::ip::tcp::acceptor> setupSocket()
+    static std::optional<boost::asio::ip::tcp::acceptor> setupSocket()
     {
-        if (io == nullptr)
-        {
-            BMCWEB_LOG_CRITICAL("IO was nullptr?");
-            return std::nullopt;
-        }
         constexpr int defaultPort = 18080;
         if (sd_listen_fds(0) == 1)
         {
@@ -106,7 +96,8 @@
                 BMCWEB_LOG_INFO("Starting webserver on socket handle {}",
                                 SD_LISTEN_FDS_START);
                 return boost::asio::ip::tcp::acceptor(
-                    *io, boost::asio::ip::tcp::v6(), SD_LISTEN_FDS_START);
+                    getIoContext(), boost::asio::ip::tcp::v6(),
+                    SD_LISTEN_FDS_START);
             }
             BMCWEB_LOG_ERROR(
                 "bad incoming socket, starting webserver on port {}",
@@ -114,8 +105,9 @@
         }
         BMCWEB_LOG_INFO("Starting webserver on port {}", defaultPort);
         return boost::asio::ip::tcp::acceptor(
-            *io, boost::asio::ip::tcp::endpoint(
-                     boost::asio::ip::make_address("0.0.0.0"), defaultPort));
+            getIoContext(),
+            boost::asio::ip::tcp::endpoint(
+                boost::asio::ip::make_address("0.0.0.0"), defaultPort));
     }
 
     void run()
@@ -128,7 +120,7 @@
             BMCWEB_LOG_CRITICAL("Couldn't start server");
             return;
         }
-        server.emplace(this, std::move(*acceptor), sslContext, io);
+        server.emplace(this, std::move(*acceptor), sslContext, getIoContext());
         server->run();
     }
 
@@ -158,14 +150,6 @@
 
     std::shared_ptr<boost::asio::ssl::context> sslContext = nullptr;
 
-    boost::asio::io_context& ioContext()
-    {
-        return *io;
-    }
-
-  private:
-    std::shared_ptr<boost::asio::io_context> io;
-
     std::optional<server_type> server;
 
     Router router;
diff --git a/http/http_server.hpp b/http/http_server.hpp
index b48137f..a7c2459 100644
--- a/http/http_server.hpp
+++ b/http/http_server.hpp
@@ -38,10 +38,10 @@
   public:
     Server(Handler* handlerIn, boost::asio::ip::tcp::acceptor&& acceptorIn,
            std::shared_ptr<boost::asio::ssl::context> adaptorCtxIn,
-           std::shared_ptr<boost::asio::io_context> io) :
-        ioService(std::move(io)), acceptor(std::move(acceptorIn)),
+           boost::asio::io_context& io) :
+        ioService(io), acceptor(std::move(acceptorIn)),
         // NOLINTNEXTLINE(misc-include-cleaner)
-        signals(*ioService, SIGINT, SIGTERM, SIGHUP), handler(handlerIn),
+        signals(ioService, SIGINT, SIGTERM, SIGHUP), handler(handlerIn),
         adaptorCtx(std::move(adaptorCtxIn))
     {}
 
@@ -120,7 +120,7 @@
 
     void stop()
     {
-        ioService->stop();
+        ioService.stop();
     }
     using Socket = boost::beast::lowest_layer_type<Adaptor>;
     using SocketPtr = std::unique_ptr<Socket>;
@@ -133,7 +133,7 @@
             return;
         }
 
-        boost::asio::steady_timer timer(*ioService);
+        boost::asio::steady_timer timer(ioService);
         std::shared_ptr<Connection<Adaptor, Handler>> connection;
 
         if constexpr (std::is_same<Adaptor,
@@ -157,20 +157,14 @@
                 Adaptor(std::move(*socket)));
         }
 
-        boost::asio::post(*ioService, [connection] { connection->start(); });
+        boost::asio::post(ioService, [connection] { connection->start(); });
 
         doAccept();
     }
 
     void doAccept()
     {
-        if (ioService == nullptr)
-        {
-            BMCWEB_LOG_CRITICAL("IoService was null");
-            return;
-        }
-
-        SocketPtr socket = std::make_unique<Socket>(*ioService);
+        SocketPtr socket = std::make_unique<Socket>(ioService);
         // Keep a raw pointer so when the socket is moved, the pointer is still
         // valid
         Socket* socketPtr = socket.get();
@@ -181,7 +175,7 @@
     }
 
   private:
-    std::shared_ptr<boost::asio::io_context> ioService;
+    boost::asio::io_context& ioService;
     std::function<std::string()> getCachedDateStr;
     boost::asio::ip::tcp::acceptor acceptor;
     boost::asio::signal_set signals;
