diff --git a/Makefile.am b/Makefile.am
index 85149c4..638cb0f 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,14 +3,13 @@
 # Build these headers, don't install them
 noinst_HEADERS = \
 	dump_entry.hpp \
-	dump_watch.hpp \
+	core_manager.hpp \
 	dump_internal.hpp \
 	dump_manager.hpp \
 	dump_utils.hpp \
 	watch.hpp
 
 nobase_nodist_include_HEADERS = \
-	xyz/openbmc_project/Dump/Monitor/error.hpp \
 	xyz/openbmc_project/Dump/Internal/Create/server.hpp
 
 sbin_PROGRAMS = \
@@ -25,9 +24,9 @@
 	xyz/openbmc_project/Dump/Internal/Create/server.cpp
 
 phosphor_dump_monitor_SOURCES = \
-	dump_watch_main.cpp \
-	dump_watch.cpp \
-	xyz/openbmc_project/Dump/Monitor/error.cpp
+	watch.cpp \
+	core_manager.cpp \
+	core_manager_main.cpp
 
 phosphor_dump_manager_CXXFLAGS = \
 	$(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
@@ -52,9 +51,7 @@
 # Be sure to build needed files before compiling
 BUILT_SOURCES = \
 	xyz/openbmc_project/Dump/Internal/Create/server.cpp \
-	xyz/openbmc_project/Dump/Internal/Create/server.hpp \
-	xyz/openbmc_project/Dump/Monitor/error.cpp \
-	xyz/openbmc_project/Dump/Monitor/error.hpp
+	xyz/openbmc_project/Dump/Internal/Create/server.hpp
 
 CLEANFILES=${BUILT_SOURCES}
 
@@ -70,12 +67,3 @@
 	@mkdir -p `dirname $@`
 	$(SDBUSPLUSPLUS) -r $(srcdir) interface server-header \
 xyz.openbmc_project.Dump.Internal.Create > $@
-
-xyz/openbmc_project/Dump/Monitor/error.hpp: \
-${top_srcdir}/xyz/openbmc_project/Dump/Monitor.errors.yaml
-	@mkdir -p `dirname $@`
-	$(SDBUSPLUSPLUS) -r $(srcdir) error exception-header xyz.openbmc_project.Dump.Monitor > $@
-
-xyz/openbmc_project/Dump/Monitor/error.cpp: ${top_srcdir}/xyz/openbmc_project/Dump/Monitor.errors.yaml
-	@mkdir -p `dirname $@`
-	$(SDBUSPLUSPLUS) -r $(srcdir) error exception-cpp xyz.openbmc_project.Dump.Monitor > $@
diff --git a/core_manager.cpp b/core_manager.cpp
new file mode 100644
index 0000000..8a91a27
--- /dev/null
+++ b/core_manager.cpp
@@ -0,0 +1,30 @@
+#include <unistd.h>
+#include <sys/inotify.h>
+
+#include "core_manager.hpp"
+
+namespace phosphor
+{
+namespace dump
+{
+namespace core
+{
+namespace manager
+{
+
+void watchCallback(const UserMap& fileInfo)
+{
+    for (const auto& i : fileInfo)
+    {
+        // For any new dump file create dump entry object.
+        if (IN_CLOSE_WRITE == i.second)
+        {
+            //TODO openbmc/openbmc#1795 Enable Dump collection function here
+        }
+    }
+}
+
+} // namespace manager
+} // namespace core
+} // namespace dump
+} // namespace phosphor
diff --git a/core_manager.hpp b/core_manager.hpp
new file mode 100644
index 0000000..19658a5
--- /dev/null
+++ b/core_manager.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <map>
+
+#include "dump_utils.hpp"
+#include "watch.hpp"
+
+namespace phosphor
+{
+namespace dump
+{
+namespace core
+{
+namespace manager
+{
+
+using UserMap = phosphor::dump::inotify::UserMap;
+
+/** @brief Implementation of core watch call back
+  * @param [in] fileInfo - map of file info  path:event
+  */
+void watchCallback(const UserMap& fileInfo);
+
+} // namespace manager
+} // namepsace core
+} // namespace dump
+} // namespace phosphor
diff --git a/core_manager_main.cpp b/core_manager_main.cpp
new file mode 100644
index 0000000..6f7383f
--- /dev/null
+++ b/core_manager_main.cpp
@@ -0,0 +1,56 @@
+#include <sdbusplus/bus.hpp>
+#include <phosphor-logging/elog-errors.hpp>
+
+#include "xyz/openbmc_project/Common/error.hpp"
+#include "config.h"
+#include "core_manager.hpp"
+#include "watch.hpp"
+
+int main(int argc, char* argv[])
+{
+    using namespace phosphor::logging;
+    using InternalFailure =
+        sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
+
+    auto bus = sdbusplus::bus::new_default();
+    sd_event* event = nullptr;
+    auto rc = sd_event_default(&event);
+    if (rc < 0)
+    {
+        log<level::ERR>("Error occurred during the sd_event_default",
+                        entry("rc=%d", rc));
+        report<InternalFailure>();
+        return -1;
+    }
+    phosphor::dump::EventPtr eventP{event};
+    event = nullptr;
+
+    try
+    {
+        phosphor::dump::inotify::Watch watch(
+            eventP,
+            IN_NONBLOCK,
+            IN_CLOSE_WRITE,
+            EPOLLIN,
+            CORE_FILE_DIR,
+            std::bind(
+                &phosphor::dump::core::manager::watchCallback,
+                std::placeholders::_1));
+
+        auto rc = sd_event_loop(eventP.get());
+        if (rc < 0)
+        {
+            log<level::ERR>("Error occurred during the sd_event_loop",
+                            entry("rc=%d", rc));
+            elog<InternalFailure>();
+        }
+    }
+
+    catch (InternalFailure& e)
+    {
+        commit<InternalFailure>();
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/dump_utils.hpp b/dump_utils.hpp
index 6ebee33..e985112 100644
--- a/dump_utils.hpp
+++ b/dump_utils.hpp
@@ -2,6 +2,7 @@
 
 #include <memory>
 #include <unistd.h>
+#include <systemd/sd-event.h>
 
 namespace phosphor
 {
diff --git a/dump_watch.cpp b/dump_watch.cpp
deleted file mode 100644
index 12a6c73..0000000
--- a/dump_watch.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-#include <sys/inotify.h>
-#include <experimental/filesystem>
-#include <phosphor-logging/elog-errors.hpp>
-#include <xyz/openbmc_project/Dump/Monitor/error.hpp>
-
-#include "config.h"
-#include "dump_watch.hpp"
-#include "elog-errors.hpp"
-#include "xyz/openbmc_project/Common/error.hpp"
-
-namespace phosphor
-{
-namespace dump
-{
-namespace inotify
-{
-
-using namespace std::string_literals;
-using namespace phosphor::logging;
-using namespace sdbusplus::xyz::openbmc_project::Dump::Monitor::Error;
-using namespace sdbusplus::xyz::openbmc_project::Common::Error;
-namespace fs = std::experimental::filesystem;
-
-Watch::~Watch()
-{
-    if ((fd() >= 0) && (wd >= 0))
-    {
-        inotify_rm_watch(fd(), wd);
-    }
-}
-
-Watch::Watch(sd_event* loop):
-    fd(inotifyInit())
-{
-    // Check if CORE DIR exists.
-    fs::path coreDirPath(CORE_FILE_DIR);
-    if (!fs::is_directory(coreDirPath))
-    {
-        namespace metadata = xyz::openbmc_project::Dump::Monitor;
-        elog<InvalidCorePath>(metadata::InvalidCorePath::PATH(CORE_FILE_DIR));
-    }
-
-    //Check for existing coredumps, Dump manager should handle this before
-    //starting the core monitoring.
-    //This is to handle coredumps created prior to Dump applications start,
-    //or missing coredump reporting due to Dump application crashs.
-    if (!fs::is_empty(coreDirPath))
-    {
-        //TODO openbmc/openbmc#1510 Enable Dump collection function here.
-    }
-
-    wd = inotify_add_watch(fd(), CORE_FILE_DIR, IN_CLOSE_WRITE);
-    if (-1 == wd)
-    {
-        auto error = errno;
-        log<level::ERR>("Error occurred during the inotify_add_watch call",
-                        entry("ERRNO=%s", strerror(error)));
-        elog<InternalFailure>();
-    }
-
-    auto rc = sd_event_add_io(loop,
-                              nullptr,
-                              fd(),
-                              EPOLLIN,
-                              callback,
-                              this);
-    if (0 > rc)
-    {
-        // Failed to add to event loop
-        auto error = errno;
-        log<level::ERR>("Error occurred during the sd_event_add_io call",
-                        entry("ERRNO=%s", strerror(error)));
-        elog<InternalFailure>();
-    }
-}
-
-int Watch::inotifyInit()
-{
-    auto fd = inotify_init1(IN_NONBLOCK);
-
-    if (-1 == fd)
-    {
-        auto error = errno;
-        log<level::ERR>("Error occurred during the inotify_init1",
-                        entry("ERRNO=%s", strerror(error)));
-        elog<InternalFailure>();
-    }
-
-    return fd;
-}
-
-int Watch::callback(sd_event_source* s,
-                    int fd,
-                    uint32_t revents,
-                    void* userdata)
-{
-    if (!(revents & EPOLLIN))
-    {
-        return 0;
-    }
-
-    //Maximum inotify events supported in the buffer
-    constexpr auto maxBytes = sizeof(struct inotify_event) + NAME_MAX + 1;
-    uint8_t buffer[maxBytes];
-
-    auto bytes = read(fd, buffer, maxBytes);
-    if (0 > bytes)
-    {
-        //Failed to read inotify event
-        //Report error and return
-        auto error = errno;
-        log<level::ERR>("Error occurred during the read",
-                        entry("ERRNO=%s", strerror(error)));
-        report<InternalFailure>();
-        return 0;
-    }
-
-    auto offset = 0;
-
-    std::vector<fs::path> corePaths;
-
-    while (offset < bytes)
-    {
-        auto event = reinterpret_cast<inotify_event*>(&buffer[offset]);
-        if ((event->mask & IN_CLOSE_WRITE) && !(event->mask & IN_ISDIR))
-        {
-            corePaths.emplace_back(fs::path(CORE_FILE_DIR) / event->name);
-        }
-
-        offset += offsetof(inotify_event, name) + event->len;
-    }
-
-    // Generate new BMC Dump( Core dump Type) incase valid cores
-    if (!corePaths.empty())
-    {
-        //TODO openbmc/openbmc#1510 Enable Dump collection function here
-    }
-    return 0;
-}
-
-} // namespace inotify
-} // namespace dump
-} // namespace phosphor
diff --git a/dump_watch.hpp b/dump_watch.hpp
deleted file mode 100644
index fdd301c..0000000
--- a/dump_watch.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#pragma once
-
-#include <systemd/sd-event.h>
-#include <unistd.h>
-#include "dump_utils.hpp"
-
-namespace phosphor
-{
-namespace dump
-{
-namespace inotify
-{
-
-/** @class Watch
- *
- *  @brief Adds inotify watch on core file directories.
- *
- *  The inotify watch is hooked up with sd-event, so that on call back,
- *  appropriate actions are taken to collect the core files.
- */
-class Watch
-{
-    public:
-        /** @brief ctor - hook inotify watch with sd-event
-         *
-         *  @param[in] loop - sd-event object
-         */
-        Watch(sd_event* loop);
-
-        Watch(const Watch&) = delete;
-        Watch& operator=(const Watch&) = delete;
-        Watch(Watch&&) = default;
-        Watch& operator=(Watch&&) = default;
-
-        /* @brief dtor - remove inotify watch and close fd's */
-        ~Watch();
-
-    private:
-        /** @brief sd-event callback
-         *
-         *  @param[in] s - event source, floating (unused) in our case
-         *  @param[in] fd - inotify fd
-         *  @param[in] revents - events that matched for fd
-         *  @param[in] userdata - pointer to Watch object
-         *  @returns 0 on success, -1 on fail
-         */
-        static int callback(sd_event_source* s,
-                            int fd,
-                            uint32_t revents,
-                            void* userdata);
-
-        /**  initialize an inotify instance and returns file descriptor */
-        int inotifyInit();
-
-        /** @brief core file directory watch descriptor */
-        int wd = -1;
-
-        /** @brief file descriptor manager */
-        CustomFd fd;
-};
-
-} // namespace inotify
-} // namespace dump
-} // namespace phosphor
diff --git a/dump_watch_main.cpp b/dump_watch_main.cpp
deleted file mode 100644
index d061ae1..0000000
--- a/dump_watch_main.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-#include "dump_watch.hpp"
-#include "elog-errors.hpp"
-#include "xyz/openbmc_project/Dump/Monitor/error.hpp"
-#include "xyz/openbmc_project/Common/error.hpp"
-
-#include <phosphor-logging/log.hpp>
-#include <phosphor-logging/elog.hpp>
-#include <phosphor-logging/elog-errors.hpp>
-
-int main(int argc, char* argv[])
-{
-    sd_event* loop = nullptr;
-    sd_event_default(&loop);
-
-    using namespace phosphor::logging;
-
-    using InvalidCorePath =
-        sdbusplus::xyz::openbmc_project::Dump::Monitor::Error::InvalidCorePath;
-    using InternalFailure =
-        sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
-
-    try
-    {
-        phosphor::dump::inotify::Watch watch(loop);
-        sd_event_loop(loop);
-    }
-
-    catch (InvalidCorePath& e)
-    {
-        commit<InvalidCorePath>();
-        return -1;
-    }
-
-    catch (InternalFailure& e)
-    {
-        commit<InternalFailure>();
-        return -1;
-    }
-
-    sd_event_unref(loop);
-
-    return 0;
-}
diff --git a/elog-errors.hpp b/elog-errors.hpp
deleted file mode 100644
index f5c6466..0000000
--- a/elog-errors.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-// This file was autogenerated.  Do not edit!
-// See elog-gen.py for more details
-#pragma once
-
-#include <string>
-#include <tuple>
-#include <type_traits>
-#include <sdbusplus/exception.hpp>
-#include <phosphor-logging/log.hpp>
-#include <phosphor-logging/elog.hpp>
-
-namespace sdbusplus
-{
-namespace xyz
-{
-namespace openbmc_project
-{
-namespace Dump
-{
-namespace Monitor
-{
-namespace Error
-{
-    struct InvalidCorePath;
-} // namespace Error
-} // namespace Monitor
-} // namespace Dump
-} // namespace openbmc_project
-} // namespace xyz
-} // namespace sdbusplus
-
-
-namespace phosphor
-{
-
-namespace logging
-{
-
-namespace xyz
-{
-namespace openbmc_project
-{
-namespace Dump
-{
-namespace Monitor
-{
-namespace _InvalidCorePath
-{
-
-struct PATH
-{
-    static constexpr auto str = "PATH=%s";
-    static constexpr auto str_short = "PATH";
-    using type = std::tuple<std::decay_t<decltype(str)>,const char*>;
-    explicit constexpr PATH(const char* a) : _entry(entry(str, a)) {};
-    type _entry;
-};
-
-}  // namespace _InvalidCorePath
-
-struct InvalidCorePath
-{
-    static constexpr auto L = level::ERR;
-    using PATH = _InvalidCorePath::PATH;
-    using metadata_types = std::tuple<PATH>;
-
-};
-
-} // namespace Monitor
-} // namespace Dump
-} // namespace openbmc_project
-} // namespace xyz
-
-
-namespace details
-{
-
-template <>
-struct map_exception_type<sdbusplus::xyz::openbmc_project::Dump::Monitor::Error::InvalidCorePath>
-{
-    using type = xyz::openbmc_project::Dump::Monitor::InvalidCorePath;
-};
-
-}
-
-
-} // namespace logging
-
-} // namespace phosphor
diff --git a/xyz/openbmc_project/Dump/Monitor.errors.yaml b/xyz/openbmc_project/Dump/Monitor.errors.yaml
deleted file mode 100644
index 7a2478c..0000000
--- a/xyz/openbmc_project/Dump/Monitor.errors.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-- name: InvalidCorePath
-  description: Invalid core directory path
diff --git a/xyz/openbmc_project/Dump/Monitor.metadata.yaml b/xyz/openbmc_project/Dump/Monitor.metadata.yaml
deleted file mode 100644
index 045a4ea..0000000
--- a/xyz/openbmc_project/Dump/Monitor.metadata.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-- name: InvalidCorePath
-  level: ERR
-  meta:
-    - str: "PATH=%s"
-      type: string
