diff --git a/phosphor-ldap-config/Makefile.am b/phosphor-ldap-config/Makefile.am
index 0092ae5..101d8a7 100644
--- a/phosphor-ldap-config/Makefile.am
+++ b/phosphor-ldap-config/Makefile.am
@@ -1,11 +1,12 @@
 bin_PROGRAMS = phosphor-ldap-conf
 
-noinst_HEADERS = ldap_configuration.hpp utils.hpp
+noinst_HEADERS = ldap_configuration.hpp ldap_config_mgr.hpp utils.hpp
 
 phosphor_ldap_conf_SOURCES = \
                 main.cpp \
                 utils.cpp \
                 ldap_configuration.cpp \
+                ldap_config_mgr.cpp \
                 ldap_serialize.cpp
 
 phosphor_ldap_conf_LDFLAGS = $(SDBUSPLUS_LIBS) \
diff --git a/phosphor-ldap-config/ldap_config_mgr.cpp b/phosphor-ldap-config/ldap_config_mgr.cpp
new file mode 100644
index 0000000..35baa9c
--- /dev/null
+++ b/phosphor-ldap-config/ldap_config_mgr.cpp
@@ -0,0 +1,297 @@
+#include "ldap_config_mgr.hpp"
+#include "ldap_configuration.hpp"
+#include "ldap_serialize.hpp"
+
+#include "utils.hpp"
+#include <filesystem>
+#include <fstream>
+#include <sstream>
+
+namespace phosphor
+{
+namespace ldap
+{
+
+constexpr auto nscdService = "nscd.service";
+constexpr auto LDAPscheme = "ldap";
+constexpr auto LDAPSscheme = "ldaps";
+
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+namespace fs = std::filesystem;
+using Argument = xyz::openbmc_project::Common::InvalidArgument;
+
+using Line = std::string;
+using Key = std::string;
+using Val = std::string;
+using ConfigInfo = std::map<Key, Val>;
+
+void ConfigMgr::startOrStopService(const std::string& service, bool start)
+{
+    if (start)
+    {
+        restartService(service);
+    }
+    else
+    {
+        stopService(service);
+    }
+}
+
+void ConfigMgr::restartService(const std::string& service)
+{
+    try
+    {
+        auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                          SYSTEMD_INTERFACE, "RestartUnit");
+        method.append(service.c_str(), "replace");
+        bus.call_noreply(method);
+    }
+    catch (const sdbusplus::exception::SdBusError& ex)
+    {
+        log<level::ERR>("Failed to restart service",
+                        entry("SERVICE=%s", service.c_str()),
+                        entry("ERR=%s", ex.what()));
+        elog<InternalFailure>();
+    }
+}
+void ConfigMgr::stopService(const std::string& service)
+{
+    try
+    {
+        auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+                                          SYSTEMD_INTERFACE, "StopUnit");
+        method.append(service.c_str(), "replace");
+        bus.call_noreply(method);
+    }
+    catch (const sdbusplus::exception::SdBusError& ex)
+    {
+        log<level::ERR>("Failed to stop service",
+                        entry("SERVICE=%s", service.c_str()),
+                        entry("ERR=%s", ex.what()));
+        elog<InternalFailure>();
+    }
+}
+
+void ConfigMgr::deleteObject()
+{
+    configPtr.reset(nullptr);
+}
+
+std::string ConfigMgr::createConfig(
+    std::string lDAPServerURI, std::string lDAPBindDN, std::string lDAPBaseDN,
+    std::string lDAPBindDNPassword, CreateIface::SearchScope lDAPSearchScope,
+    CreateIface::Create::Type lDAPType, std::string groupNameAttribute,
+    std::string userNameAttribute)
+{
+    bool secureLDAP = false;
+
+    if (isValidLDAPURI(lDAPServerURI, LDAPSscheme))
+    {
+        secureLDAP = true;
+    }
+    else if (isValidLDAPURI(lDAPServerURI, LDAPscheme))
+    {
+        secureLDAP = false;
+    }
+    else
+    {
+        log<level::ERR>("bad LDAP Server URI",
+                        entry("LDAPSERVERURI=%s", lDAPServerURI.c_str()));
+        elog<InvalidArgument>(Argument::ARGUMENT_NAME("lDAPServerURI"),
+                              Argument::ARGUMENT_VALUE(lDAPServerURI.c_str()));
+    }
+
+    if (secureLDAP && !fs::exists(tlsCacertFile.c_str()))
+    {
+        log<level::ERR>("LDAP server's CA certificate not provided",
+                        entry("TLSCACERTFILE=%s", tlsCacertFile.c_str()));
+        elog<NoCACertificate>();
+    }
+
+    if (lDAPBindDN.empty())
+    {
+        log<level::ERR>("Not a valid LDAP BINDDN",
+                        entry("LDAPBINDDN=%s", lDAPBindDN.c_str()));
+        elog<InvalidArgument>(Argument::ARGUMENT_NAME("LDAPBindDN"),
+                              Argument::ARGUMENT_VALUE(lDAPBindDN.c_str()));
+    }
+
+    if (lDAPBaseDN.empty())
+    {
+        log<level::ERR>("Not a valid LDAP BASEDN",
+                        entry("LDAPBASEDN=%s", lDAPBaseDN.c_str()));
+        elog<InvalidArgument>(Argument::ARGUMENT_NAME("LDAPBaseDN"),
+                              Argument::ARGUMENT_VALUE(lDAPBaseDN.c_str()));
+    }
+
+    // With current implementation we support only one LDAP server.
+    deleteObject();
+
+    auto objPath = std::string(LDAP_CONFIG_DBUS_OBJ_PATH);
+    configPtr = std::make_unique<Config>(
+        bus, objPath.c_str(), configFilePath.c_str(), tlsCacertFile.c_str(),
+        secureLDAP, lDAPServerURI, lDAPBindDN, lDAPBaseDN,
+        std::move(lDAPBindDNPassword),
+        static_cast<ConfigIface::SearchScope>(lDAPSearchScope),
+        static_cast<ConfigIface::Type>(lDAPType), false, groupNameAttribute,
+        userNameAttribute, *this);
+
+    restartService(nscdService);
+    return objPath;
+}
+
+void ConfigMgr::restore(const char* filePath)
+{
+    if (!fs::exists(filePath))
+    {
+        log<level::ERR>("Config file doesn't exists",
+                        entry("LDAP_CONFIG_FILE=%s", configFilePath.c_str()));
+        return;
+    }
+
+    ConfigInfo configValues;
+    try
+    {
+        std::fstream stream(filePath, std::fstream::in);
+        Line line;
+        // read characters from stream and places them into line
+        while (std::getline(stream, line))
+        {
+            // remove leading and trailing extra spaces
+            auto firstScan = line.find_first_not_of(' ');
+            auto first =
+                (firstScan == std::string::npos ? line.length() : firstScan);
+            auto last = line.find_last_not_of(' ');
+            line = line.substr(first, last - first + 1);
+            // reduce multiple spaces between two words to a single space
+            auto pred = [](char a, char b) {
+                return (a == b && a == ' ') ? true : false;
+            };
+
+            auto lastPos = std::unique(line.begin(), line.end(), pred);
+
+            line.erase(lastPos, line.end());
+
+            // Ignore if line is empty or starts with '#'
+            if (line.empty() || line.at(0) == '#')
+            {
+                continue;
+            }
+
+            Key key;
+            std::istringstream isLine(line);
+            // extract characters from isLine and stores them into
+            // key until the delimitation character ' ' is found.
+            // If the delimiter is found, it is extracted and discarded
+            // the next input operation will begin after it.
+            if (std::getline(isLine, key, ' '))
+            {
+                Val value;
+                // extract characters after delimitation character ' '
+                if (std::getline(isLine, value, ' '))
+                {
+                    // skip line if it starts with "base shadow" or
+                    // "base passwd" because we would have 3 entries
+                    // ("base lDAPBaseDN" , "base passwd lDAPBaseDN" and
+                    // "base shadow lDAPBaseDN") for the property "lDAPBaseDN",
+                    // one is enough to restore it.
+
+                    if ((key == "base") &&
+                        (value == "passwd" || value == "shadow"))
+                    {
+                        continue;
+                    }
+
+                    // if config type is AD "map group" entry would be add to
+                    // the map configValues. For OpenLdap config file no map
+                    // entry would be there.
+                    if ((key == "map") && (value == "passwd"))
+                    {
+                        key = key + "_" + value;
+                        if (std::getline(isLine, value, ' '))
+                        {
+                            key += "_" + value;
+                        }
+                        std::getline(isLine, value, ' ');
+                    }
+                    configValues[key] = value;
+                }
+            }
+        }
+
+        CreateIface::SearchScope lDAPSearchScope;
+        if (configValues["scope"] == "sub")
+        {
+            lDAPSearchScope = CreateIface::SearchScope::sub;
+        }
+        else if (configValues["scope"] == "one")
+        {
+            lDAPSearchScope = CreateIface::SearchScope::one;
+        }
+        else
+        {
+            lDAPSearchScope = CreateIface::SearchScope::base;
+        }
+
+        CreateIface::Type lDAPType;
+        // If the file is having a line which starts with "map group"
+        if (configValues["map"] == "group")
+        {
+            lDAPType = CreateIface::Type::ActiveDirectory;
+        }
+        else
+        {
+            lDAPType = CreateIface::Type::OpenLdap;
+        }
+
+        // Don't create the config object if either of the field is empty.
+        if (configValues["uri"] == "" || configValues["binddn"] == "" ||
+            configValues["base"] == "")
+        {
+            log<level::INFO>(
+                "LDAP config parameter value missing",
+                entry("URI=%s", configValues["uri"].c_str()),
+                entry("BASEDN=%s", configValues["base"].c_str()),
+                entry("BINDDN=%s", configValues["binddn"].c_str()));
+            return;
+        }
+
+        createConfig(std::move(configValues["uri"]),
+                     std::move(configValues["binddn"]),
+                     std::move(configValues["base"]),
+                     std::move(configValues["bindpw"]), lDAPSearchScope,
+                     lDAPType, std::move(configValues["map_passwd_uid"]),
+                     std::move(configValues["map_passwd_gidNumber"]));
+
+        // Get the enabled property value from the persistent location
+        if (!deserialize(dbusPersistentPath, *configPtr))
+        {
+            log<level::INFO>(
+                "Deserialization Failed, continue with service disable");
+        }
+    }
+    catch (const InvalidArgument& e)
+    {
+        // Don't throw - we don't want to create a D-Bus
+        // object upon finding empty values in config, as
+        // this can be a default config.
+    }
+    catch (const NoCACertificate& e)
+    {
+        // Don't throw - we don't want to create a D-Bus
+        // object upon finding "ssl on" without having tls_cacertFile in place,
+        // as this can be a default config.
+    }
+    catch (const InternalFailure& e)
+    {
+        throw;
+    }
+    catch (const std::exception& e)
+    {
+        log<level::ERR>(e.what());
+        elog<InternalFailure>();
+    }
+}
+} // namespace ldap
+} // namespace phosphor
diff --git a/phosphor-ldap-config/ldap_config_mgr.hpp b/phosphor-ldap-config/ldap_config_mgr.hpp
new file mode 100644
index 0000000..24c12a9
--- /dev/null
+++ b/phosphor-ldap-config/ldap_config_mgr.hpp
@@ -0,0 +1,134 @@
+#pragma once
+
+#include "ldap_configuration.hpp"
+
+#include "config.h"
+#include <xyz/openbmc_project/User/Ldap/Config/server.hpp>
+#include <xyz/openbmc_project/User/Ldap/Create/server.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/elog.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+#include <sdbusplus/bus.hpp>
+#include <string>
+namespace phosphor
+{
+namespace ldap
+{
+
+static constexpr auto defaultNslcdFile = "nslcd.conf.default";
+static constexpr auto nsSwitchFile = "nsswitch.conf";
+
+using namespace phosphor::logging;
+using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+using CreateIface = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::User::Ldap::server::Create>;
+
+// class Config;
+/** @class ConfigMgr
+ *  @brief Creates LDAP server configuration.
+ *  @details concrete implementation of xyz.openbmc_project.User.Ldap.Create
+ *  APIs, in order to create LDAP configuration.
+ */
+class ConfigMgr : public CreateIface
+{
+  public:
+    ConfigMgr() = delete;
+    ~ConfigMgr() = default;
+    ConfigMgr(const ConfigMgr&) = delete;
+    ConfigMgr& operator=(const ConfigMgr&) = delete;
+    ConfigMgr(ConfigMgr&&) = delete;
+    ConfigMgr& operator=(ConfigMgr&&) = delete;
+
+    /** @brief ConfigMgr to put object onto bus at a dbus path.
+     *  @param[in] bus - Bus to attach to.
+     *  @param[in] path - Path to attach at.
+     *  @param[in] filePath - LDAP configuration file.
+     *  @param[in] dbusPersistentPath - Persistent path for LDAP D-Bus property.
+     *  @param[in] caCertFile - LDAP's CA certificate file.
+     */
+    ConfigMgr(sdbusplus::bus::bus& bus, const char* path, const char* filePath,
+              const char* dbusPersistentPath, const char* caCertFile) :
+        CreateIface(bus, path, true),
+        dbusPersistentPath(dbusPersistentPath), configFilePath(filePath),
+        bus(bus)
+    {
+        try
+        {
+            restore(configFilePath.c_str());
+            emit_object_added();
+        }
+        catch (const std::exception& e)
+        {
+            configPtr.reset(nullptr);
+            log<level::ERR>(e.what());
+            elog<InternalFailure>();
+        }
+    }
+
+    /** @brief concrete implementation of the pure virtual funtion
+            xyz.openbmc_project.User.Ldap.Create.createConfig.
+     *  @param[in] lDAPServerURI - LDAP URI of the server.
+     *  @param[in] lDAPBindDN - distinguished name with which bind to bind
+            to the directory server for lookups.
+     *  @param[in] lDAPBaseDN -  distinguished name to use as search base.
+     *  @param[in] lDAPBindDNPassword - credentials with which to bind.
+     *  @param[in] lDAPSearchScope - the search scope.
+     *  @param[in] lDAPType - Specifies the LDAP server type which can be AD
+            or openLDAP.
+     *  @param[in] groupNameAttribute - Specifies attribute name that contains
+     *             the name of the Group in the LDAP server.
+     *  @param[in] usernameAttribute - Specifies attribute name that contains
+     *             the username in the LDAP server.
+     *  @returns the object path of the D-Bus object created.
+     */
+    std::string createConfig(std::string lDAPServerURI, std::string lDAPBindDN,
+                             std::string lDAPBaseDN,
+                             std::string lDAPBindDNPassword,
+                             CreateIface::SearchScope lDAPSearchScope,
+                             CreateIface::Type lDAPType,
+                             std::string groupNameAttribute,
+                             std::string userNameAttribute) override;
+
+    /** @brief restarts given service
+     *  @param[in] service - Service to be restarted.
+     */
+    virtual void restartService(const std::string& service);
+
+    /** @brief stops given service
+     *  @param[in] service - Service to be stopped.
+     */
+    virtual void stopService(const std::string& service);
+
+    /** @brief start or stop the service depending on the given value
+     *  @param[in] service - Service to be start/stop.
+     *  @param[in] value - true to start the service otherwise stop.
+     */
+    virtual void startOrStopService(const std::string& service, bool value);
+
+    /** @brief delete the config D-Bus object.
+     */
+    void deleteObject();
+
+    /* ldap service enabled property would be saved under
+     * this path.
+     */
+    std::string dbusPersistentPath;
+
+  protected:
+    std::string configFilePath{};
+    std::string tlsCacertFile{};
+
+    /** @brief Persistent sdbusplus D-Bus bus connection. */
+    sdbusplus::bus::bus& bus;
+
+    /** @brief Pointer to a Config D-Bus object */
+    std::unique_ptr<Config> configPtr = nullptr;
+
+    /** @brief Populate existing config into D-Bus properties
+     *  @param[in] filePath - LDAP config file path
+     */
+    virtual void restore(const char* filePath);
+};
+} // namespace ldap
+} // namespace phosphor
diff --git a/phosphor-ldap-config/ldap_configuration.cpp b/phosphor-ldap-config/ldap_configuration.cpp
index 77726ee..4edbed7 100644
--- a/phosphor-ldap-config/ldap_configuration.cpp
+++ b/phosphor-ldap-config/ldap_configuration.cpp
@@ -1,3 +1,4 @@
+#include "ldap_config_mgr.hpp"
 #include "ldap_configuration.hpp"
 #include "ldap_serialize.hpp"
 #include "utils.hpp"
@@ -9,6 +10,7 @@
 {
 namespace ldap
 {
+
 constexpr auto nslcdService = "nslcd.service";
 constexpr auto nscdService = "nscd.service";
 constexpr auto LDAPscheme = "ldap";
@@ -480,274 +482,5 @@
     return val;
 }
 
-void ConfigMgr::startOrStopService(const std::string& service, bool start)
-{
-    if (start)
-    {
-        restartService(service);
-    }
-    else
-    {
-        stopService(service);
-    }
-}
-
-void ConfigMgr::restartService(const std::string& service)
-{
-    try
-    {
-        auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
-                                          SYSTEMD_INTERFACE, "RestartUnit");
-        method.append(service.c_str(), "replace");
-        bus.call_noreply(method);
-    }
-    catch (const sdbusplus::exception::SdBusError& ex)
-    {
-        log<level::ERR>("Failed to restart service",
-                        entry("SERVICE=%s", service.c_str()),
-                        entry("ERR=%s", ex.what()));
-        elog<InternalFailure>();
-    }
-}
-
-void ConfigMgr::stopService(const std::string& service)
-{
-    try
-    {
-        auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
-                                          SYSTEMD_INTERFACE, "StopUnit");
-        method.append(service.c_str(), "replace");
-        bus.call_noreply(method);
-    }
-    catch (const sdbusplus::exception::SdBusError& ex)
-    {
-        log<level::ERR>("Failed to stop service",
-                        entry("SERVICE=%s", service.c_str()),
-                        entry("ERR=%s", ex.what()));
-        elog<InternalFailure>();
-    }
-}
-
-void ConfigMgr::deleteObject()
-{
-    configPtr.reset(nullptr);
-}
-
-std::string ConfigMgr::createConfig(
-    std::string lDAPServerURI, std::string lDAPBindDN, std::string lDAPBaseDN,
-    std::string lDAPBindDNPassword, CreateIface::SearchScope lDAPSearchScope,
-    CreateIface::Create::Type lDAPType, std::string groupNameAttribute,
-    std::string userNameAttribute)
-{
-    bool secureLDAP = false;
-
-    if (isValidLDAPURI(lDAPServerURI, LDAPSscheme))
-    {
-        secureLDAP = true;
-    }
-    else if (isValidLDAPURI(lDAPServerURI, LDAPscheme))
-    {
-        secureLDAP = false;
-    }
-    else
-    {
-        log<level::ERR>("bad LDAP Server URI",
-                        entry("LDAPSERVERURI=%s", lDAPServerURI.c_str()));
-        elog<InvalidArgument>(Argument::ARGUMENT_NAME("lDAPServerURI"),
-                              Argument::ARGUMENT_VALUE(lDAPServerURI.c_str()));
-    }
-
-    if (secureLDAP && !fs::exists(tlsCacertFile.c_str()))
-    {
-        log<level::ERR>("LDAP server's CA certificate not provided",
-                        entry("TLSCACERTFILE=%s", tlsCacertFile.c_str()));
-        elog<NoCACertificate>();
-    }
-
-    if (lDAPBindDN.empty())
-    {
-        log<level::ERR>("Not a valid LDAP BINDDN",
-                        entry("LDAPBINDDN=%s", lDAPBindDN.c_str()));
-        elog<InvalidArgument>(Argument::ARGUMENT_NAME("LDAPBindDN"),
-                              Argument::ARGUMENT_VALUE(lDAPBindDN.c_str()));
-    }
-
-    if (lDAPBaseDN.empty())
-    {
-        log<level::ERR>("Not a valid LDAP BASEDN",
-                        entry("LDAPBASEDN=%s", lDAPBaseDN.c_str()));
-        elog<InvalidArgument>(Argument::ARGUMENT_NAME("LDAPBaseDN"),
-                              Argument::ARGUMENT_VALUE(lDAPBaseDN.c_str()));
-    }
-
-    // With current implementation we support only one LDAP server.
-    deleteObject();
-
-    auto objPath = std::string(LDAP_CONFIG_DBUS_OBJ_PATH);
-    configPtr = std::make_unique<Config>(
-        bus, objPath.c_str(), configFilePath.c_str(), tlsCacertFile.c_str(),
-        secureLDAP, lDAPServerURI, lDAPBindDN, lDAPBaseDN,
-        std::move(lDAPBindDNPassword),
-        static_cast<ConfigIface::SearchScope>(lDAPSearchScope),
-        static_cast<ConfigIface::Type>(lDAPType), false, groupNameAttribute,
-        userNameAttribute, *this);
-
-    restartService(nscdService);
-    return objPath;
-}
-
-void ConfigMgr::restore(const char* filePath)
-{
-    if (!fs::exists(filePath))
-    {
-        log<level::ERR>("Config file doesn't exists",
-                        entry("LDAP_CONFIG_FILE=%s", configFilePath.c_str()));
-        return;
-    }
-
-    ConfigInfo configValues;
-
-    try
-    {
-        std::fstream stream(filePath, std::fstream::in);
-        Line line;
-        // read characters from stream and places them into line
-        while (std::getline(stream, line))
-        {
-            // remove leading and trailing extra spaces
-            auto firstScan = line.find_first_not_of(' ');
-            auto first =
-                (firstScan == std::string::npos ? line.length() : firstScan);
-            auto last = line.find_last_not_of(' ');
-            line = line.substr(first, last - first + 1);
-            // reduce multiple spaces between two words to a single space
-            auto pred = [](char a, char b) {
-                return (a == b && a == ' ') ? true : false;
-            };
-
-            auto lastPos = std::unique(line.begin(), line.end(), pred);
-
-            line.erase(lastPos, line.end());
-
-            // Ignore if line is empty or starts with '#'
-            if (line.empty() || line.at(0) == '#')
-            {
-                continue;
-            }
-
-            Key key;
-            std::istringstream isLine(line);
-            // extract characters from isLine and stores them into
-            // key until the delimitation character ' ' is found.
-            // If the delimiter is found, it is extracted and discarded
-            // the next input operation will begin after it.
-            if (std::getline(isLine, key, ' '))
-            {
-                Val value;
-                // extract characters after delimitation character ' '
-                if (std::getline(isLine, value, ' '))
-                {
-                    // skip line if it starts with "base shadow" or
-                    // "base passwd" because we would have 3 entries
-                    // ("base lDAPBaseDN" , "base passwd lDAPBaseDN" and
-                    // "base shadow lDAPBaseDN") for the property "lDAPBaseDN",
-                    // one is enough to restore it.
-
-                    if ((key == "base") &&
-                        (value == "passwd" || value == "shadow"))
-                    {
-                        continue;
-                    }
-
-                    // if config type is AD "map group" entry would be add to
-                    // the map configValues. For OpenLdap config file no map
-                    // entry would be there.
-                    if ((key == "map") && (value == "passwd"))
-                    {
-                        key = key + "_" + value;
-                        if (std::getline(isLine, value, ' '))
-                        {
-                            key += "_" + value;
-                        }
-                        std::getline(isLine, value, ' ');
-                    }
-                    configValues[key] = value;
-                }
-            }
-        }
-
-        CreateIface::SearchScope lDAPSearchScope;
-        if (configValues["scope"] == "sub")
-        {
-            lDAPSearchScope = CreateIface::SearchScope::sub;
-        }
-        else if (configValues["scope"] == "one")
-        {
-            lDAPSearchScope = CreateIface::SearchScope::one;
-        }
-        else
-        {
-            lDAPSearchScope = CreateIface::SearchScope::base;
-        }
-
-        CreateIface::Type lDAPType;
-        // If the file is having a line which starts with "map group"
-        if (configValues["map"] == "group")
-        {
-            lDAPType = CreateIface::Type::ActiveDirectory;
-        }
-        else
-        {
-            lDAPType = CreateIface::Type::OpenLdap;
-        }
-
-        // Don't create the config object if either of the field is empty.
-        if (configValues["uri"] == "" || configValues["binddn"] == "" ||
-            configValues["base"] == "")
-        {
-            log<level::INFO>(
-                "LDAP config parameter value missing",
-                entry("URI=%s", configValues["uri"].c_str()),
-                entry("BASEDN=%s", configValues["base"].c_str()),
-                entry("BINDDN=%s", configValues["binddn"].c_str()));
-            return;
-        }
-
-        createConfig(std::move(configValues["uri"]),
-                     std::move(configValues["binddn"]),
-                     std::move(configValues["base"]),
-                     std::move(configValues["bindpw"]), lDAPSearchScope,
-                     lDAPType, std::move(configValues["map_passwd_uid"]),
-                     std::move(configValues["map_passwd_gidNumber"]));
-
-        // Get the enabled property value from the persistent location
-        if (!deserialize(dbusPersistentPath, *configPtr))
-        {
-            log<level::INFO>(
-                "Deserialization Failed, continue with service disable");
-        }
-    }
-    catch (const InvalidArgument& e)
-    {
-        // Don't throw - we don't want to create a D-Bus
-        // object upon finding empty values in config, as
-        // this can be a default config.
-    }
-    catch (const NoCACertificate& e)
-    {
-        // Don't throw - we don't want to create a D-Bus
-        // object upon finding "ssl on" without having tls_cacertFile in place,
-        // as this can be a default config.
-    }
-    catch (const InternalFailure& e)
-    {
-        throw;
-    }
-    catch (const std::exception& e)
-    {
-        log<level::ERR>(e.what());
-        elog<InternalFailure>();
-    }
-}
 } // namespace ldap
 } // namespace phosphor
diff --git a/phosphor-ldap-config/ldap_configuration.hpp b/phosphor-ldap-config/ldap_configuration.hpp
index d4fe5b7..8af4e4d 100644
--- a/phosphor-ldap-config/ldap_configuration.hpp
+++ b/phosphor-ldap-config/ldap_configuration.hpp
@@ -3,8 +3,8 @@
 #include "config.h"
 #include <xyz/openbmc_project/Object/Delete/server.hpp>
 #include <xyz/openbmc_project/Object/Enable/server.hpp>
-#include <xyz/openbmc_project/User/Ldap/Config/server.hpp>
 #include <xyz/openbmc_project/User/Ldap/Create/server.hpp>
+#include <xyz/openbmc_project/User/Ldap/Config/server.hpp>
 #include <xyz/openbmc_project/Common/error.hpp>
 #include <phosphor-logging/log.hpp>
 #include <phosphor-logging/elog.hpp>
@@ -17,8 +17,6 @@
 {
 namespace ldap
 {
-static constexpr auto defaultNslcdFile = "nslcd.conf.default";
-static constexpr auto nsSwitchFile = "nsswitch.conf";
 
 using namespace phosphor::logging;
 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
@@ -169,110 +167,5 @@
     friend class MockConfigMgr;
 };
 
-/** @class ConfigMgr
- *  @brief Creates LDAP server configuration.
- *  @details concrete implementation of xyz.openbmc_project.User.Ldap.Create
- *  APIs, in order to create LDAP configuration.
- */
-class ConfigMgr : public CreateIface
-{
-  public:
-    ConfigMgr() = delete;
-    ~ConfigMgr() = default;
-    ConfigMgr(const ConfigMgr&) = delete;
-    ConfigMgr& operator=(const ConfigMgr&) = delete;
-    ConfigMgr(ConfigMgr&&) = delete;
-    ConfigMgr& operator=(ConfigMgr&&) = delete;
-
-    /** @brief ConfigMgr to put object onto bus at a dbus path.
-     *  @param[in] bus - Bus to attach to.
-     *  @param[in] path - Path to attach at.
-     *  @param[in] filePath - LDAP configuration file.
-     *  @param[in] dbusPersistentPath - Persistent path for LDAP D-Bus property.
-     *  @param[in] caCertFile - LDAP's CA certificate file.
-     */
-    ConfigMgr(sdbusplus::bus::bus& bus, const char* path, const char* filePath,
-              const char* dbusPersistentPath, const char* caCertFile) :
-        CreateIface(bus, path, true),
-        dbusPersistentPath(dbusPersistentPath), configFilePath(filePath),
-        bus(bus)
-    {
-        try
-        {
-            restore(configFilePath.c_str());
-            emit_object_added();
-        }
-        catch (const std::exception& e)
-        {
-            configPtr.reset(nullptr);
-            log<level::ERR>(e.what());
-            elog<InternalFailure>();
-        }
-    }
-
-    /** @brief concrete implementation of the pure virtual funtion
-            xyz.openbmc_project.User.Ldap.Create.createConfig.
-     *  @param[in] lDAPServerURI - LDAP URI of the server.
-     *  @param[in] lDAPBindDN - distinguished name with which bind to bind
-            to the directory server for lookups.
-     *  @param[in] lDAPBaseDN -  distinguished name to use as search base.
-     *  @param[in] lDAPBindDNPassword - credentials with which to bind.
-     *  @param[in] lDAPSearchScope - the search scope.
-     *  @param[in] lDAPType - Specifies the LDAP server type which can be AD
-            or openLDAP.
-     *  @param[in] groupNameAttribute - Specifies attribute name that contains
-     *             the name of the Group in the LDAP server.
-     *  @param[in] usernameAttribute - Specifies attribute name that contains
-     *             the username in the LDAP server.
-     *  @returns the object path of the D-Bus object created.
-     */
-    std::string createConfig(std::string lDAPServerURI, std::string lDAPBindDN,
-                             std::string lDAPBaseDN,
-                             std::string lDAPBindDNPassword,
-                             CreateIface::SearchScope lDAPSearchScope,
-                             CreateIface::Type lDAPType,
-                             std::string groupNameAttribute,
-                             std::string userNameAttribute) override;
-
-    /** @brief restarts given service
-     *  @param[in] service - Service to be restarted.
-     */
-    virtual void restartService(const std::string& service);
-
-    /** @brief stops given service
-     *  @param[in] service - Service to be stopped.
-     */
-    virtual void stopService(const std::string& service);
-
-    /** @brief start or stop the service depending on the given value
-     *  @param[in] service - Service to be start/stop.
-     *  @param[in] value - true to start the service otherwise stop.
-     */
-    virtual void startOrStopService(const std::string& service, bool value);
-
-    /** @brief delete the config D-Bus object.
-     */
-    void deleteObject();
-
-    /* ldap service enabled property would be saved under
-     * this path.
-     */
-    std::string dbusPersistentPath;
-
-  protected:
-    std::string configFilePath{};
-    std::string tlsCacertFile{};
-
-    /** @brief Persistent sdbusplus D-Bus bus connection. */
-    sdbusplus::bus::bus& bus;
-
-    /** @brief Pointer to a Config D-Bus object */
-    std::unique_ptr<Config> configPtr = nullptr;
-
-    /** @brief Populate existing config into D-Bus properties
-     *  @param[in] filePath - LDAP config file path
-     */
-    virtual void restore(const char* filePath);
-};
 } // namespace ldap
 } // namespace phosphor
diff --git a/phosphor-ldap-config/main.cpp b/phosphor-ldap-config/main.cpp
index 2e3bf66..c6eaa5a 100644
--- a/phosphor-ldap-config/main.cpp
+++ b/phosphor-ldap-config/main.cpp
@@ -1,5 +1,5 @@
 #include "config.h"
-#include "ldap_configuration.hpp"
+#include "ldap_config_mgr.hpp"
 #include <experimental/filesystem>
 #include <phosphor-logging/log.hpp>
 #include <phosphor-logging/elog-errors.hpp>
diff --git a/test/Makefile.am b/test/Makefile.am
index 00f969c..17f5774 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -30,7 +30,8 @@
 ldap_config_test_SOURCES  = ldap_config_test.cpp utils_test.cpp
 ldap_config_test_LDADD  = $(top_builddir)/phosphor-ldap-config/ldap_configuration.o \
                           $(top_builddir)/phosphor-ldap-config/utils.o \
-                          $(top_builddir)/phosphor-ldap-config/ldap_serialize.o
+                          $(top_builddir)/phosphor-ldap-config/ldap_serialize.o \
+                          $(top_builddir)/phosphor-ldap-config/ldap_config_mgr.o
 
 check_PROGRAMS += ldap_mapper_test
 ldap_mapper_test_CPPFLAGS = $(cppflags)
diff --git a/test/ldap_config_test.cpp b/test/ldap_config_test.cpp
index f9cf386..4cbb363 100644
--- a/test/ldap_config_test.cpp
+++ b/test/ldap_config_test.cpp
@@ -1,5 +1,6 @@
 #include "config.h"
 #include "phosphor-ldap-config/ldap_configuration.hpp"
+#include "phosphor-ldap-config/ldap_config_mgr.hpp"
 #include "phosphor-ldap-config/ldap_serialize.hpp"
 
 #include <phosphor-logging/log.hpp>
