diff --git a/phosphor-regulators/src/actions/i2c_write_byte_action.hpp b/phosphor-regulators/src/actions/i2c_write_byte_action.hpp
new file mode 100644
index 0000000..99ea154
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_write_byte_action.hpp
@@ -0,0 +1,139 @@
+/**
+ * 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.
+ */
+#pragma once
+
+#include "action_environment.hpp"
+#include "i2c_action.hpp"
+
+#include <cstdint>
+#include <string>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class I2CWriteByteAction
+ *
+ * Writes a byte to a device register.  Communicates with the device directly
+ * using the I2C interface.
+ *
+ * Implements the i2c_write_byte action in the JSON config file.
+ */
+class I2CWriteByteAction : public I2CAction
+{
+  public:
+    // Specify which compiler-generated methods we want
+    I2CWriteByteAction() = delete;
+    I2CWriteByteAction(const I2CWriteByteAction&) = delete;
+    I2CWriteByteAction(I2CWriteByteAction&&) = delete;
+    I2CWriteByteAction& operator=(const I2CWriteByteAction&) = delete;
+    I2CWriteByteAction& operator=(I2CWriteByteAction&&) = delete;
+    virtual ~I2CWriteByteAction() = default;
+
+    /**
+     * Constructor.
+     *
+     * @param reg Device register address.  Note: named 'reg' because 'register'
+     *            is a reserved keyword.
+     * @param value Byte value to write.
+     * @param mask Bit mask.  Specifies which bits to write within the byte
+     *             value.  Only the bits with a value of 1 in the mask will be
+     *             written.
+     */
+    explicit I2CWriteByteAction(uint8_t reg, uint8_t value,
+                                uint8_t mask = 0xFF) :
+        reg{reg},
+        value{value}, mask{mask}
+    {
+    }
+
+    /**
+     * Executes this action.
+     *
+     * Writes a byte to a device register using the I2C interface.
+     *
+     * The device register, byte value, and mask (if any) were specified in the
+     * constructor.
+     *
+     * The device is obtained from the specified action environment.
+     *
+     * Throws an exception if an error occurs.
+     *
+     * @param environment action execution environment
+     * @return true
+     */
+    virtual bool execute(ActionEnvironment& environment) override;
+
+    /**
+     * Returns the device register address.
+     *
+     * @return register address
+     */
+    uint8_t getRegister() const
+    {
+        return reg;
+    }
+
+    /**
+     * Returns the byte value to write.
+     *
+     * @return value to write
+     */
+    uint8_t getValue() const
+    {
+        return value;
+    }
+
+    /**
+     * Returns the bit mask.
+     *
+     * Specifies which bits to write within the byte value.  Only the bits with
+     * a value of 1 in the mask will be written.
+     *
+     * @return bit mask
+     */
+    uint8_t getMask() const
+    {
+        return mask;
+    }
+
+    /**
+     * Returns a string description of this action.
+     *
+     * @return description of action
+     */
+    virtual std::string toString() const override;
+
+  private:
+    /**
+     * Device register address.  Note: named 'reg' because 'register' is a
+     * reserved keyword.
+     */
+    const uint8_t reg{0x00};
+
+    /**
+     * Byte value to write.
+     */
+    const uint8_t value{0x00};
+
+    /**
+     * Bit mask.  Specifies which bits to write within the byte value.  Only the
+     * bits with a value of 1 in the mask will be written.
+     */
+    const uint8_t mask{0xFF};
+};
+
+} // namespace phosphor::power::regulators
