diff --git a/manager.cpp b/manager.cpp
index c01cdc5..a2c262d 100644
--- a/manager.cpp
+++ b/manager.cpp
@@ -50,23 +50,39 @@
     {
         const auto& interfaces = object.second;
 
-        auto propertyMap = std::find_if(
-            interfaces.begin(), interfaces.end(),
-            [](const auto& i) { return i.first == LOGGING_IFACE; });
+        auto propertyMap = interfaces.find(LOGGING_IFACE);
 
         if (propertyMap != interfaces.end())
         {
-            create(object.first, propertyMap->second);
+            createWithRestore(object.first, interfaces);
         }
     }
 }
 
-void Manager::create(const std::string& objectPath,
-                     const DbusPropertyMap& properties)
+void Manager::createWithRestore(const std::string& objectPath,
+                                const DbusInterfaceMap& interfaces)
 {
+    createObject(objectPath, interfaces);
 
+    // TODO
+    // restoreCalloutObjects(objectPath, interfaces);
+}
+
+void Manager::create(const std::string& objectPath,
+                     const DbusInterfaceMap& interfaces)
+{
+    createObject(objectPath, interfaces);
+
+    // TODO
+    // createCalloutObjects(objectPath, interfaces);
+}
+
+void Manager::createObject(const std::string& objectPath,
+                           const DbusInterfaceMap& interfaces)
+{
 #ifdef USE_POLICY_INTERFACE
-    createPolicyInterface(objectPath, properties);
+    auto logInterface = interfaces.find(LOGGING_IFACE);
+    createPolicyInterface(objectPath, logInterface->second);
 #endif
 }
 
@@ -156,13 +172,9 @@
 
     // Find the Logging.Entry interface with all of its properties
     // to pass to create().
-    auto propertyMap =
-        std::find_if(interfaces.begin(), interfaces.end(),
-                     [](const auto& i) { return i.first == LOGGING_IFACE; });
-
-    if (propertyMap != interfaces.end())
+    if (interfaces.find(LOGGING_IFACE) != interfaces.end())
     {
-        create(path, propertyMap->second);
+        create(path, interfaces);
     }
 }
 
diff --git a/manager.hpp b/manager.hpp
index 0412130..0c8a095 100644
--- a/manager.hpp
+++ b/manager.hpp
@@ -86,14 +86,42 @@
     void createAll();
 
     /**
-     * Creates the IBM interface(s) for a single error log.
+     * Creates the IBM interface(s) for a single new error log.
+     *
+     * Any interfaces that require serialization will be created
+     * and serialized here.
      *
      * @param[in] objectPath - object path of the error log
-     * @param[in] properties - the xyz.openbmc_project.Logging.Entry
-     *                         properties
+     * @param[in] interfaces - map of all interfaces and properties
+     *                         on a phosphor-logging error log
      */
     void create(const std::string& objectPath,
-                const DbusPropertyMap& properties);
+                const DbusInterfaceMap& interfaces);
+
+    /**
+     * Creates the IBM interface(s) for a single error log after
+     * the application is restarted.
+     *
+     * Interfaces that were persisted will be restored from their
+     * previously saved filesystem data.
+     *
+     * @param[in] objectPath - object path of the error log
+     * @param[in] interfaces - map of all interfaces and properties
+     *                         on a phosphor-logging error log
+     */
+    void createWithRestore(const std::string& objectPath,
+                           const DbusInterfaceMap& interfaces);
+
+    /**
+     * Creates the IBM interfaces for a single error log that
+     * do not persist across app restarts.
+     *
+     * @param[in] objectPath - object path of the error log
+     * @param[in] interfaces - map of all interfaces and properties
+     *                         on a phosphor-logging error log
+     */
+    void createObject(const std::string& objectPath,
+                      const DbusInterfaceMap& interfaces);
 
     /**
      * Creates the IBM policy interface for a single error log
