diff --git a/chassis_state_manager.cpp b/chassis_state_manager.cpp
index c146087..91a35d0 100644
--- a/chassis_state_manager.cpp
+++ b/chassis_state_manager.cpp
@@ -13,6 +13,41 @@
 
 using namespace phosphor::logging;
 
+// TODO - Will be rewritten once sdbusplus client bindings are in place
+//        and persistent storage design is in place and sdbusplus
+//        has read property function
+void Chassis::determineInitialState()
+{
+    sdbusplus::message::variant<int> pgood = -1;
+    auto method = this->bus.new_method_call("org.openbmc.control.Power",
+                                            "/org/openbmc/control/power0",
+                                            "org.freedesktop.DBus.Properties",
+                                            "Get");
+
+    method.append("org.openbmc.control.Power", "pgood");
+    auto reply = this->bus.call(method);
+    reply.read(pgood);
+
+    if(pgood == 1)
+    {
+        log<level::INFO>("Initial Chassis State will be On",
+                         entry("CHASSIS_CURRENT_POWER_STATE=%s",
+                               convertForMessage(PowerState::On).c_str()));
+        server::Chassis::currentPowerState(PowerState::On);
+        server::Chassis::requestedPowerTransition(Transition::On);
+    }
+    else
+    {
+        log<level::INFO>("Initial Chassis State will be Off",
+                         entry("CHASSIS_CURRENT_POWER_STATE=%s",
+                               convertForMessage(PowerState::Off).c_str()));
+        server::Chassis::currentPowerState(PowerState::Off);
+        server::Chassis::requestedPowerTransition(Transition::Off);
+    }
+
+    return;
+}
+
 Chassis::Transition Chassis::requestedPowerTransition(Transition value)
 {
 
diff --git a/chassis_state_manager.hpp b/chassis_state_manager.hpp
index f3df078..af3445d 100644
--- a/chassis_state_manager.hpp
+++ b/chassis_state_manager.hpp
@@ -21,8 +21,12 @@
     public:
         /** @brief Constructs Chassis State Manager
          *
+         * @note This constructor passes 'true' to the base class in order to
+         *       defer dbus object registration until we can run
+         *       determineInitialState() and set our properties
+         *
          * @param[in] bus       - The Dbus bus object
-         * @param[in] busName   - The Dbus name to own
+         * @param[in] instance  - The instance of this object
          * @param[in] objPath   - The Dbus object path
          */
         Chassis(sdbusplus::bus::bus& bus,
@@ -30,9 +34,17 @@
                 const char* objPath) :
                 sdbusplus::server::object::object<
                     sdbusplus::xyz::openbmc_project::State::server::Chassis>(
-                            bus, objPath),
+                            bus, objPath, true),
                 bus(bus)
-        {}
+        {
+            determineInitialState();
+
+            // We deferred this until we could get our property correct
+            this->emit_object_added();
+        }
+
+        /** @brief Determine initial chassis state and set internally */
+        void determineInitialState();
 
         /** @brief Set value of RequestedPowerTransition */
         Transition requestedPowerTransition(Transition value) override;
