diff --git a/phosphor-regulators/src/actions/i2c_write_bytes_action.hpp b/phosphor-regulators/src/actions/i2c_write_bytes_action.hpp
new file mode 100644
index 0000000..edf2b2e
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_write_bytes_action.hpp
@@ -0,0 +1,184 @@
+/**
+ * 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 <stdexcept>
+#include <string>
+#include <vector>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class I2CWriteBytesAction
+ *
+ * Writes bytes to a device register.  Communicates with the device directly
+ * using the I2C interface.
+ *
+ * Implements the i2c_write_bytes action in the JSON config file.
+ */
+class I2CWriteBytesAction : public I2CAction
+{
+  public:
+    // Specify which compiler-generated methods we want
+    I2CWriteBytesAction() = delete;
+    I2CWriteBytesAction(const I2CWriteBytesAction&) = delete;
+    I2CWriteBytesAction(I2CWriteBytesAction&&) = delete;
+    I2CWriteBytesAction& operator=(const I2CWriteBytesAction&) = delete;
+    I2CWriteBytesAction& operator=(I2CWriteBytesAction&&) = delete;
+    virtual ~I2CWriteBytesAction() = default;
+
+    /**
+     * Constructor.
+     *
+     * Throws an exception if any of the input parameters are invalid.
+     *
+     * @param reg Device register address.  Note: named 'reg' because 'register'
+     *            is a reserved keyword.
+     * @param values One or more byte values to write.  The bytes must be
+     *               specified in the order required by the device (e.g. in
+     *               little-endian order).
+     */
+    explicit I2CWriteBytesAction(uint8_t reg,
+                                 const std::vector<uint8_t>& values) :
+        reg{reg},
+        values{values}, masks{}
+    {
+        // Values vector must not be empty
+        if (values.size() < 1)
+        {
+            throw std::invalid_argument{"Values vector is empty"};
+        }
+    }
+
+    /**
+     * Constructor.
+     *
+     * Throws an exception if any of the input parameters are invalid.
+     *
+     * @param reg Device register address.  Note: named 'reg' because 'register'
+     *            is a reserved keyword.
+     * @param values One or more byte values to write.  The bytes must be
+     *               specified in the order required by the device (e.g. in
+     *               little-endian order).
+     * @param masks One or more bit masks.  The number of bit masks must match
+     *              the number of byte values to write.  Each mask specifies
+     *              which bits to write within the corresponding byte value.
+     *              Only the bits with a value of 1 in the mask will be written.
+     */
+    explicit I2CWriteBytesAction(uint8_t reg,
+                                 const std::vector<uint8_t>& values,
+                                 const std::vector<uint8_t>& masks) :
+        reg{reg},
+        values{values}, masks{masks}
+    {
+        // Values vector must not be empty
+        if (values.size() < 1)
+        {
+            throw std::invalid_argument{"Values vector is empty"};
+        }
+
+        // Masks vector must have same size as values vector
+        if (masks.size() != values.size())
+        {
+            throw std::invalid_argument{"Masks vector has invalid size"};
+        }
+    }
+
+    /**
+     * Executes this action.
+     *
+     * Writes bytes to a device register using the I2C interface.
+     *
+     * All of the bytes will be written in a single I2C operation.
+     *
+     * The device register, byte values, and bit masks (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 values to write.
+     *
+     * @return values to write
+     */
+    const std::vector<uint8_t>& getValues() const
+    {
+        return values;
+    }
+
+    /**
+     * Returns the bit masks.
+     *
+     * Each mask specifies which bits to write within the corresponding byte
+     * value.  Only the bits with a value of 1 in the mask will be written.
+     *
+     * @return bit masks
+     */
+    const std::vector<uint8_t>& getMasks() const
+    {
+        return masks;
+    }
+
+    /**
+     * 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 values to write.
+     */
+    const std::vector<uint8_t> values{};
+
+    /**
+     * Bit masks.  Each mask specifies which bits to write within the
+     * corresponding byte value.  Only the bits with a value of 1 in the mask
+     * will be written.
+     */
+    const std::vector<uint8_t> masks{};
+};
+
+} // namespace phosphor::power::regulators
