diff --git a/phosphor-regulators/src/configuration.cpp b/phosphor-regulators/src/configuration.cpp
new file mode 100644
index 0000000..99245ca
--- /dev/null
+++ b/phosphor-regulators/src/configuration.cpp
@@ -0,0 +1,77 @@
+/**
+ * Copyright © 2020 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 "configuration.hpp"
+
+#include "action_environment.hpp"
+#include "action_utils.hpp"
+#include "chassis.hpp"
+#include "device.hpp"
+#include "exception_utils.hpp"
+#include "journal.hpp"
+#include "rail.hpp"
+#include "system.hpp"
+
+#include <exception>
+
+namespace phosphor::power::regulators
+{
+
+void Configuration::execute(System& system, Chassis& chassis, Device& device)
+{
+    execute(system, chassis, device, device.getID());
+}
+
+void Configuration::execute(System& system, Chassis& chassis, Device& device,
+                            Rail& rail)
+{
+    execute(system, chassis, device, rail.getID());
+}
+
+void Configuration::execute(System& system, Chassis& /*chassis*/,
+                            Device& device, const std::string& deviceOrRailID)
+{
+    try
+    {
+        // Log debug message in journal
+        std::string message{"Configuring " + deviceOrRailID};
+        if (volts.has_value())
+        {
+            message += ": volts=" + std::to_string(volts.value());
+        }
+        journal::logDebug(message);
+
+        // Create ActionEnvironment
+        ActionEnvironment environment{system.getIDMap(), device.getID()};
+        if (volts.has_value())
+        {
+            environment.setVolts(volts.value());
+        }
+
+        // Execute the actions
+        action_utils::execute(actions, environment);
+    }
+    catch (const std::exception& e)
+    {
+        // Log error messages in journal
+        exception_utils::log(e);
+        journal::logErr("Unable to configure " + deviceOrRailID);
+
+        // TODO: Create error log entry
+    }
+}
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/configuration.hpp b/phosphor-regulators/src/configuration.hpp
index 4e2e4ed..3534419 100644
--- a/phosphor-regulators/src/configuration.hpp
+++ b/phosphor-regulators/src/configuration.hpp
@@ -19,12 +19,19 @@
 
 #include <memory>
 #include <optional>
+#include <string>
 #include <utility>
 #include <vector>
 
 namespace phosphor::power::regulators
 {
 
+// Forward declarations to avoid circular dependencies
+class Chassis;
+class Device;
+class Rail;
+class System;
+
 /**
  * @class Configuration
  *
@@ -70,13 +77,29 @@
     }
 
     /**
-     * Executes the actions to configure the device/rail.
+     * Executes the actions to configure the specified device.
+     *
+     * This method should be called during the boot before regulators are
+     * enabled.
+     *
+     * @param system system that contains the chassis
+     * @param chassis chassis that contains the device
+     * @param device device to configure
      */
-    void execute()
-    {
-        // TODO: Create ActionEnvironment, set volts value if specified, execute
-        // actions, catch and handle any exceptions
-    }
+    void execute(System& system, Chassis& chassis, Device& device);
+
+    /**
+     * Executes the actions to configure the specified rail.
+     *
+     * This method should be called during the boot before regulators are
+     * enabled.
+     *
+     * @param system system that contains the chassis
+     * @param chassis chassis that contains the device
+     * @param device device that contains the rail
+     * @param rail rail to configure
+     */
+    void execute(System& system, Chassis& chassis, Device& device, Rail& rail);
 
     /**
      * Returns the actions that configure the device/rail.
@@ -100,6 +123,17 @@
 
   private:
     /**
+     * Executes the actions to configure a device or rail.
+     *
+     * @param system system that contains the chassis
+     * @param chassis chassis that contains the device
+     * @param device device to configure or that contains rail to configure
+     * @param deviceOrRailID ID of the device or rail to configure
+     */
+    void execute(System& system, Chassis& chassis, Device& device,
+                 const std::string& deviceOrRailID);
+
+    /**
      * Optional output voltage value.
      */
     const std::optional<double> volts{};
diff --git a/phosphor-regulators/src/meson.build b/phosphor-regulators/src/meson.build
index d8616f6..98449fb 100644
--- a/phosphor-regulators/src/meson.build
+++ b/phosphor-regulators/src/meson.build
@@ -6,6 +6,7 @@
 phosphor_regulators_library_source_files = [
     'chassis.cpp',
     'config_file_parser.cpp',
+    'configuration.cpp',
     'device.cpp',
     'exception_utils.cpp',
     'id_map.cpp',
diff --git a/phosphor-regulators/test/configuration_tests.cpp b/phosphor-regulators/test/configuration_tests.cpp
index a4086e1..0865be7 100644
--- a/phosphor-regulators/test/configuration_tests.cpp
+++ b/phosphor-regulators/test/configuration_tests.cpp
@@ -14,17 +14,34 @@
  * limitations under the License.
  */
 #include "action.hpp"
+#include "chassis.hpp"
 #include "configuration.hpp"
+#include "device.hpp"
+#include "i2c_interface.hpp"
+#include "i2c_write_byte_action.hpp"
+#include "journal.hpp"
 #include "mock_action.hpp"
+#include "mock_journal.hpp"
+#include "mocked_i2c_interface.hpp"
+#include "pmbus_utils.hpp"
+#include "pmbus_write_vout_command_action.hpp"
+#include "rail.hpp"
+#include "system.hpp"
 
 #include <memory>
 #include <optional>
 #include <utility>
 #include <vector>
 
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
 using namespace phosphor::power::regulators;
+using namespace phosphor::power::regulators::pmbus_utils;
+
+using ::testing::Return;
+using ::testing::Throw;
+using ::testing::TypedEq;
 
 TEST(ConfigurationTests, Constructor)
 {
@@ -55,9 +72,368 @@
     }
 }
 
-TEST(ConfigurationTests, Execute)
+// Test for execute(System&, Chassis&, Device&)
+TEST(ConfigurationTests, ExecuteForDevice)
 {
-    // TODO: Implement test when execute() function is done
+    // Test where works: Volts value not specified
+    {
+        // Create I2CWriteByteAction with register 0x7C and value 0x0A
+        std::unique_ptr<I2CWriteByteAction> action =
+            std::make_unique<I2CWriteByteAction>(0x7C, 0x0A);
+
+        // Create mock I2CInterface.  Expect action to write 0x0A to 0x7C.
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface,
+                    write(TypedEq<uint8_t>(0x7C), TypedEq<uint8_t>(0x0A)))
+            .Times(1);
+
+        // Create Configuration with no volts value specified
+        std::optional<double> volts{};
+        std::vector<std::unique_ptr<Action>> actions{};
+        actions.emplace_back(std::move(action));
+        std::unique_ptr<Configuration> configuration =
+            std::make_unique<Configuration>(volts, std::move(actions));
+        Configuration* configurationPtr = configuration.get();
+
+        // Create Device that contains Configuration
+        std::unique_ptr<PresenceDetection> presenceDetection{};
+        std::unique_ptr<Device> device = std::make_unique<Device>(
+            "vdd_reg", true, "/system/chassis/motherboard/reg2",
+            std::move(i2cInterface), std::move(presenceDetection),
+            std::move(configuration));
+        Device* devicePtr = device.get();
+
+        // Create Chassis that contains Device
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.emplace_back(std::move(device));
+        std::unique_ptr<Chassis> chassis =
+            std::make_unique<Chassis>(1, std::move(devices));
+        Chassis* chassisPtr = chassis.get();
+
+        // Create System that contains Chassis
+        std::vector<std::unique_ptr<Rule>> rules{};
+        std::vector<std::unique_ptr<Chassis>> chassisVec{};
+        chassisVec.emplace_back(std::move(chassis));
+        System system{std::move(rules), std::move(chassisVec)};
+
+        // Execute Configuration
+        journal::clear();
+        configurationPtr->execute(system, *chassisPtr, *devicePtr);
+        std::vector<std::string> expectedDebugMessages{"Configuring vdd_reg"};
+        EXPECT_EQ(journal::getDebugMessages(), expectedDebugMessages);
+        EXPECT_EQ(journal::getErrMessages().size(), 0);
+    }
+
+    // Test where works: Volts value specified
+    {
+        // Create PMBusWriteVoutCommandAction.  Do not specify a volts value
+        // because it will get a value of 1.3V from the
+        // ActionEnvironment/Configuration.  Specify a -8 exponent.
+        // Linear format volts value = (1.3 / 2^(-8)) = 332.8 = 333 = 0x014D.
+        std::optional<double> volts{};
+        std::unique_ptr<PMBusWriteVoutCommandAction> action =
+            std::make_unique<PMBusWriteVoutCommandAction>(
+                volts, pmbus_utils::VoutDataFormat::linear, -8, false);
+
+        // Create mock I2CInterface.  Expect action to write 0x014D to
+        // VOUT_COMMAND (command/register 0x21).
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface,
+                    write(TypedEq<uint8_t>(0x21), TypedEq<uint16_t>(0x014D)))
+            .Times(1);
+
+        // Create Configuration with volts value 1.3V
+        std::vector<std::unique_ptr<Action>> actions{};
+        actions.emplace_back(std::move(action));
+        std::unique_ptr<Configuration> configuration =
+            std::make_unique<Configuration>(1.3, std::move(actions));
+        Configuration* configurationPtr = configuration.get();
+
+        // Create Device that contains Configuration
+        std::unique_ptr<PresenceDetection> presenceDetection{};
+        std::unique_ptr<Device> device = std::make_unique<Device>(
+            "vdd_reg", true, "/system/chassis/motherboard/reg2",
+            std::move(i2cInterface), std::move(presenceDetection),
+            std::move(configuration));
+        Device* devicePtr = device.get();
+
+        // Create Chassis that contains Device
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.emplace_back(std::move(device));
+        std::unique_ptr<Chassis> chassis =
+            std::make_unique<Chassis>(1, std::move(devices));
+        Chassis* chassisPtr = chassis.get();
+
+        // Create System that contains Chassis
+        std::vector<std::unique_ptr<Rule>> rules{};
+        std::vector<std::unique_ptr<Chassis>> chassisVec{};
+        chassisVec.emplace_back(std::move(chassis));
+        System system{std::move(rules), std::move(chassisVec)};
+
+        // Execute Configuration
+        journal::clear();
+        configurationPtr->execute(system, *chassisPtr, *devicePtr);
+        std::vector<std::string> expectedDebugMessages{
+            "Configuring vdd_reg: volts=1.300000"};
+        EXPECT_EQ(journal::getDebugMessages(), expectedDebugMessages);
+        EXPECT_EQ(journal::getErrMessages().size(), 0);
+    }
+
+    // Test where fails
+    {
+        // Create I2CWriteByteAction with register 0x7C and value 0x0A
+        std::unique_ptr<I2CWriteByteAction> action =
+            std::make_unique<I2CWriteByteAction>(0x7C, 0x0A);
+
+        // Create mock I2CInterface.  write() throws an I2CException.
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface,
+                    write(TypedEq<uint8_t>(0x7C), TypedEq<uint8_t>(0x0A)))
+            .Times(1)
+            .WillOnce(Throw(
+                i2c::I2CException{"Failed to write byte", "/dev/i2c-1", 0x70}));
+
+        // Create Configuration with no volts value specified
+        std::optional<double> volts{};
+        std::vector<std::unique_ptr<Action>> actions{};
+        actions.emplace_back(std::move(action));
+        std::unique_ptr<Configuration> configuration =
+            std::make_unique<Configuration>(volts, std::move(actions));
+        Configuration* configurationPtr = configuration.get();
+
+        // Create Device that contains Configuration
+        std::unique_ptr<PresenceDetection> presenceDetection{};
+        std::unique_ptr<Device> device = std::make_unique<Device>(
+            "vdd_reg", true, "/system/chassis/motherboard/reg2",
+            std::move(i2cInterface), std::move(presenceDetection),
+            std::move(configuration));
+        Device* devicePtr = device.get();
+
+        // Create Chassis that contains Device
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.emplace_back(std::move(device));
+        std::unique_ptr<Chassis> chassis =
+            std::make_unique<Chassis>(1, std::move(devices));
+        Chassis* chassisPtr = chassis.get();
+
+        // Create System that contains Chassis
+        std::vector<std::unique_ptr<Rule>> rules{};
+        std::vector<std::unique_ptr<Chassis>> chassisVec{};
+        chassisVec.emplace_back(std::move(chassis));
+        System system{std::move(rules), std::move(chassisVec)};
+
+        // Execute Configuration
+        journal::clear();
+        configurationPtr->execute(system, *chassisPtr, *devicePtr);
+        std::vector<std::string> expectedDebugMessages{"Configuring vdd_reg"};
+        EXPECT_EQ(journal::getDebugMessages(), expectedDebugMessages);
+        std::vector<std::string> expectedErrMessages{
+            "I2CException: Failed to write byte: bus /dev/i2c-1, addr 0x70",
+            "ActionError: i2c_write_byte: { register: 0x7C, value: 0xA, mask: "
+            "0xFF }",
+            "Unable to configure vdd_reg"};
+        EXPECT_EQ(journal::getErrMessages(), expectedErrMessages);
+    }
+}
+
+// Test for execute(System&, Chassis&, Device&, Rail&)
+TEST(ConfigurationTests, ExecuteForRail)
+{
+    // Test where works: Volts value not specified
+    {
+        // Create I2CWriteByteAction with register 0x7C and value 0x0A
+        std::unique_ptr<I2CWriteByteAction> action =
+            std::make_unique<I2CWriteByteAction>(0x7C, 0x0A);
+
+        // Create mock I2CInterface.  Expect action to write 0x0A to 0x7C.
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface,
+                    write(TypedEq<uint8_t>(0x7C), TypedEq<uint8_t>(0x0A)))
+            .Times(1);
+
+        // Create Configuration with no volts value specified
+        std::optional<double> volts{};
+        std::vector<std::unique_ptr<Action>> actions{};
+        actions.emplace_back(std::move(action));
+        std::unique_ptr<Configuration> configuration =
+            std::make_unique<Configuration>(volts, std::move(actions));
+        Configuration* configurationPtr = configuration.get();
+
+        // Create Rail that contains Configuration
+        std::unique_ptr<Rail> rail =
+            std::make_unique<Rail>("vio2", std::move(configuration));
+        Rail* railPtr = rail.get();
+
+        // Create Device that contains Rail
+        std::unique_ptr<PresenceDetection> presenceDetection{};
+        std::unique_ptr<Configuration> deviceConfiguration{};
+        std::vector<std::unique_ptr<Rail>> rails{};
+        rails.emplace_back(std::move(rail));
+        std::unique_ptr<Device> device = std::make_unique<Device>(
+            "reg1", true, "/system/chassis/motherboard/reg1",
+            std::move(i2cInterface), std::move(presenceDetection),
+            std::move(deviceConfiguration), std::move(rails));
+        Device* devicePtr = device.get();
+
+        // Create Chassis that contains Device
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.emplace_back(std::move(device));
+        std::unique_ptr<Chassis> chassis =
+            std::make_unique<Chassis>(1, std::move(devices));
+        Chassis* chassisPtr = chassis.get();
+
+        // Create System that contains Chassis
+        std::vector<std::unique_ptr<Rule>> rules{};
+        std::vector<std::unique_ptr<Chassis>> chassisVec{};
+        chassisVec.emplace_back(std::move(chassis));
+        System system{std::move(rules), std::move(chassisVec)};
+
+        // Execute Configuration
+        journal::clear();
+        configurationPtr->execute(system, *chassisPtr, *devicePtr, *railPtr);
+        std::vector<std::string> expectedDebugMessages{"Configuring vio2"};
+        EXPECT_EQ(journal::getDebugMessages(), expectedDebugMessages);
+        EXPECT_EQ(journal::getErrMessages().size(), 0);
+    }
+
+    // Test where works: Volts value specified
+    {
+        // Create PMBusWriteVoutCommandAction.  Do not specify a volts value
+        // because it will get a value of 1.3V from the
+        // ActionEnvironment/Configuration.  Specify a -8 exponent.
+        // Linear format volts value = (1.3 / 2^(-8)) = 332.8 = 333 = 0x014D.
+        std::optional<double> volts{};
+        std::unique_ptr<PMBusWriteVoutCommandAction> action =
+            std::make_unique<PMBusWriteVoutCommandAction>(
+                volts, pmbus_utils::VoutDataFormat::linear, -8, false);
+
+        // Create mock I2CInterface.  Expect action to write 0x014D to
+        // VOUT_COMMAND (command/register 0x21).
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface,
+                    write(TypedEq<uint8_t>(0x21), TypedEq<uint16_t>(0x014D)))
+            .Times(1);
+
+        // Create Configuration with volts value 1.3V
+        std::vector<std::unique_ptr<Action>> actions{};
+        actions.emplace_back(std::move(action));
+        std::unique_ptr<Configuration> configuration =
+            std::make_unique<Configuration>(1.3, std::move(actions));
+        Configuration* configurationPtr = configuration.get();
+
+        // Create Rail that contains Configuration
+        std::unique_ptr<Rail> rail =
+            std::make_unique<Rail>("vio2", std::move(configuration));
+        Rail* railPtr = rail.get();
+
+        // Create Device that contains Rail
+        std::unique_ptr<PresenceDetection> presenceDetection{};
+        std::unique_ptr<Configuration> deviceConfiguration{};
+        std::vector<std::unique_ptr<Rail>> rails{};
+        rails.emplace_back(std::move(rail));
+        std::unique_ptr<Device> device = std::make_unique<Device>(
+            "reg1", true, "/system/chassis/motherboard/reg1",
+            std::move(i2cInterface), std::move(presenceDetection),
+            std::move(deviceConfiguration), std::move(rails));
+        Device* devicePtr = device.get();
+
+        // Create Chassis that contains Device
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.emplace_back(std::move(device));
+        std::unique_ptr<Chassis> chassis =
+            std::make_unique<Chassis>(1, std::move(devices));
+        Chassis* chassisPtr = chassis.get();
+
+        // Create System that contains Chassis
+        std::vector<std::unique_ptr<Rule>> rules{};
+        std::vector<std::unique_ptr<Chassis>> chassisVec{};
+        chassisVec.emplace_back(std::move(chassis));
+        System system{std::move(rules), std::move(chassisVec)};
+
+        // Execute Configuration
+        journal::clear();
+        configurationPtr->execute(system, *chassisPtr, *devicePtr, *railPtr);
+        std::vector<std::string> expectedDebugMessages{
+            "Configuring vio2: volts=1.300000"};
+        EXPECT_EQ(journal::getDebugMessages(), expectedDebugMessages);
+        EXPECT_EQ(journal::getErrMessages().size(), 0);
+    }
+
+    // Test where fails
+    {
+        // Create I2CWriteByteAction with register 0x7C and value 0x0A
+        std::unique_ptr<I2CWriteByteAction> action =
+            std::make_unique<I2CWriteByteAction>(0x7C, 0x0A);
+
+        // Create mock I2CInterface.  write() throws an I2CException.
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface,
+                    write(TypedEq<uint8_t>(0x7C), TypedEq<uint8_t>(0x0A)))
+            .Times(1)
+            .WillOnce(Throw(
+                i2c::I2CException{"Failed to write byte", "/dev/i2c-1", 0x70}));
+
+        // Create Configuration with no volts value specified
+        std::optional<double> volts{};
+        std::vector<std::unique_ptr<Action>> actions{};
+        actions.emplace_back(std::move(action));
+        std::unique_ptr<Configuration> configuration =
+            std::make_unique<Configuration>(volts, std::move(actions));
+        Configuration* configurationPtr = configuration.get();
+
+        // Create Rail that contains Configuration
+        std::unique_ptr<Rail> rail =
+            std::make_unique<Rail>("vio2", std::move(configuration));
+        Rail* railPtr = rail.get();
+
+        // Create Device that contains Rail
+        std::unique_ptr<PresenceDetection> presenceDetection{};
+        std::unique_ptr<Configuration> deviceConfiguration{};
+        std::vector<std::unique_ptr<Rail>> rails{};
+        rails.emplace_back(std::move(rail));
+        std::unique_ptr<Device> device = std::make_unique<Device>(
+            "reg1", true, "/system/chassis/motherboard/reg1",
+            std::move(i2cInterface), std::move(presenceDetection),
+            std::move(deviceConfiguration), std::move(rails));
+        Device* devicePtr = device.get();
+
+        // Create Chassis that contains Device
+        std::vector<std::unique_ptr<Device>> devices{};
+        devices.emplace_back(std::move(device));
+        std::unique_ptr<Chassis> chassis =
+            std::make_unique<Chassis>(1, std::move(devices));
+        Chassis* chassisPtr = chassis.get();
+
+        // Create System that contains Chassis
+        std::vector<std::unique_ptr<Rule>> rules{};
+        std::vector<std::unique_ptr<Chassis>> chassisVec{};
+        chassisVec.emplace_back(std::move(chassis));
+        System system{std::move(rules), std::move(chassisVec)};
+
+        // Execute Configuration
+        journal::clear();
+        configurationPtr->execute(system, *chassisPtr, *devicePtr, *railPtr);
+        std::vector<std::string> expectedDebugMessages{"Configuring vio2"};
+        EXPECT_EQ(journal::getDebugMessages(), expectedDebugMessages);
+        std::vector<std::string> expectedErrMessages{
+            "I2CException: Failed to write byte: bus /dev/i2c-1, addr 0x70",
+            "ActionError: i2c_write_byte: { register: 0x7C, value: 0xA, mask: "
+            "0xFF }",
+            "Unable to configure vio2"};
+        EXPECT_EQ(journal::getErrMessages(), expectedErrMessages);
+    }
 }
 
 TEST(ConfigurationTests, GetActions)
