diff --git a/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp b/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp
new file mode 100644
index 0000000..728daeb
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_capture_bytes_action.cpp
@@ -0,0 +1,78 @@
+/**
+ * Copyright © 2021 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 "i2c_capture_bytes_action.hpp"
+
+#include "action_error.hpp"
+#include "i2c_interface.hpp"
+
+#include <exception>
+#include <ios>
+#include <sstream>
+
+namespace phosphor::power::regulators
+{
+
+bool I2CCaptureBytesAction::execute(ActionEnvironment& environment)
+{
+    try
+    {
+        // Read device register values.  Use I2C mode where the number of bytes
+        // to read is explicitly specified.
+        i2c::I2CInterface& interface = getI2CInterface(environment);
+        uint8_t size{count}; // byte count parameter is input/output
+        uint8_t values[UINT8_MAX];
+        interface.read(reg, size, values, i2c::I2CInterface::Mode::I2C);
+
+        // Build additional error data key
+        std::ostringstream kss;
+        kss << environment.getDeviceID() << "_register_0x" << std::hex
+            << std::uppercase << static_cast<uint16_t>(reg);
+        std::string key = kss.str();
+
+        // Build additional error data value
+        std::ostringstream vss;
+        vss << "[ " << std::hex << std::uppercase;
+        for (unsigned int i = 0; i < count; ++i)
+        {
+            vss << ((i > 0) ? ", " : "") << "0x"
+                << static_cast<uint16_t>(values[i]);
+        }
+        vss << " ]";
+        std::string value = vss.str();
+
+        // Store additional error data in action environment
+        environment.addAdditionalErrorData(key, value);
+    }
+    catch (const i2c::I2CException& e)
+    {
+        // Nest I2CException within an ActionError so caller will have both the
+        // low level I2C error information and the action information
+        std::throw_with_nested(ActionError(*this));
+    }
+    return true;
+}
+
+std::string I2CCaptureBytesAction::toString() const
+{
+    std::ostringstream ss;
+    ss << "i2c_capture_bytes: { register: 0x" << std::hex << std::uppercase
+       << static_cast<uint16_t>(reg) << ", count: " << std::dec
+       << static_cast<uint16_t>(count) << " }";
+    return ss.str();
+}
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/actions/i2c_capture_bytes_action.hpp b/phosphor-regulators/src/actions/i2c_capture_bytes_action.hpp
new file mode 100644
index 0000000..c17e191
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_capture_bytes_action.hpp
@@ -0,0 +1,125 @@
+/**
+ * Copyright © 2021 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>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class I2CCaptureBytesAction
+ *
+ * Captures device register bytes to be stored in an error log.  Communicates
+ * with the device directly using the I2C interface.
+ *
+ * Implements the i2c_capture_bytes action in the JSON config file.
+ */
+class I2CCaptureBytesAction : public I2CAction
+{
+  public:
+    // Specify which compiler-generated methods we want
+    I2CCaptureBytesAction() = delete;
+    I2CCaptureBytesAction(const I2CCaptureBytesAction&) = delete;
+    I2CCaptureBytesAction(I2CCaptureBytesAction&&) = delete;
+    I2CCaptureBytesAction& operator=(const I2CCaptureBytesAction&) = delete;
+    I2CCaptureBytesAction& operator=(I2CCaptureBytesAction&&) = delete;
+    virtual ~I2CCaptureBytesAction() = 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 count Number of bytes to read from the device register.
+     */
+    explicit I2CCaptureBytesAction(uint8_t reg, uint8_t count) :
+        reg{reg}, count{count}
+    {
+        if (count < 1)
+        {
+            throw std::invalid_argument{"Invalid byte count: Less than 1"};
+        }
+    }
+
+    /**
+     * Executes this action.
+     *
+     * Reads one or more bytes from a device register using the I2C interface.
+     * The resulting values are stored as additional error data in the specified
+     * action environment.
+     *
+     * All of the bytes will be read in a single I2C operation.
+     *
+     * The device register was specified in the constructor.
+     *
+     * The device is obtained from the action environment.
+     *
+     * Throws an exception if an error occurs.
+     *
+     * @param environment action execution environment
+     * @return true
+     */
+    virtual bool execute(ActionEnvironment& environment) override;
+
+    /**
+     * Returns the number of bytes to read from the device register.
+     *
+     * @return byte count
+     */
+    uint8_t getCount() const
+    {
+        return count;
+    }
+
+    /**
+     * Returns the device register address.
+     *
+     * @return register address
+     */
+    uint8_t getRegister() const
+    {
+        return reg;
+    }
+
+    /**
+     * 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;
+
+    /**
+     * Number of bytes to read from the device register.
+     */
+    const uint8_t count;
+};
+
+} // namespace phosphor::power::regulators
