diff --git a/extensions/openpower-pels/host_notifier.cpp b/extensions/openpower-pels/host_notifier.cpp
new file mode 100644
index 0000000..ec5db41
--- /dev/null
+++ b/extensions/openpower-pels/host_notifier.cpp
@@ -0,0 +1,107 @@
+/**
+ * Copyright © 2019 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 "host_notifier.hpp"
+
+#include <phosphor-logging/log.hpp>
+
+namespace openpower::pels
+{
+
+const auto subscriptionName = "PELHostNotifier";
+
+using namespace phosphor::logging;
+
+HostNotifier::HostNotifier(Repository& repo, DataInterfaceBase& dataIface,
+                           std::unique_ptr<HostInterface> hostIface) :
+    _repo(repo),
+    _dataIface(dataIface), _hostIface(std::move(hostIface))
+{
+    // Subscribe to be told about new PELs.
+    _repo.subscribeToAdds(subscriptionName,
+                          std::bind(std::mem_fn(&HostNotifier::newLogCallback),
+                                    this, std::placeholders::_1));
+
+    // Add any existing PELs to the queue to send them if necessary.
+    _repo.for_each(std::bind(std::mem_fn(&HostNotifier::addPELToQueue), this,
+                             std::placeholders::_1));
+
+    // Subscribe to be told about host state changes.
+    _dataIface.subscribeToHostStateChange(
+        subscriptionName,
+        std::bind(std::mem_fun(&HostNotifier::hostStateChange), this,
+                  std::placeholders::_1));
+
+    // Set the function to call when the async reponse is received.
+    _hostIface->setResponseFunction(
+        std::bind(std::mem_fn(&HostNotifier::commandResponse), this,
+                  std::placeholders::_1));
+
+    // Start sending logs if the host is running
+    if (!_pelQueue.empty() && _dataIface.isHostUp())
+    {
+        doNewLogNotify();
+    }
+}
+
+HostNotifier::~HostNotifier()
+{
+    _repo.unsubscribeFromAdds(subscriptionName);
+    _dataIface.unsubscribeFromHostStateChange(subscriptionName);
+}
+
+bool HostNotifier::addPELToQueue(const PEL& pel)
+{
+    if (enqueueRequired(pel.id()))
+    {
+        _pelQueue.push_back(pel.id());
+    }
+
+    // Return false so that Repo::for_each keeps going.
+    return false;
+}
+
+bool HostNotifier::enqueueRequired(uint32_t id) const
+{
+    bool required = true;
+
+    return required;
+}
+
+void HostNotifier::newLogCallback(const PEL& pel)
+{
+    if (!enqueueRequired(pel.id()))
+    {
+        return;
+    }
+
+    _pelQueue.push_back(pel.id());
+
+    // TODO: Check if a send is needed now
+}
+
+void HostNotifier::doNewLogNotify()
+{
+}
+
+void HostNotifier::hostStateChange(bool hostUp)
+{
+}
+
+void HostNotifier::commandResponse(ResponseStatus status)
+{
+}
+
+} // namespace openpower::pels
diff --git a/extensions/openpower-pels/host_notifier.hpp b/extensions/openpower-pels/host_notifier.hpp
new file mode 100644
index 0000000..ee1ba0c
--- /dev/null
+++ b/extensions/openpower-pels/host_notifier.hpp
@@ -0,0 +1,125 @@
+#pragma once
+
+#include "host_interface.hpp"
+#include "pel.hpp"
+#include "repository.hpp"
+
+#include <deque>
+
+namespace openpower::pels
+{
+
+/**
+ * @class HostNotifier
+ *
+ * This class handles notifying the host firmware of new PELs.
+ */
+class HostNotifier
+{
+  public:
+    HostNotifier() = delete;
+    HostNotifier(const HostNotifier&) = delete;
+    HostNotifier& operator=(const HostNotifier&) = delete;
+    HostNotifier(HostNotifier&&) = delete;
+    HostNotifier& operator=(HostNotifier&&) = delete;
+
+    /**
+     * @brief Constructor
+     *
+     * @param[in] repo - The PEL repository object
+     * @param[in] dataIface - The data interface object
+     * @param[in] hostIface - The host interface object
+     */
+    HostNotifier(Repository& repo, DataInterfaceBase& dataIface,
+                 std::unique_ptr<HostInterface> hostIface);
+
+    /**
+     * @brief Destructor
+     */
+    ~HostNotifier();
+
+    /**
+     * @brief Returns the PEL queue size.
+     *
+     * For testing.
+     *
+     * @return size_t - The queue size
+     */
+    size_t queueSize() const
+    {
+        return _pelQueue.size();
+    }
+
+    /**
+     * @brief Specifies if the PEL needs to go onto the queue to be
+     *        set to the host.
+     *
+     * @param[in] id - The PEL ID
+     *
+     * @return bool - If enqueue is required
+     */
+    bool enqueueRequired(uint32_t id) const;
+
+  private:
+    /**
+     * @brief This function gets called by the Repository class
+     *        when a new PEL is added to it.
+     *
+     * @param[in] pel - The new PEL
+     */
+    void newLogCallback(const PEL& pel);
+
+    /**
+     * @brief This function runs on every existing PEL at startup
+     *        and puts the PEL on the queue to send if necessary.
+     *
+     * @param[in] pel - The PEL
+     *
+     * @return bool - This is an indicator to the Repository::for_each
+     *                function to traverse every PEL.  Always false.
+     */
+    bool addPELToQueue(const PEL& pel);
+
+    /**
+     * @brief Takes the PEL off the front of the queue and issues
+     *        the PLDM send.
+     */
+    void doNewLogNotify();
+
+    /**
+     * @brief Called when the host changes state.
+     *
+     * @param[in] hostUp - The new host state
+     */
+    void hostStateChange(bool hostUp);
+
+    /**
+     * @brief The callback function invoked after the asynchronous
+     *        PLDM receive function is complete.
+     *
+     * @param[in] status - The response status
+     */
+    void commandResponse(ResponseStatus status);
+
+    /**
+     * @brief The PEL repository object
+     */
+    Repository& _repo;
+
+    /**
+     * @brief The data interface object
+     */
+    DataInterfaceBase& _dataIface;
+
+    /**
+     * @brief Base class pointer for the host command interface
+     */
+    std::unique_ptr<HostInterface> _hostIface;
+
+    /**
+     * @brief The list of PEL IDs that need to be sent.
+     */
+    std::deque<uint32_t> _pelQueue;
+};
+
+} // namespace openpower::pels
diff --git a/extensions/openpower-pels/manager.hpp b/extensions/openpower-pels/manager.hpp
index 5f092f4..731dd16 100644
--- a/extensions/openpower-pels/manager.hpp
+++ b/extensions/openpower-pels/manager.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "data_interface.hpp"
+#include "host_notifier.hpp"
 #include "log_manager.hpp"
 #include "paths.hpp"
 #include "registry.hpp"
@@ -28,9 +29,10 @@
      * @brief constructor
      *
      * @param[in] logManager - internal::Manager object
+     * @param[in] dataIface - The data interface object
      */
-    explicit Manager(phosphor::logging::internal::Manager& logManager,
-                     std::unique_ptr<DataInterfaceBase>&& dataIface) :
+    Manager(phosphor::logging::internal::Manager& logManager,
+            std::unique_ptr<DataInterfaceBase> dataIface) :
         _logManager(logManager),
         _repo(getPELRepoPath()),
         _registry(getMessageRegistryPath() / message::registryFileName),
@@ -39,6 +41,22 @@
     }
 
     /**
+     * @brief constructor that enables host notification
+     *
+     * @param[in] logManager - internal::Manager object
+     * @param[in] dataIface - The data interface object
+     * @param[in] hostIface - The hostInterface object
+     */
+    Manager(phosphor::logging::internal::Manager& logManager,
+            std::unique_ptr<DataInterfaceBase> dataIface,
+            std::unique_ptr<HostInterface> hostIface) :
+        Manager(logManager, std::move(dataIface))
+    {
+        _hostNotifier = std::make_unique<HostNotifier>(
+            _repo, *(_dataIface.get()), std::move(hostIface));
+    }
+
+    /**
      * @brief Creates a PEL based on the OpenBMC event log contents.  If
      *        a PEL was passed in via the RAWPEL specifier in the
      *        additionalData parameter, use that instead.
@@ -117,6 +135,12 @@
      * @brief The API the PEL sections use to gather data
      */
     std::unique_ptr<DataInterfaceBase> _dataIface;
+
+    /**
+     * @brief The HostNotifier object used for telling the
+     *        host about new PELs
+     */
+    std::unique_ptr<HostNotifier> _hostNotifier;
 };
 
 } // namespace pels
diff --git a/extensions/openpower-pels/openpower-pels.mk b/extensions/openpower-pels/openpower-pels.mk
index f028293..220668f 100644
--- a/extensions/openpower-pels/openpower-pels.mk
+++ b/extensions/openpower-pels/openpower-pels.mk
@@ -1,5 +1,6 @@
 phosphor_log_manager_SOURCES += \
 	extensions/openpower-pels/entry_points.cpp \
+	extensions/openpower-pels/host_notifier.cpp \
 	extensions/openpower-pels/manager.cpp \
 	extensions/openpower-pels/repository.cpp \
 	extensions/openpower-pels/user_data.cpp
diff --git a/test/openpower-pels/Makefile.include b/test/openpower-pels/Makefile.include
index d85f215..2ce9498 100644
--- a/test/openpower-pels/Makefile.include
+++ b/test/openpower-pels/Makefile.include
@@ -8,6 +8,7 @@
 	failing_mtms_test \
 	fru_identity_test \
 	generic_section_test \
+	host_notifier_test \
 	log_id_test \
 	mru_test \
 	mtms_test \
@@ -145,6 +146,7 @@
 	$(test_ldadd) \
 	$(pel_objects) \
 	$(top_builddir)/extensions/openpower-pels/data_interface.o \
+	$(top_builddir)/extensions/openpower-pels/host_notifier.o \
 	$(top_builddir)/extensions/openpower-pels/manager.o \
 	$(top_builddir)/extensions/openpower-pels/repository.o
 pel_manager_test_LDFLAGS = $(test_ldflags)
@@ -316,3 +318,16 @@
 	$(test_ldflags) \
 	$(top_builddir)/extensions/openpower-pels/pel_rules.o
 pel_rules_test_LDFLAGS = $(test_ldflags)
+
+host_notifier_test_SOURCES = \
+	%reldir%/host_notifier_test.cpp \
+	%reldir%/paths.cpp \
+	%reldir%/pel_utils.cpp
+host_notifier_test_CPPFLAGS = $(test_cppflags)
+host_notifier_test_CXXFLAGS = $(test_cxxflags) $(SDEVENTPLUS_CFLAGS)
+host_notifier_test_LDADD = \
+	$(test_ldflags) \
+	$(pel_objects) \
+	$(top_builddir)/extensions/openpower-pels/host_notifier.o \
+	$(top_builddir)/extensions/openpower-pels/repository.o
+host_notifier_test_LDFLAGS = $(test_ldflags) $(SDEVENTPLUS_LIBS)
diff --git a/test/openpower-pels/host_notifier_test.cpp b/test/openpower-pels/host_notifier_test.cpp
new file mode 100644
index 0000000..2d50dcf
--- /dev/null
+++ b/test/openpower-pels/host_notifier_test.cpp
@@ -0,0 +1,135 @@
+/**
+ * Copyright © 2019 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 "extensions/openpower-pels/data_interface.hpp"
+#include "extensions/openpower-pels/host_notifier.hpp"
+#include "mocks.hpp"
+#include "pel_utils.hpp"
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <chrono>
+
+#include <gtest/gtest.h>
+
+using namespace openpower::pels;
+using ::testing::_;
+using ::testing::Invoke;
+using ::testing::Return;
+namespace fs = std::filesystem;
+using namespace std::chrono;
+
+const size_t actionFlags0Offset = 66;
+const size_t actionFlags1Offset = 67;
+
+class HostNotifierTest : public CleanPELFiles
+{
+};
+
+/**
+ * @brief Create PEL with the specified action flags
+ *
+ * @param[in] actionFlagsMask - Optional action flags to use
+ *
+ * @return std::unique_ptr<PEL>
+ */
+std::unique_ptr<PEL> makePEL(uint16_t actionFlagsMask = 0)
+{
+    static uint32_t obmcID = 1;
+    auto data = pelDataFactory(TestPELType::pelSimple);
+
+    data[actionFlags0Offset] |= actionFlagsMask >> 8;
+    data[actionFlags1Offset] |= actionFlagsMask & 0xFF;
+
+    auto pel = std::make_unique<PEL>(data, obmcID++);
+    pel->assignID();
+    pel->setCommitTime();
+    return pel;
+}
+
+// Test that host state change callbacks work
+TEST_F(HostNotifierTest, TestHostStateChange)
+{
+    MockDataInterface dataIface;
+
+    bool hostState = false;
+    bool called = false;
+    DataInterfaceBase::HostStateChangeFunc func = [&hostState,
+                                                   &called](bool state) {
+        hostState = state;
+        called = true;
+    };
+
+    dataIface.subscribeToHostStateChange("test", func);
+
+    // callback called
+    dataIface.changeHostState(true);
+    EXPECT_TRUE(called);
+    EXPECT_TRUE(hostState);
+
+    // No change, not called
+    called = false;
+    dataIface.changeHostState(true);
+    EXPECT_FALSE(called);
+
+    // Called again
+    dataIface.changeHostState(false);
+    EXPECT_FALSE(hostState);
+    EXPECT_TRUE(called);
+
+    // Shouldn't get called after an unsubscribe
+    dataIface.unsubscribeFromHostStateChange("test");
+
+    called = false;
+
+    dataIface.changeHostState(true);
+    EXPECT_FALSE(called);
+}
+
+// Test that PELs are enqueued on startup
+TEST_F(HostNotifierTest, TestStartup)
+{
+    Repository repo{repoPath};
+    MockDataInterface dataIface;
+
+    // Give the repo 10 PELs to start with
+    for (int i = 0; i < 10; i++)
+    {
+        auto pel = makePEL();
+        repo.add(pel);
+    }
+
+    sd_event* event = nullptr;
+    auto r = sd_event_default(&event);
+    ASSERT_TRUE(r >= 0);
+
+    std::unique_ptr<HostInterface> hostIface =
+        std::make_unique<MockHostInterface>(event, dataIface);
+
+    HostNotifier notifier{repo, dataIface, std::move(hostIface)};
+
+    ASSERT_EQ(notifier.queueSize(), 10);
+
+    // Now add 10 more after the notifier is watching
+    for (int i = 0; i < 10; i++)
+    {
+        auto pel = makePEL();
+        repo.add(pel);
+    }
+
+    ASSERT_EQ(notifier.queueSize(), 20);
+}
diff --git a/test/openpower-pels/mocks.hpp b/test/openpower-pels/mocks.hpp
index 1dc0902..c2a84a0 100644
--- a/test/openpower-pels/mocks.hpp
+++ b/test/openpower-pels/mocks.hpp
@@ -1,4 +1,10 @@
 #include "extensions/openpower-pels/data_interface.hpp"
+#include "extensions/openpower-pels/host_interface.hpp"
+
+#include <fcntl.h>
+
+#include <filesystem>
+#include <sdeventplus/source/io.hpp>
 
 #include <gmock/gmock.h>
 
@@ -13,10 +19,53 @@
     MockDataInterface()
     {
     }
-    MOCK_CONST_METHOD0(getMachineTypeModel, std::string());
-    MOCK_CONST_METHOD0(getMachineSerialNumber, std::string());
-    MOCK_CONST_METHOD0(getServerFWVersion, std::string());
-    MOCK_CONST_METHOD0(getBMCFWVersion, std::string());
+    MOCK_METHOD(std::string, getMachineTypeModel, (), (const override));
+    MOCK_METHOD(std::string, getMachineSerialNumber, (), (const override));
+    MOCK_METHOD(std::string, getServerFWVersion, (), (const override));
+    MOCK_METHOD(std::string, getBMCFWVersion, (), (const override));
+
+    void changeHostState(bool newState)
+    {
+        setHostState(newState);
+    }
+
+    void setHMCManaged(bool managed)
+    {
+        _hmcManaged = managed;
+    }
+};
+
+/**
+ * @brief The mock HostInterface class
+ */
+class MockHostInterface : public HostInterface
+{
+  public:
+    MockHostInterface(sd_event* event, DataInterfaceBase& dataIface) :
+        HostInterface(event, dataIface)
+    {
+    }
+
+    virtual ~MockHostInterface()
+    {
+    }
+
+    virtual void cancelCmd() override
+    {
+    }
+
+    MOCK_METHOD(CmdStatus, sendNewLogCmd, (uint32_t, uint32_t), (override));
+
+  protected:
+    void receive(sdeventplus::source::IO& source, int fd,
+                 uint32_t events) override
+    {
+        // Keep account of the number of commands responses for testing.
+        _cmdsProcessed++;
+    }
+
+  private:
+    size_t _cmdsProcessed = 0;
 };
 
 } // namespace pels
