diff --git a/bmc_dump_entry.hpp b/bmc_dump_entry.hpp
index eb140e8..82312e0 100644
--- a/bmc_dump_entry.hpp
+++ b/bmc_dump_entry.hpp
@@ -1,11 +1,7 @@
 #pragma once
 
-#include "dump_entry.hpp"
-#include "xyz/openbmc_project/Common/FilePath/server.hpp"
+#include "bmcstored_dump_entry.hpp"
 #include "xyz/openbmc_project/Dump/Entry/BMC/server.hpp"
-#include "xyz/openbmc_project/Dump/Entry/server.hpp"
-#include "xyz/openbmc_project/Object/Delete/server.hpp"
-#include "xyz/openbmc_project/Time/EpochTime/server.hpp"
 
 #include <sdbusplus/bus.hpp>
 #include <sdbusplus/server/object.hpp>
@@ -22,8 +18,7 @@
 using ServerObject = typename sdbusplus::server::object_t<T>;
 
 using EntryIfaces = sdbusplus::server::object_t<
-    sdbusplus::xyz::openbmc_project::Dump::Entry::server::BMC,
-    sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
+    sdbusplus::xyz::openbmc_project::Dump::Entry::server::BMC>;
 
 using originatorTypes = sdbusplus::xyz::openbmc_project::Common::server::
     OriginatedBy::OriginatorTypes;
@@ -35,7 +30,9 @@
  *  @details A concrete implementation for the
  *  xyz.openbmc_project.Dump.Entry DBus API
  */
-class Entry : virtual public EntryIfaces, virtual public phosphor::dump::Entry
+class Entry :
+    virtual public EntryIfaces,
+    virtual public phosphor::dump::bmc_stored::Entry
 {
   public:
     Entry() = delete;
@@ -64,42 +61,13 @@
           phosphor::dump::OperationStatus status, std::string originatorId,
           originatorTypes originatorType, phosphor::dump::Manager& parent) :
         EntryIfaces(bus, objPath.c_str(), EntryIfaces::action::defer_emit),
-        phosphor::dump::Entry(bus, objPath.c_str(), dumpId, timeStamp, fileSize,
-                              status, originatorId, originatorType, parent)
+        phosphor::dump::bmc_stored::Entry(bus, objPath.c_str(), dumpId,
+                                          timeStamp, fileSize, file, status,
+                                          originatorId, originatorType, parent)
     {
-        path(file);
         // Emit deferred signal.
         this->phosphor::dump::bmc::EntryIfaces::emit_object_added();
     }
-
-    /** @brief Delete this d-bus object.
-     */
-    void delete_() override;
-
-    /** @brief Method to initiate the offload of dump
-     *  @param[in] uri - URI to offload dump
-     */
-    void initiateOffload(std::string uri) override;
-
-    /** @brief Method to update an existing dump entry, once the dump creation
-     *  is completed this function will be used to update the entry which got
-     *  created during the dump request.
-     *  @param[in] timeStamp - Dump creation timestamp
-     *  @param[in] fileSize - Dump file size in bytes.
-     *  @param[in] file - Name of dump file.
-     */
-    void update(uint64_t timeStamp, uint64_t fileSize,
-                const std::filesystem::path& filePath)
-    {
-        elapsed(timeStamp);
-        size(fileSize);
-        // TODO: Handled dump failed case with #ibm-openbmc/2808
-        status(OperationStatus::Completed);
-        path(filePath);
-        // TODO: serialization of this property will be handled with
-        // #ibm-openbmc/2597
-        completedTime(timeStamp);
-    }
 };
 
 } // namespace bmc
diff --git a/bmc_dump_entry.cpp b/bmcstored_dump_entry.cpp
similarity index 95%
rename from bmc_dump_entry.cpp
rename to bmcstored_dump_entry.cpp
index 188d262..302fd43 100644
--- a/bmc_dump_entry.cpp
+++ b/bmcstored_dump_entry.cpp
@@ -1,5 +1,4 @@
 #include "bmc_dump_entry.hpp"
-
 #include "dump_manager.hpp"
 #include "dump_offload.hpp"
 
@@ -11,7 +10,7 @@
 {
 namespace dump
 {
-namespace bmc
+namespace bmc_stored
 {
 using namespace phosphor::logging;
 
@@ -42,6 +41,6 @@
     offloaded(true);
 }
 
-} // namespace bmc
+} // namespace bmc_stored
 } // namespace dump
 } // namespace phosphor
diff --git a/bmcstored_dump_entry.hpp b/bmcstored_dump_entry.hpp
new file mode 100644
index 0000000..cc9705e
--- /dev/null
+++ b/bmcstored_dump_entry.hpp
@@ -0,0 +1,101 @@
+#pragma once
+
+#include "dump_entry.hpp"
+#include "xyz/openbmc_project/Common/FilePath/server.hpp"
+
+#include <sdbusplus/bus.hpp>
+#include <sdbusplus/server/object.hpp>
+
+#include <filesystem>
+
+namespace phosphor
+{
+namespace dump
+{
+namespace bmc_stored
+{
+
+template <typename T>
+using ServerObject = typename sdbusplus::server::object_t<T>;
+using FileIfaces = sdbusplus::server::object_t<
+    sdbusplus::xyz::openbmc_project::Common::server::FilePath>;
+
+class Manager;
+
+/** @class Entry
+ *  @brief Entry sase class for all dumps get stored on BMC.
+ *  @details A concrete implementation for the
+ *  xyz.openbmc_project.Dump.Entry DBus API
+ */
+class Entry : public phosphor::dump::Entry, public FileIfaces
+{
+  public:
+    Entry() = delete;
+    Entry(const Entry&) = delete;
+    Entry& operator=(const Entry&) = delete;
+    Entry(Entry&&) = delete;
+    Entry& operator=(Entry&&) = delete;
+    ~Entry() = default;
+
+    /** @brief Constructor for the Dump Entry Object
+     *  @param[in] bus - Bus to attach to.
+     *  @param[in] objPath - Object path to attach to
+     *  @param[in] dumpId - Dump id.
+     *  @param[in] timeStamp - Dump creation timestamp
+     *             since the epoch.
+     *  @param[in] fileSize - Dump file size in bytes.
+     *  @param[in] file - Name of dump file.
+     *  @param[in] status - status of the dump.
+     *  @param[in] originId - Id of the originator of the dump
+     *  @param[in] originType - Originator type
+     *  @param[in] parent - The dump entry's parent.
+     */
+    Entry(sdbusplus::bus_t& bus, const std::string& objPath, uint32_t dumpId,
+          uint64_t timeStamp, uint64_t fileSize,
+          const std::filesystem::path& file,
+          phosphor::dump::OperationStatus status, std::string originId,
+          originatorTypes originType, phosphor::dump::Manager& parent) :
+        phosphor::dump::Entry(bus, objPath.c_str(), dumpId, timeStamp, fileSize,
+                              status, originId, originType, parent),
+        FileIfaces(bus, objPath.c_str())
+    {
+        path(file);
+    }
+
+    /** @brief Delete this d-bus object.
+     */
+    void delete_() override;
+
+    /** @brief Method to initiate the offload of dump
+     *  @param[in] uri - URI to offload dump
+     */
+    void initiateOffload(std::string uri) override;
+
+    /** @brief Method to update an existing dump entry, once the dump creation
+     *  is completed this function will be used to update the entry which got
+     *  created during the dump request.
+     *  @param[in] timeStamp - Dump creation timestamp
+     *  @param[in] fileSize - Dump file size in bytes.
+     *  @param[in] file - Name of dump file.
+     */
+    void update(uint64_t timeStamp, uint64_t fileSize,
+                const std::filesystem::path& filePath)
+    {
+        elapsed(timeStamp);
+        size(fileSize);
+        // TODO: Handled dump failed case with #ibm-openbmc/2808
+        status(OperationStatus::Completed);
+        path(filePath);
+        // TODO: serialization of this property will be handled with
+        // #ibm-openbmc/2597
+        completedTime(timeStamp);
+    }
+
+  protected:
+    /** @Dump file name */
+    std::filesystem::path file;
+};
+
+} // namespace bmc_stored
+} // namespace dump
+} // namespace phosphor
diff --git a/meson.build b/meson.build
index da757e6..94ce4d0 100644
--- a/meson.build
+++ b/meson.build
@@ -169,7 +169,7 @@
         common_hpp,
         server_cpp,
         'watch.cpp',
-        'bmc_dump_entry.cpp',
+        'bmcstored_dump_entry.cpp',
         'dump_utils.cpp',
         'dump_offload.cpp',
         'dump_manager_faultlog.cpp',
