diff --git a/physical.hpp b/physical.hpp
index 47ad7d5..c8ef4fd 100644
--- a/physical.hpp
+++ b/physical.hpp
@@ -1,50 +1,22 @@
 #pragma once
 
+#include "sysfs.hpp"
+
 #include <fstream>
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server/object.hpp>
 #include <string>
 #include <xyz/openbmc_project/Led/Physical/server.hpp>
+
 namespace phosphor
 {
 namespace led
 {
-/** @brief Acts as input and output file for the current LED power state.
- *   Write "0" to trigger a LED OFF operation.
- *   Write "255" to trigger a LED ON operation.
- *   To know the current power state of the LED, a read on this
- *   would give either 0 or 255 indicating if the LED is currently
- *   Off / On AT THAT moment.
- *   Example: /sys/class/leds/myled/brightness
- */
-constexpr auto BRIGHTNESS = "/brightness";
-
 /** @brief Assert LED by writing 255 */
-constexpr auto ASSERT = "255";
+constexpr auto ASSERT = 255;
 
 /** @brief De-assert by writing "0" */
-constexpr auto DEASSERT = "0";
-
-/** @brief Write "timer" to this file telling the driver that
- *   the intended operation is BLINK. When the value "timer" is written to
- *   the file, 2 more files get auto generated and are named "delay_on" and
- *   "delay_off"
- *   To move away from blinking, write "none"
- *   Example:  /sys/class/leds/myled/trigger
- */
-constexpr auto BLINKCTRL = "/trigger";
-
-/** @brief write number of milliseconds that the LED needs to be ON
- *   while blinking. Default is 500 by the driver.
- *   Example:  /sys/class/leds/myled/delay_on
- */
-constexpr auto DELAYON = "/delay_on";
-
-/** @brief Write number of milliseconds that the LED needs to be OFF
- *   while blinking. Default is 500 by the driver.
- *   Example:  /sys/class/leds/myled/delay_off
- */
-constexpr auto DELAYOFF = "/delay_off";
+constexpr auto DEASSERT = 0;
 
 /** @class Physical
  *  @brief Responsible for applying actions on a particular physical LED
@@ -70,12 +42,12 @@
      * @param[in] ledPath   - sysfs path where this LED is exported
      */
     Physical(sdbusplus::bus::bus& bus, const std::string& objPath,
-             const std::string& ledPath) :
+             SysfsLed& led) :
 
         sdbusplus::server::object::object<
             sdbusplus::xyz::openbmc_project::Led::server::Physical>(
             bus, objPath.c_str(), true),
-        path(ledPath)
+        led(led)
     {
         // Suppose this is getting launched as part of BMC reboot, then we
         // need to save what the micro-controller currently has.
@@ -93,28 +65,15 @@
     Action state(Action value) override;
 
   private:
-    /** @brief File system location where this LED is exposed
-     *   Typically /sys/class/leds/<Led-Name>
+    /** @brief Associated LED implementation
      */
-    std::string path;
+    SysfsLed& led;
 
     /** @brief Frequency range that the LED can operate on.
      *  Will be removed when frequency is put into interface
      */
     uint32_t frequency;
 
-    /** @brief Brightness described above */
-    std::string brightCtrl;
-
-    /** @brief BlinkCtrl described above */
-    std::string blinkCtrl;
-
-    /** @brief delay_on described above */
-    std::string delayOnCtrl;
-
-    /** @brief delay_ff described above */
-    std::string delayOffCtrl;
-
     /** @brief reads sysfs and then setsup the parameteres accordingly
      *
      *  @return None
@@ -143,46 +102,6 @@
      *  @return None
      */
     void blinkOperation();
-
-    /** @brief Generic file writer.
-     *   There are files like "brightness", "trigger" , "delay_on" and
-     *   "delay_off" that will tell what the LED driver needs to do.
-     *
-     *  @param[in] filename - Name of file to be written
-     *  @param[in] data     - Data to be written to
-     *  @return             - None
-     */
-    template <typename T>
-    auto write(const std::string& fileName, T&& data)
-    {
-        if (std::ifstream(fileName))
-        {
-            std::ofstream file(fileName, std::ios::out);
-            file << data;
-            file.close();
-        }
-        return;
-    }
-
-    /** @brief Generic file reader.
-     *   There are files like "brightness", "trigger" , "delay_on" and
-     *   "delay_off" that will tell what the LED driver needs to do.
-     *
-     *  @param[in] filename - Name of file to be read
-     *  @return             - File content
-     */
-    template <typename T>
-    T read(const std::string& fileName)
-    {
-        T data = T();
-        if (std::ifstream(fileName))
-        {
-            std::ifstream file(fileName, std::ios::in);
-            file >> data;
-            file.close();
-        }
-        return data;
-    }
 };
 
 } // namespace led
