diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..13da385
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,82 @@
+#include <algorithm>
+#include <iomanip>
+
+#include "slp.hpp"
+#include "slp_meta.hpp"
+#include "slp_server.hpp"
+#include "sock_channel.hpp"
+
+
+/* Call Back for the sd event loop */
+static int requestHandler(sd_event_source* es, int fd, uint32_t revents,
+                          void* userdata)
+{
+    int rc = slp::SUCCESS;
+    timeval tv{slp::TIMEOUT, 0};
+    udpsocket::Channel channel(fd, tv);
+    std::vector<uint8_t> recvBuff;
+    slp::Message req;
+    std::vector<uint8_t> resp;
+    // Read the packet
+    std::tie(rc, recvBuff) = channel.read();
+
+    if (rc < 0)
+    {
+        std::cerr << "E> SLP Error in Read : " << std::hex << rc << "\n";
+        return rc;
+    }
+
+    switch (recvBuff[0])
+    {
+        case slp::VERSION_2:
+        {
+            std::cout << "SLP Request" << "\n";
+            //print the buffer
+            std::for_each(recvBuff.begin(), recvBuff.end(),
+                          [](uint8_t & ch)
+            {
+                std::cout << std::hex << std::setfill('0')
+                          << std::setw(2) << (int)ch << ' ' ;
+            });
+            std::cout << "\n";
+            //Parse the buffer and construct the req object
+            std::tie(rc, req) = slp::parser::parseBuffer(recvBuff);
+            if (!rc)
+            {
+                //Passing the req object to handler to serve it
+                std::tie(rc, resp) = slp::handler::processRequest(req);
+            }
+            break;
+        }
+        default:
+            rc = static_cast<uint8_t>(slp::Error::VER_NOT_SUPPORTED);
+            break;
+    }
+
+    //if there was error during Parsing of request
+    //or processing of request then handle the error.
+    if (rc)
+    {
+        std::cerr << "E> SLP Error rc=" << rc << "\n";
+        resp = slp::handler::processError(req, rc);
+    }
+
+    //print and send the response
+    std::cout << "SLP Response" << "\n";
+    std::for_each(resp.begin(), resp.end(),
+                  [](uint8_t & ch)
+    {
+        std::cout << std::hex << std::setfill('0')
+                  << std::setw(2) << (int)ch << ' ' ;
+    });
+
+    channel.write(resp);
+    return slp::SUCCESS;
+}
+
+
+int main(int argc, char* argv[])
+{
+    slp::udp::Server svr(slp::PORT, requestHandler);
+    return svr.run();
+}
