diff --git a/app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php b/app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php
new file mode 100644
index 0000000000000..583bae2ec8ae4
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Plugin/CustomerFlushFormKey.php
@@ -0,0 +1,55 @@
+session = $session;
+ $this->dataFormKey = $dataFormKey;
+ }
+
+ /**
+ * @param FlushFormKey $subject
+ * @param callable $proceed
+ * @param Observer $observer
+ * @return void
+ *
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function aroundExecute(FlushFormKey $subject, callable $proceed, Observer $observer)
+ {
+ $currentFormKey = $this->dataFormKey->getFormKey();
+ $proceed($observer);
+ $beforeParams = $this->session->getBeforeRequestParams();
+ if ($beforeParams['form_key'] == $currentFormKey) {
+ $beforeParams['form_key'] = $this->dataFormKey->getFormKey();
+ $this->session->setBeforeRequestParams($beforeParams);
+ }
+ }
+}
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php b/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
new file mode 100644
index 0000000000000..6697cd43cea4b
--- /dev/null
+++ b/app/code/Magento/Customer/Test/Unit/Model/Plugin/CustomerFlushFormKeyTest.php
@@ -0,0 +1,106 @@
+cookieFormKey = $this->getMockBuilder(CookieFormKey::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ /** @var DataFormKey | MockObject */
+ $this->dataFormKey = $this->getMockBuilder(DataFormKey::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ /** @var Session | MockObject */
+ $this->customerSession = $this->getMockBuilder(Session::class)
+ ->disableOriginalConstructor()
+ ->setMethods(['getBeforeRequestParams', 'setBeforeRequestParams'])
+ ->getMock();
+
+ }
+
+ /**
+ * @dataProvider aroundFlushFormKeyProvider
+ * @param $beforeFormKey
+ * @param $currentFormKey
+ * @param $getFormKeyTimes
+ * @param $setBeforeParamsTimes
+ */
+ public function testAroundFlushFormKey(
+ $beforeFormKey,
+ $currentFormKey,
+ $getFormKeyTimes,
+ $setBeforeParamsTimes
+ ) {
+ $observerDto = new Observer();
+ $observer = new FlushFormKey($this->cookieFormKey, $this->dataFormKey);
+ $plugin = new CustomerFlushFormKey($this->customerSession, $this->dataFormKey);
+
+ $beforeParams['form_key'] = $beforeFormKey;
+
+ $this->dataFormKey->expects($this->exactly($getFormKeyTimes))
+ ->method('getFormKey')
+ ->willReturn($currentFormKey);
+
+ $this->customerSession->expects($this->once())
+ ->method('getBeforeRequestParams')
+ ->willReturn($beforeParams);
+
+ $this->customerSession->expects($this->exactly($setBeforeParamsTimes))
+ ->method('setBeforeRequestParams')
+ ->with($beforeParams);
+
+ $proceed = function ($observerDto) use ($observer) {
+ return $observer->execute($observerDto);
+ };
+
+ $plugin->aroundExecute($observer, $proceed, $observerDto);
+ }
+
+ /**
+ * Data provider for testAroundFlushFormKey
+ *
+ * @return array
+ */
+ public function aroundFlushFormKeyProvider()
+ {
+ return [
+ 'valid form key' => ['form_key_value', 'form_key_value', 2, 1],
+ 'corrupted form key' => ['form_old_key_value', 'form_key_value', 1, 0],
+ 'missed form key' => [null, 'form_key_value', 1, 0]
+ ];
+ }
+}
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index 48e02e6d030f2..5b33328bb176d 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -313,6 +313,9 @@
+
+
+
Magento\Customer\Model\Cache\Type\Notification