diff --git a/src/main.cpp b/src/main.cpp
index 109b1b3..2f5e7f9 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,6 +1,5 @@
 #include "associations.hpp"
 #include "processing.hpp"
-#include "src/argument.hpp"
 #include "types.hpp"
 
 #include <tinyxml2.h>
@@ -23,8 +22,6 @@
 
 AssociationMaps associationMaps;
 
-static AllowDenyList serviceAllowList;
-
 void updateOwners(sdbusplus::asio::connection* conn,
                   boost::container::flat_map<std::string, std::string>& owners,
                   const std::string& newObject)
@@ -264,7 +261,7 @@
 #endif
     sdbusplus::asio::object_server& objectServer)
 {
-    if (needToIntrospect(processName, serviceAllowList))
+    if (needToIntrospect(processName))
     {
         std::shared_ptr<InProgressIntrospect> transaction =
             std::make_shared<InProgressIntrospect>(systemBus, io, processName,
@@ -326,7 +323,7 @@
 #endif
             for (const std::string& processName : processNames)
             {
-                if (needToIntrospect(processName, serviceAllowList))
+                if (needToIntrospect(processName))
                 {
                     startNewIntrospect(systemBus, io, interfaceMap, processName,
                                        assocMaps,
@@ -342,24 +339,6 @@
         "ListNames");
 }
 
-void splitArgs(const std::string& stringArgs,
-               boost::container::flat_set<std::string>& listArgs)
-{
-    std::istringstream args;
-    std::string arg;
-
-    args.str(stringArgs);
-
-    while (!args.eof())
-    {
-        args >> arg;
-        if (!arg.empty())
-        {
-            listArgs.insert(arg);
-        }
-    }
-}
-
 void addObjectMapResult(std::vector<InterfaceMapType::value_type>& objectMap,
                         const std::string& objectPath,
                         const ConnectionNames::value_type& interfaceMap)
@@ -665,15 +644,12 @@
     return ret;
 }
 
-int main(int argc, char** argv)
+int main()
 {
-    auto options = ArgumentParser(argc, argv);
     boost::asio::io_context io;
     std::shared_ptr<sdbusplus::asio::connection> systemBus =
         std::make_shared<sdbusplus::asio::connection>(io);
 
-    splitArgs(options["service-namespaces"], serviceAllowList);
-
     sdbusplus::asio::object_server server(systemBus);
 
     // Construct a signal set registered for process termination.
@@ -707,7 +683,7 @@
                     std::chrono::steady_clock::now());
 #endif
                 // New daemon added
-                if (needToIntrospect(name, serviceAllowList))
+                if (needToIntrospect(name))
                 {
                     nameOwners[newOwner] = name;
                     startNewIntrospect(systemBus.get(), io, interfaceMap, name,
@@ -734,7 +710,7 @@
             {
                 return; // only introspect well-known
             }
-            if (needToIntrospect(wellKnown, serviceAllowList))
+            if (needToIntrospect(wellKnown))
             {
                 processInterfaceAdded(interfaceMap, objPath, interfacesAdded,
                                       wellKnown, associationMaps, server);
