diff --git a/phosphor-ldap-config/ldap_config.cpp b/phosphor-ldap-config/ldap_config.cpp
index 126cc46..03c6ffc 100644
--- a/phosphor-ldap-config/ldap_config.cpp
+++ b/phosphor-ldap-config/ldap_config.cpp
@@ -444,22 +444,28 @@
 
 bool Config::enabled(bool value)
 {
-    bool isEnable;
+    if (value == enabled())
+    {
+        return value;
+    }
+    // Let parent decide that can we enable this config.
+    // It may happen that other config is already enabled,
+    // Current implementation support only one config can
+    // be active at a time.
+    return parent.enableService(*this, value);
+}
+
+bool Config::enableService(bool value)
+{
+    bool isEnable = false;
     try
     {
-        if (value == enabled())
-        {
-            return value;
-        }
         isEnable = EnableIface::enabled(value);
         if (isEnable)
         {
             writeConfig();
         }
-        // TODO in later commit, one of the config would be active
-        // at any moment of time.
         parent.startOrStopService(nslcdService, value);
-        // save the object.
         serialize();
     }
     catch (const InternalFailure& e)
diff --git a/phosphor-ldap-config/ldap_config.hpp b/phosphor-ldap-config/ldap_config.hpp
index 6eceb50..0d2adf1 100644
--- a/phosphor-ldap-config/ldap_config.hpp
+++ b/phosphor-ldap-config/ldap_config.hpp
@@ -183,6 +183,12 @@
      */
     bool deserialize();
 
+    /** @brief enable or disable the service with the given value
+     *  @param[in] value - enable/disble
+     *  @returns value of changed status
+     */
+    bool enableService(bool value);
+
   private:
     bool secureLDAP;
     std::string lDAPBindPassword{};
diff --git a/phosphor-ldap-config/ldap_config_mgr.cpp b/phosphor-ldap-config/ldap_config_mgr.cpp
index 65d4bda..9142538 100644
--- a/phosphor-ldap-config/ldap_config_mgr.cpp
+++ b/phosphor-ldap-config/ldap_config_mgr.cpp
@@ -19,6 +19,8 @@
 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
 namespace fs = std::filesystem;
 using Argument = xyz::openbmc_project::Common::InvalidArgument;
+using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
+using NotAllowedArgument = xyz::openbmc_project::Common::NotAllowed;
 
 using Line = std::string;
 using Key = std::string;
@@ -172,6 +174,24 @@
     }
 }
 
+bool ConfigMgr::enableService(Config& config, bool value)
+{
+    if (value)
+    {
+        if (openLDAPConfigPtr && openLDAPConfigPtr->enabled())
+        {
+            elog<NotAllowed>(NotAllowedArgument::REASON(
+                "OpenLDAP service is already active"));
+        }
+        if (ADConfigPtr && ADConfigPtr->enabled())
+        {
+            elog<NotAllowed>(NotAllowedArgument::REASON(
+                "ActiveDirectory service is already active"));
+        }
+    }
+    return config.enableService(value);
+}
+
 void ConfigMgr::restore()
 {
     createDefaultObjects();
diff --git a/phosphor-ldap-config/ldap_config_mgr.hpp b/phosphor-ldap-config/ldap_config_mgr.hpp
index 812528b..dc04546 100644
--- a/phosphor-ldap-config/ldap_config_mgr.hpp
+++ b/phosphor-ldap-config/ldap_config_mgr.hpp
@@ -102,6 +102,11 @@
     /** @brief Populate existing config into D-Bus properties
      */
     virtual void restore();
+    /** @brief enable/disable the ldap service
+     *  @param[in] config - config  which needs to be enabled/disabled
+     *  @param[in] value - boolean value to start/stop
+     */
+    bool enableService(Config& config, bool value);
 
     /* ldap service enabled property would be saved under
      * this path.
diff --git a/test/ldap_config_test.cpp b/test/ldap_config_test.cpp
index 1e0171d..b625a51 100644
--- a/test/ldap_config_test.cpp
+++ b/test/ldap_config_test.cpp
@@ -21,6 +21,9 @@
 {
 namespace fs = std::filesystem;
 namespace ldap_base = sdbusplus::xyz::openbmc_project::User::Ldap::server;
+using NotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
+using NotAllowedArgument = xyz::openbmc_project::Common::NotAllowed;
+
 using Config = phosphor::ldap::Config;
 static constexpr const char* dbusPersistFile = "Config";
 
@@ -483,5 +486,66 @@
     delete managerPtr;
 }
 
+TEST_F(TestLDAPConfig, ConditionalEnableConfig)
+{
+    auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
+    auto tlsCacertfile = std::string(dir.c_str()) + "/" + tslCacertFile;
+    auto dbusPersistentFilePath = std::string(dir.c_str());
+
+    if (fs::exists(configFilePath))
+    {
+        fs::remove(configFilePath);
+    }
+    EXPECT_FALSE(fs::exists(configFilePath));
+    MockConfigMgr* managerPtr = new MockConfigMgr(
+        bus, LDAP_CONFIG_ROOT, configFilePath.c_str(),
+        dbusPersistentFilePath.c_str(), tlsCacertfile.c_str());
+    EXPECT_CALL(*managerPtr, stopService("nslcd.service")).Times(3);
+    EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(2);
+    EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
+    managerPtr->createConfig(
+        "ldap://9.194.251.138/", "cn=Users,dc=com", "cn=Users,dc=corp",
+        "MyLdap12", ldap_base::Create::SearchScope::sub,
+        ldap_base::Create::Type::ActiveDirectory, "attr1", "attr2");
+
+    managerPtr->createConfig(
+        "ldap://9.194.251.139/", "cn=Users,dc=com, dc=ldap", "cn=Users,dc=corp",
+        "MyLdap123", ldap_base::Create::SearchScope::sub,
+        ldap_base::Create::Type::OpenLdap, "attr1", "attr2");
+
+    // Enable the AD configuration
+    managerPtr->getADConfigPtr()->enabled(true);
+
+    EXPECT_EQ(managerPtr->getADConfigPtr()->enabled(), true);
+    EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), false);
+
+    // AS AD is already enabled so openldap can't be enabled.
+    EXPECT_THROW(
+        {
+            try
+            {
+                managerPtr->getOpenLdapConfigPtr()->enabled(true);
+            }
+            catch (const NotAllowed& e)
+            {
+                throw;
+            }
+        },
+        NotAllowed);
+    // Check the values
+    EXPECT_EQ(managerPtr->getADConfigPtr()->enabled(), true);
+    EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), false);
+    // Let's disable the AD.
+    managerPtr->getADConfigPtr()->enabled(false);
+    EXPECT_EQ(managerPtr->getADConfigPtr()->enabled(), false);
+    EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), false);
+    // Now enable the openldap
+    managerPtr->getOpenLdapConfigPtr()->enabled(true);
+    EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), true);
+    EXPECT_EQ(managerPtr->getADConfigPtr()->enabled(), false);
+
+    delete managerPtr;
+}
+
 } // namespace ldap
 } // namespace phosphor
