diff --git a/interfaces/internal_interface.cpp b/interfaces/internal_interface.cpp
new file mode 100644
index 0000000..95a61e9
--- /dev/null
+++ b/interfaces/internal_interface.cpp
@@ -0,0 +1,193 @@
+/**
+ * Copyright © 2020 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "internal_interface.hpp"
+
+#include <sdbusplus/message.hpp>
+
+namespace phosphor
+{
+namespace led
+{
+namespace sysfs
+{
+namespace interface
+{
+
+InternalInterface::InternalInterface(sdbusplus::bus_t& bus, const char* path) :
+    bus(bus), serverInterface(bus, path, internalInterface, vtable.data(), this)
+{}
+
+void InternalInterface::getLedDescr(const std::string& name, LedDescr& ledDescr)
+{
+    std::vector<std::string> words;
+    boost::split(words, name, boost::is_any_of(":"));
+    try
+    {
+        ledDescr.devicename = words.at(0);
+        ledDescr.color = words.at(1);
+        ledDescr.function = words.at(2);
+    }
+    catch (const std::out_of_range& e)
+    {
+        lg2::warning("LED description {DESC} not well formed, error {ERR}",
+                     "DESC", name, "ERR", e.what());
+        throw e;
+    }
+}
+
+std::string InternalInterface::getDbusName(const LedDescr& ledDescr)
+{
+    std::vector<std::string> words;
+    words.emplace_back(ledDescr.devicename);
+    if (!ledDescr.function.empty())
+    {
+        words.emplace_back(ledDescr.function);
+    }
+
+    if (!ledDescr.color.empty())
+    {
+        words.emplace_back(ledDescr.color);
+    }
+
+    std::string s = boost::join(words, "_");
+
+    sdbusplus::message::object_path path(s);
+
+    return path.str;
+}
+
+void InternalInterface::createLEDPath(const std::string& ledName)
+{
+    std::string name;
+    std::string path = devParent + ledName;
+
+    if (!std::filesystem::exists(fs::path(path)))
+    {
+        lg2::error("No such directory {PATH}", "PATH", path);
+        return;
+    }
+
+    // Convert LED name in sysfs into DBus name
+    LedDescr ledDescr;
+    try
+    {
+        getLedDescr(ledName, ledDescr);
+    }
+    catch (...)
+    {
+        // Ignore the error, for simple LED which was not added in 3-part form.
+        // The simple LED can appear with it's plain name
+    }
+    name = getDbusName(ledDescr);
+
+    lg2::debug("LED {NAME} receives dbus name {DBUSNAME}", "NAME", ledName,
+               "DBUSNAME", name);
+
+    // Unique path name representing a single LED.
+    sdbusplus::message::object_path objPath = std::string(physParent);
+    objPath /= name;
+
+    if (leds.contains(objPath))
+    {
+        return;
+    }
+
+    auto sled = std::make_unique<phosphor::led::SysfsLed>(fs::path(path));
+
+    leds.emplace(objPath, std::make_unique<phosphor::led::Physical>(
+                              bus, objPath, std::move(sled), ledDescr.color));
+}
+
+void InternalInterface::addLED(const std::string& name)
+{
+    createLEDPath(name);
+}
+
+// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
+void InternalInterface::removeLED(const std::string& name)
+{
+    lg2::debug("RemoveLED is not configured {NAME}", "NAME", name);
+}
+
+int InternalInterface::addLedConfigure(sd_bus_message* msg, void* context,
+                                       sd_bus_error* error)
+{
+    if (msg == nullptr && context == nullptr)
+    {
+        lg2::error("Unable to configure addLed");
+        return -EINVAL;
+    }
+
+    try
+    {
+        auto message = sdbusplus::message_t(msg);
+        auto ledName = message.unpack<std::string>();
+
+        auto* self = static_cast<InternalInterface*>(context);
+        self->addLED(ledName);
+
+        auto reply = message.new_method_return();
+        reply.method_return();
+    }
+    catch (const sdbusplus::exception_t& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+
+    return 1;
+}
+
+int InternalInterface::removeLedConfigure(sd_bus_message* msg, void* context,
+                                          sd_bus_error* error)
+{
+    if (msg == nullptr && context == nullptr)
+    {
+        lg2::error("Unable to configure removeLed");
+        return -EINVAL;
+    }
+
+    try
+    {
+        auto message = sdbusplus::message_t(msg);
+        auto ledName = message.unpack<std::string>();
+
+        auto* self = static_cast<InternalInterface*>(context);
+        self->removeLED(ledName);
+
+        auto reply = message.new_method_return();
+        reply.method_return();
+    }
+    catch (const sdbusplus::exception_t& e)
+    {
+        return sd_bus_error_set(error, e.name(), e.description());
+    }
+
+    return 1;
+}
+
+const std::array<sdbusplus::vtable::vtable_t, 4> InternalInterface::vtable = {
+    sdbusplus::vtable::start(),
+    // AddLed method takes a string parameter and returns void
+    sdbusplus::vtable::method("AddLED", "s", "", addLedConfigure),
+    // RemoveLed method takes a string parameter and returns void
+    sdbusplus::vtable::method("RemoveLED", "s", "", removeLedConfigure),
+    sdbusplus::vtable::end()};
+
+} // namespace interface
+} // namespace sysfs
+} // namespace led
+} // namespace phosphor
diff --git a/interfaces/internal_interface.hpp b/interfaces/internal_interface.hpp
new file mode 100644
index 0000000..25d530d
--- /dev/null
+++ b/interfaces/internal_interface.hpp
@@ -0,0 +1,152 @@
+#pragma once
+
+#include "physical.hpp"
+
+#include <boost/algorithm/string.hpp>
+#include <phosphor-logging/lg2.hpp>
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/interface.hpp>
+#include <sdbusplus/vtable.hpp>
+
+#include <unordered_map>
+
+static constexpr auto busName = "xyz.openbmc_project.LED.Controller";
+static constexpr auto ledPath = "/xyz/openbmc_project/led";
+static constexpr auto physParent = "/xyz/openbmc_project/led/physical";
+static constexpr auto devParent = "/sys/class/leds/";
+static constexpr auto internalInterface =
+    "xyz.openbmc_project.Led.Sysfs.Internal";
+static constexpr auto ledAddMethod = "AddLED";
+
+namespace phosphor
+{
+namespace led
+{
+namespace sysfs
+{
+namespace interface
+{
+
+class InternalInterface
+{
+  public:
+    InternalInterface() = delete;
+    InternalInterface(const InternalInterface&) = delete;
+    InternalInterface& operator=(const InternalInterface&) = delete;
+    InternalInterface(InternalInterface&&) = delete;
+    InternalInterface& operator=(InternalInterface&&) = delete;
+    virtual ~InternalInterface() = default;
+
+    /**
+     *  @brief Construct a class to put object onto bus at a dbus path.
+     *
+     *  @param[in] bus  - D-Bus object.
+     *  @param[in] path - D-Bus Path.
+     */
+
+    InternalInterface(sdbusplus::bus_t& bus, const char* path);
+
+    /**
+     *  @brief Implementation for the AddLed method to add
+     *  the LED name to dbus path.
+     *
+     *  @param[in] name - LED name to add.
+     */
+
+    void addLED(const std::string& name);
+
+    /**
+     *  @brief Implementation for the RemoveLed method to remove
+     *  the LED name to dbus path.
+     *
+     *  @param[in] name - LED name to remove.
+     */
+
+    void removeLED(const std::string& name);
+
+  private:
+    /**
+     *  @brief  Unordered map to declare the sysfs LEDs
+     */
+
+    std::unordered_map<std::string, std::unique_ptr<phosphor::led::Physical>>
+        leds;
+
+    /**
+     *  @brief Structure to define the LED sysfs name
+     */
+
+    struct LedDescr
+    {
+        std::string devicename;
+        std::string color;
+        std::string function;
+    };
+
+    /**
+     *  @brief sdbusplus D-Bus connection.
+     */
+
+    sdbusplus::bus_t& bus;
+
+    /**
+     *  @brief Systemd bus callback for the AddLed method.
+     */
+
+    static int addLedConfigure(sd_bus_message* msg, void* context,
+                               sd_bus_error* error);
+
+    /**
+     *  @brief Systemd bus callback for the RemoveLed method.
+     */
+
+    static int removeLedConfigure(sd_bus_message* msg, void* context,
+                                  sd_bus_error* error);
+
+    /**
+     *  @brief Systemd vtable structure that contains all the
+     *  methods, signals, and properties of this interface with their
+     *  respective systemd attributes
+     */
+
+    static const std::array<sdbusplus::vtable::vtable_t, 4> vtable;
+
+    /**
+     *  @brief Support for the dbus based instance of this interface.
+     */
+
+    sdbusplus::server::interface_t serverInterface;
+
+    /**
+     *   @brief Implementation to create a dbus path for LED.
+     *
+     *   @param[in] name - LED name.
+     */
+
+    void createLEDPath(const std::string& ledName);
+
+    /** @brief Parse LED name in sysfs
+     *
+     *  Parse sysfs LED name in format "devicename:colour:function"
+     *  or "devicename:colour" or "devicename" and sets corresponding
+     *  fields in LedDescr struct.
+     *
+     *  @param[in] name      - LED name in sysfs
+     *  @param[out] ledDescr - LED description
+     */
+
+    static void getLedDescr(const std::string& name, LedDescr& ledDescr);
+
+    /** @brief Generates LED DBus name from LED description
+     *
+     *  @param[in] name      - LED description
+     *  @return              - DBus LED name
+     */
+
+    static std::string getDbusName(const LedDescr& ledDescr);
+};
+
+} // namespace interface
+} // namespace sysfs
+} // namespace led
+} // namespace phosphor
