diff --git a/phosphor-regulators/src/actions/i2c_compare_bit_action.cpp b/phosphor-regulators/src/actions/i2c_compare_bit_action.cpp
new file mode 100644
index 0000000..a5af812
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_compare_bit_action.cpp
@@ -0,0 +1,64 @@
+/**
+ * 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 "i2c_compare_bit_action.hpp"
+
+#include "action_error.hpp"
+#include "i2c_interface.hpp"
+
+#include <exception>
+#include <ios>
+#include <sstream>
+
+namespace phosphor::power::regulators
+{
+
+bool I2CCompareBitAction::execute(ActionEnvironment& environment)
+{
+    bool isEqual{false};
+    try
+    {
+        // Read actual value of device register
+        uint8_t registerValue{0x00};
+        i2c::I2CInterface& interface = getI2CInterface(environment);
+        interface.read(reg, registerValue);
+
+        // Get actual bit value
+        uint8_t actualValue = (registerValue >> position) & 0x01;
+
+        // Check if actual bit value equals expected bit value
+        isEqual = (actualValue == 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 isEqual;
+}
+
+std::string I2CCompareBitAction::toString() const
+{
+    std::ostringstream ss;
+    ss << "i2c_compare_bit: { register: 0x" << std::hex << std::uppercase
+       << static_cast<uint16_t>(reg) << ", position: " << std::dec
+       << static_cast<uint16_t>(position)
+       << ", value: " << static_cast<uint16_t>(value) << " }";
+    return ss.str();
+}
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/actions/i2c_compare_bit_action.hpp b/phosphor-regulators/src/actions/i2c_compare_bit_action.hpp
new file mode 100644
index 0000000..ac28898
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_compare_bit_action.hpp
@@ -0,0 +1,154 @@
+/**
+ * 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>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class I2CCompareBitAction
+ *
+ * Compares a bit in a device register to a value.  Communicates with the device
+ * directly using the I2C interface.
+ *
+ * Implements the i2c_compare_bit action in the JSON config file.
+ */
+class I2CCompareBitAction : public I2CAction
+{
+  public:
+    // Specify which compiler-generated methods we want
+    I2CCompareBitAction() = delete;
+    I2CCompareBitAction(const I2CCompareBitAction&) = delete;
+    I2CCompareBitAction(I2CCompareBitAction&&) = delete;
+    I2CCompareBitAction& operator=(const I2CCompareBitAction&) = delete;
+    I2CCompareBitAction& operator=(I2CCompareBitAction&&) = delete;
+    virtual ~I2CCompareBitAction() = 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 position Bit position.  Must be in the range 0-7.  Bit 0 is the
+     *                 least significant bit.
+     * @param value Expected bit value.  Must be 0 or 1.
+     */
+    explicit I2CCompareBitAction(uint8_t reg, uint8_t position, uint8_t value) :
+        reg{reg}, position{position}, value{value}
+    {
+        if (position > 7)
+        {
+            throw std::invalid_argument{
+                "Invalid bit position: " +
+                std::to_string(static_cast<unsigned>(position))};
+        }
+
+        if (value > 1)
+        {
+            throw std::invalid_argument{
+                "Invalid bit value: " +
+                std::to_string(static_cast<unsigned>(value))};
+        }
+    }
+
+    /**
+     * Executes this action.
+     *
+     * Compares a bit in a device register to a value using the I2C interface.
+     *
+     * The device register, bit position, and bit value 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 if the register bit contained the expected value, otherwise
+     *         returns false.
+     */
+    virtual bool execute(ActionEnvironment& environment) override;
+
+    /**
+     * Returns the device register address.
+     *
+     * @return register address
+     */
+    uint8_t getRegister() const
+    {
+        return reg;
+    }
+
+    /**
+     * Returns the bit position.
+     *
+     * Value is in the range 0-7.  Bit 0 is the least significant bit.
+     *
+     * @return bit position
+     */
+    uint8_t getPosition() const
+    {
+        return position;
+    }
+
+    /**
+     * Returns the expected bit value.
+     *
+     * Value is 0 or 1.
+     *
+     * @return expected bit value
+     */
+    uint8_t getValue() const
+    {
+        return value;
+    }
+
+    /**
+     * 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};
+
+    /**
+     * Bit position.  Must be in the range 0-7.  Bit 0 is the least significant
+     * bit.
+     */
+    const uint8_t position{0};
+
+    /**
+     * Expected bit value.  Must be 0 or 1.
+     */
+    const uint8_t value{0};
+};
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/meson.build b/phosphor-regulators/src/meson.build
index a70a86a..f100d77 100644
--- a/phosphor-regulators/src/meson.build
+++ b/phosphor-regulators/src/meson.build
@@ -7,6 +7,7 @@
     'id_map.cpp',
 
     'actions/if_action.cpp',
+    'actions/i2c_compare_bit_action.cpp',
     'actions/i2c_compare_byte_action.cpp'
 ]
 
diff --git a/phosphor-regulators/test/actions/i2c_compare_bit_action_tests.cpp b/phosphor-regulators/test/actions/i2c_compare_bit_action_tests.cpp
new file mode 100644
index 0000000..818c800
--- /dev/null
+++ b/phosphor-regulators/test/actions/i2c_compare_bit_action_tests.cpp
@@ -0,0 +1,237 @@
+/**
+ * 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 "action_environment.hpp"
+#include "action_error.hpp"
+#include "device.hpp"
+#include "i2c_compare_bit_action.hpp"
+#include "i2c_interface.hpp"
+#include "id_map.hpp"
+#include "mocked_i2c_interface.hpp"
+
+#include <cstdint>
+#include <memory>
+#include <stdexcept>
+#include <string>
+#include <utility>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+using ::testing::A;
+using ::testing::Return;
+using ::testing::SetArgReferee;
+using ::testing::Throw;
+
+TEST(I2CCompareBitActionTests, Constructor)
+{
+    // Test where works
+    try
+    {
+        I2CCompareBitAction action{0x7C, 2, 0};
+        EXPECT_EQ(action.getRegister(), 0x7C);
+        EXPECT_EQ(action.getPosition(), 2);
+        EXPECT_EQ(action.getValue(), 0);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Invalid bit position > 7
+    try
+    {
+        I2CCompareBitAction action{0x7C, 8, 0};
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Invalid bit position: 8");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Invalid bit value > 1
+    try
+    {
+        I2CCompareBitAction action{0x7C, 2, 2};
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Invalid bit value: 2");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+TEST(I2CCompareBitActionTests, Execute)
+{
+    // Test where works
+    try
+    {
+        // Create mock I2CInterface: read() returns value 0x96 (1001 0110)
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).WillRepeatedly(Return(true));
+        EXPECT_CALL(*i2cInterface, read(A<uint8_t>(), A<uint8_t&>()))
+            .WillRepeatedly(SetArgReferee<1>(0x96));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        // Test where actual bit value is equal to expected bit value.
+        // Test all bits in register value 0x96 == 1001 0110).
+        {
+            I2CCompareBitAction actions[] = {I2CCompareBitAction{0x7C, 7, 1},
+                                             I2CCompareBitAction{0x7C, 6, 0},
+                                             I2CCompareBitAction{0x7C, 5, 0},
+                                             I2CCompareBitAction{0x7C, 4, 1},
+                                             I2CCompareBitAction{0x7C, 3, 0},
+                                             I2CCompareBitAction{0x7C, 2, 1},
+                                             I2CCompareBitAction{0x7C, 1, 1},
+                                             I2CCompareBitAction{0x7C, 0, 0}};
+            for (I2CCompareBitAction& action : actions)
+            {
+                EXPECT_EQ(action.execute(env), true);
+            }
+        }
+
+        // Test where actual bit value is not equal to expected bit value.
+        // Test all bits in register value 0x96 == 1001 0110).
+        {
+            I2CCompareBitAction actions[] = {I2CCompareBitAction{0x7C, 7, 0},
+                                             I2CCompareBitAction{0x7C, 6, 1},
+                                             I2CCompareBitAction{0x7C, 5, 1},
+                                             I2CCompareBitAction{0x7C, 4, 0},
+                                             I2CCompareBitAction{0x7C, 3, 1},
+                                             I2CCompareBitAction{0x7C, 2, 0},
+                                             I2CCompareBitAction{0x7C, 1, 0},
+                                             I2CCompareBitAction{0x7C, 0, 1}};
+            for (I2CCompareBitAction& action : actions)
+            {
+                EXPECT_EQ(action.execute(env), false);
+            }
+        }
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Getting I2CInterface fails
+    try
+    {
+        // Create IDMap and ActionEnvironment
+        IDMap idMap{};
+        ActionEnvironment env{idMap, "reg1"};
+
+        I2CCompareBitAction action{0x7C, 5, 1};
+        action.execute(env);
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Unable to find device with ID \"reg1\"");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Reading byte fails
+    try
+    {
+        // Create mock I2CInterface: read() 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, read(A<uint8_t>(), A<uint8_t&>()))
+            .Times(1)
+            .WillOnce(Throw(
+                i2c::I2CException{"Failed to read byte", "/dev/i2c-1", 0x70}));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        I2CCompareBitAction action{0x7C, 5, 1};
+        action.execute(env);
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const ActionError& e)
+    {
+        EXPECT_STREQ(e.what(), "ActionError: i2c_compare_bit: { register: "
+                               "0x7C, position: 5, value: 1 }");
+        try
+        {
+            // Re-throw inner I2CException
+            std::rethrow_if_nested(e);
+            ADD_FAILURE() << "Should not have reached this line.";
+        }
+        catch (const i2c::I2CException& ie)
+        {
+            EXPECT_STREQ(
+                ie.what(),
+                "I2CException: Failed to read byte: bus /dev/i2c-1, addr 0x70");
+        }
+        catch (...)
+        {
+            ADD_FAILURE() << "Should not have caught exception.";
+        }
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+TEST(I2CCompareBitActionTests, GetRegister)
+{
+    I2CCompareBitAction action{0x7C, 5, 1};
+    EXPECT_EQ(action.getRegister(), 0x7C);
+}
+
+TEST(I2CCompareBitActionTests, GetPosition)
+{
+    I2CCompareBitAction action{0x7C, 5, 1};
+    EXPECT_EQ(action.getPosition(), 5);
+}
+
+TEST(I2CCompareBitActionTests, GetValue)
+{
+    I2CCompareBitAction action{0x7C, 5, 1};
+    EXPECT_EQ(action.getValue(), 1);
+}
+
+TEST(I2CCompareBitActionTests, ToString)
+{
+    I2CCompareBitAction action{0x7C, 5, 1};
+    EXPECT_EQ(action.toString(),
+              "i2c_compare_bit: { register: 0x7C, position: 5, value: 1 }");
+}
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index d5e3d5d..92a18c8 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -14,6 +14,7 @@
     'actions/action_utils_tests.cpp',
     'actions/and_action_tests.cpp',
     'actions/i2c_action_tests.cpp',
+    'actions/i2c_compare_bit_action_tests.cpp',
     'actions/i2c_compare_byte_action_tests.cpp',
     'actions/if_action_tests.cpp',
     'actions/not_action_tests.cpp',
