diff --git a/vendor/magento/module-re-captcha-contact/etc/frontend/di.xml b/vendor/magento/module-re-captcha-contact/etc/frontend/di.xml
new file mode 100644
index 00000000..ee228c25
--- /dev/null
+++ b/vendor/magento/module-re-captcha-contact/etc/frontend/di.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+
+    <type name="Magento\Framework\View\Element\ButtonLockManager">
+        <arguments>
+            <argument name="buttonLockPool" xsi:type="array">
+                <item name="contact_us_form_submit" xsi:type="object">Magento\ReCaptchaContact\Model\ButtonLock\ContactUsFormSubmit</item>
+            </argument>
+        </arguments>
+    </type>
+
+    <virtualType name="Magento\ReCaptchaContact\Model\ButtonLock\ContactUsFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">contact_us_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">contact</argument>
+        </arguments>
+    </virtualType>
+</config>
diff --git a/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableCreateAccountButton.php b/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableCreateAccountButton.php
deleted file mode 100644
index ea6e3ebc..00000000
--- a/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableCreateAccountButton.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-declare(strict_types=1);
-
-namespace Magento\ReCaptchaCustomer\Plugin\Customer;
-
-use Magento\Framework\Exception\InputException;
-use Magento\ReCaptchaUi\Model\IsCaptchaEnabledInterface;
-use Magento\Customer\ViewModel\CreateAccountButton;
-
-/**
- * Disable button Create Account while captcha is loading
- */
-class DisableCreateAccountButton
-{
-    /**
-     * @var IsCaptchaEnabledInterface
-     */
-    private $isCaptchaEnabled;
-
-    /**
-     * @param IsCaptchaEnabledInterface $isCaptchaEnabled
-     */
-    public function __construct(
-        IsCaptchaEnabledInterface $isCaptchaEnabled
-    ) {
-        $this->isCaptchaEnabled = $isCaptchaEnabled;
-    }
-
-    /**
-     * Temporally disable button Create Account while captcha is loading
-     *
-     * @param CreateAccountButton $subject
-     * @return bool
-     * @throws InputException
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function afterDisabled(CreateAccountButton $subject): bool
-    {
-        $key = 'customer_create';
-        return $this->isCaptchaEnabled->isCaptchaEnabledFor($key);
-    }
-}
diff --git a/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableForgotPasswordButton.php b/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableForgotPasswordButton.php
deleted file mode 100644
index 6c3d7df6..00000000
--- a/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableForgotPasswordButton.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-declare(strict_types=1);
-
-namespace Magento\ReCaptchaCustomer\Plugin\Customer;
-
-use Magento\Framework\Exception\InputException;
-use Magento\ReCaptchaUi\Model\IsCaptchaEnabledInterface;
-use Magento\Customer\ViewModel\ForgotPasswordButton;
-
-/**
- * Disable Forgot password button while captcha is loading
- */
-class DisableForgotPasswordButton
-{
-    /**
-     * @var IsCaptchaEnabledInterface
-     */
-    private $isCaptchaEnabled;
-
-    /**
-     * @param IsCaptchaEnabledInterface $isCaptchaEnabled
-     */
-    public function __construct(
-        IsCaptchaEnabledInterface $isCaptchaEnabled
-    ) {
-        $this->isCaptchaEnabled = $isCaptchaEnabled;
-    }
-
-    /**
-     * Temporally disable Forgot password button while captcha is loading
-     *
-     * @param ForgotPasswordButton $subject
-     * @return bool
-     * @throws InputException
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function afterDisabled(ForgotPasswordButton $subject): bool
-    {
-        $key = 'customer_forgot_password';
-        return $this->isCaptchaEnabled->isCaptchaEnabledFor($key);
-    }
-}
diff --git a/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableLoginButton.php b/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableLoginButton.php
deleted file mode 100644
index b0713fa3..00000000
--- a/vendor/magento/module-re-captcha-customer/Plugin/Customer/DisableLoginButton.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-declare(strict_types=1);
-
-namespace Magento\ReCaptchaCustomer\Plugin\Customer;
-
-use Magento\Framework\Exception\InputException;
-use Magento\ReCaptchaUi\Model\IsCaptchaEnabledInterface;
-use Magento\ReCaptchaUi\Model\UiConfigResolverInterface;
-use Magento\Customer\ViewModel\LoginButton;
-
-/**
- * Disable Login button while captcha is loading
- */
-class DisableLoginButton
-{
-    /**
-     * @var IsCaptchaEnabledInterface
-     */
-    private $isCaptchaEnabled;
-
-    /**
-     * @param IsCaptchaEnabledInterface $isCaptchaEnabled
-     */
-    public function __construct(
-        IsCaptchaEnabledInterface $isCaptchaEnabled
-    ) {
-        $this->isCaptchaEnabled = $isCaptchaEnabled;
-    }
-
-    /**
-     * Temporally disable Login button while captcha is loading
-     *
-     * @param LoginButton $subject
-     * @return bool
-     * @throws InputException
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function afterDisabled(LoginButton $subject): bool
-    {
-        $key = 'customer_login';
-        return $this->isCaptchaEnabled->isCaptchaEnabledFor($key);
-    }
-}
diff --git a/vendor/magento/module-re-captcha-customer/etc/frontend/di.xml b/vendor/magento/module-re-captcha-customer/etc/frontend/di.xml
index 73640968..e32489da 100644
--- a/vendor/magento/module-re-captcha-customer/etc/frontend/di.xml
+++ b/vendor/magento/module-re-captcha-customer/etc/frontend/di.xml
@@ -20,16 +20,38 @@
         <plugin sortOrder="1" name="inject_recaptcha_in_authentication_popup"
                 type="Magento\ReCaptchaCustomer\Plugin\Block\Account\InjectRecaptchaInAuthenticationPopup"/>
     </type>
-    <type name="Magento\Customer\ViewModel\LoginButton">
-        <plugin sortOrder="1" name="recaptcha_disable_login_button"
-                type="Magento\ReCaptchaCustomer\Plugin\Customer\DisableLoginButton"/>
-    </type>
-    <type name="Magento\Customer\ViewModel\CreateAccountButton">
-        <plugin sortOrder="1" name="recaptcha_disable_create_account_button"
-                type="Magento\ReCaptchaCustomer\Plugin\Customer\DisableCreateAccountButton"/>
-    </type>
-    <type name="Magento\Customer\ViewModel\ForgotPasswordButton">
-        <plugin sortOrder="1" name="recaptcha_disable_forgot_password_button"
-                type="Magento\ReCaptchaCustomer\Plugin\Customer\DisableForgotPasswordButton"/>
+    <type name="Magento\Framework\View\Element\ButtonLockManager">
+        <arguments>
+            <argument name="buttonLockPool" xsi:type="array">
+                <item name="customer_create_form_submit" xsi:type="object">Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerCreateFormSubmit</item>
+                <item name="customer_edit_form_submit" xsi:type="object">Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerEditFormSubmit</item>
+                <item name="customer_forgot_password_form_submit" xsi:type="object">Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerForgotPasswordFormSubmit</item>
+                <item name="customer_login_form_submit" xsi:type="object">Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerLoginFormSubmit</item>
+            </argument>
+        </arguments>
     </type>
+    <virtualType name="Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerCreateFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">customer_create_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">customer_create</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerEditFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">customer_edit_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">customer_edit</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerForgotPasswordFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">customer_forgot_password_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">customer_forgot_password</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="Magento\ReCaptchaCustomer\Model\ButtonLock\CustomerLoginFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">customer_login_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">customer_login</argument>
+        </arguments>
+    </virtualType>
 </config>
diff --git a/vendor/magento/module-re-captcha-frontend-ui/view/frontend/web/js/reCaptcha.js b/vendor/magento/module-re-captcha-frontend-ui/view/frontend/web/js/reCaptcha.js
index 14f2af32..43c476ec 100644
--- a/vendor/magento/module-re-captcha-frontend-ui/view/frontend/web/js/reCaptcha.js
+++ b/vendor/magento/module-re-captcha-frontend-ui/view/frontend/web/js/reCaptcha.js
@@ -174,7 +174,11 @@ define(
                 } else {
                     this.tokenField = null;
                 }
-                if ($('#send2').length > 0) {$('#send2').prop('disabled', false);}
+                let submitButton = parentForm.find('button:not([type]), [type=submit]');
+
+                if (submitButton.length) {
+                    submitButton.prop('disabled', false);
+                }
             },
 
             /**
diff --git a/vendor/magento/module-re-captcha-newsletter/etc/frontend/di.xml b/vendor/magento/module-re-captcha-newsletter/etc/frontend/di.xml
new file mode 100644
index 00000000..4622e4c3
--- /dev/null
+++ b/vendor/magento/module-re-captcha-newsletter/etc/frontend/di.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+
+    <type name="Magento\Framework\View\Element\ButtonLockManager">
+        <arguments>
+            <argument name="buttonLockPool" xsi:type="array">
+                <item name="newsletter_form_submit" xsi:type="object">Magento\ReCaptchaNewsletter\Model\ButtonLock\NewsletterFormSubmit</item>
+            </argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\ReCaptchaNewsletter\Model\ButtonLock\NewsletterFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">newsletter_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">newsletter</argument>
+        </arguments>
+    </virtualType>
+</config>
diff --git a/vendor/magento/module-re-captcha-review/etc/frontend/di.xml b/vendor/magento/module-re-captcha-review/etc/frontend/di.xml
new file mode 100644
index 00000000..509158d4
--- /dev/null
+++ b/vendor/magento/module-re-captcha-review/etc/frontend/di.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+
+    <type name="Magento\Framework\View\Element\ButtonLockManager">
+        <arguments>
+            <argument name="buttonLockPool" xsi:type="array">
+                <item name="review_form_submit" xsi:type="object">Magento\ReCaptchaReview\Model\ButtonLock\ReviewFormSubmit</item>
+            </argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\ReCaptchaReview\Model\ButtonLock\ReviewFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">review_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">product_review</argument>
+        </arguments>
+    </virtualType>
+</config>
diff --git a/vendor/magento/module-re-captcha-send-friend/etc/frontend/di.xml b/vendor/magento/module-re-captcha-send-friend/etc/frontend/di.xml
new file mode 100644
index 00000000..b48b3cb7
--- /dev/null
+++ b/vendor/magento/module-re-captcha-send-friend/etc/frontend/di.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+
+    <type name="Magento\Framework\View\Element\ButtonLockManager">
+        <arguments>
+            <argument name="buttonLockPool" xsi:type="array">
+                <item name="sendfriend_form_submit" xsi:type="object">Magento\ReCaptchaSendFriend\Model\ButtonLock\SendFriendFormSubmit</item>
+            </argument>
+        </arguments>
+    </type>
+    <virtualType name="Magento\ReCaptchaSendFriend\Model\ButtonLock\SendFriendFormSubmit" type="Magento\ReCaptchaUi\Model\ButtonLock">
+        <arguments>
+            <argument name="buttonCode" xsi:type="string">sendfriend_form_submit</argument>
+            <argument name="reCaptchaId" xsi:type="string">sendfriend</argument>
+        </arguments>
+    </virtualType>
+</config>
diff --git a/vendor/magento/module-re-captcha-ui/Model/ButtonLock.php b/vendor/magento/module-re-captcha-ui/Model/ButtonLock.php
new file mode 100644
index 00000000..8b349ee5
--- /dev/null
+++ b/vendor/magento/module-re-captcha-ui/Model/ButtonLock.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\ReCaptchaUi\Model;
+
+use Magento\Framework\View\Element\ButtonLockInterface;
+
+class ButtonLock implements ButtonLockInterface
+{
+    /**
+     * @var string
+     */
+    private $reCaptchaId;
+
+    /**
+     * @var string
+     */
+    private $buttonCode;
+
+    /**
+     * @var IsCaptchaEnabledInterface
+     */
+    private $isCaptchaEnabled;
+
+    /**
+     * @param IsCaptchaEnabledInterface $isCaptchaEnabled
+     * @param string $reCaptchaId
+     * @param string $buttonCode
+     */
+    public function __construct(
+        IsCaptchaEnabledInterface $isCaptchaEnabled,
+        string $reCaptchaId,
+        string $buttonCode
+    ) {
+        $this->isCaptchaEnabled = $isCaptchaEnabled;
+        $this->reCaptchaId = $reCaptchaId;
+        $this->buttonCode = $buttonCode;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function getCode(): string
+    {
+        return $this->buttonCode;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function isDisabled(): bool
+    {
+        return $this->isCaptchaEnabled->isCaptchaEnabledFor($this->reCaptchaId);
+    }
+}
