diff --git a/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml b/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..69fcd117f77002a0bfb84df8e45ceccb79123bf7
--- /dev/null
+++ b/app/code/Magento/CatalogRule/etc/webapi_soap/events.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="catalog_product_get_final_price">
+        <observer name="catalogrule" instance="Magento\CatalogRule\Model\Observer" method="processFrontFinalPrice" />
+    </event>
+    <event name="prepare_catalog_product_collection_prices">
+        <observer name="catalogrule" instance="Magento\CatalogRule\Model\Observer" method="prepareCatalogProductCollectionPrices" />
+    </event>
+</config>
diff --git a/app/code/Magento/Checkout/etc/webapi_rest/events.xml b/app/code/Magento/Checkout/etc/webapi_rest/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..64b405aacf3b2dce5e2b1411f9dba70705e3c177
--- /dev/null
+++ b/app/code/Magento/Checkout/etc/webapi_rest/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_save_after">
+        <observer name="set_checkout_quote_id" instance="Magento\Checkout\Model\Observer" method="salesQuoteSaveAfter" />
+    </event>
+</config>
diff --git a/app/code/Magento/Checkout/etc/webapi_soap/events.xml b/app/code/Magento/Checkout/etc/webapi_soap/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..64b405aacf3b2dce5e2b1411f9dba70705e3c177
--- /dev/null
+++ b/app/code/Magento/Checkout/etc/webapi_soap/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_save_after">
+        <observer name="set_checkout_quote_id" instance="Magento\Checkout\Model\Observer" method="salesQuoteSaveAfter" />
+    </event>
+</config>
diff --git a/app/code/Magento/Customer/etc/webapi_rest/events.xml b/app/code/Magento/Customer/etc/webapi_rest/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a605a1082011245cd4947b702800eb504bd917cf
--- /dev/null
+++ b/app/code/Magento/Customer/etc/webapi_rest/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_save_after">
+        <observer name="customer_visitor" instance="Magento\Customer\Model\Visitor" method="bindQuoteCreate" />
+    </event>
+</config>
diff --git a/app/code/Magento/Customer/etc/webapi_soap/events.xml b/app/code/Magento/Customer/etc/webapi_soap/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a605a1082011245cd4947b702800eb504bd917cf
--- /dev/null
+++ b/app/code/Magento/Customer/etc/webapi_soap/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_save_after">
+        <observer name="customer_visitor" instance="Magento\Customer\Model\Visitor" method="bindQuoteCreate" />
+    </event>
+</config>
diff --git a/app/code/Magento/Downloadable/etc/adminhtml/events.xml b/app/code/Magento/Downloadable/etc/events.xml
similarity index 85%
rename from app/code/Magento/Downloadable/etc/adminhtml/events.xml
rename to app/code/Magento/Downloadable/etc/events.xml
index 46f63240abdee844f9859bd2bd180fc3c9682efc..47dc66111e8da011772662ef6e547547ada65ce6 100644
--- a/app/code/Magento/Downloadable/etc/adminhtml/events.xml
+++ b/app/code/Magento/Downloadable/etc/events.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
     <event name="sales_order_item_save_commit_after">
         <observer name="downloadable_observer" instance="Magento\Downloadable\Model\Observer" method="saveDownloadableOrderItem" />
     </event>
diff --git a/app/code/Magento/Downloadable/etc/frontend/events.xml b/app/code/Magento/Downloadable/etc/frontend/events.xml
index ac54f059a374941dbacd66c49a5e67549d052f93..0b39fd0e3909d6ae458afd5d18568197412da811 100644
--- a/app/code/Magento/Downloadable/etc/frontend/events.xml
+++ b/app/code/Magento/Downloadable/etc/frontend/events.xml
@@ -6,12 +6,6 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
-    <event name="sales_order_item_save_commit_after">
-        <observer name="downloadable_observer" instance="Magento\Downloadable\Model\Observer" method="saveDownloadableOrderItem" />
-    </event>
-    <event name="sales_order_save_commit_after">
-        <observer name="downloadable_observer" instance="Magento\Downloadable\Model\Observer" method="setLinkStatus" />
-    </event>
     <event name="sales_model_service_quote_submit_success">
         <observer name="checkout_type_onepage_save_order_after" instance="Magento\Downloadable\Model\Observer" method="setHasDownloadableProducts" />
     </event>
diff --git a/app/code/Magento/Msrp/etc/webapi_rest/events.xml b/app/code/Magento/Msrp/etc/webapi_rest/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e4fb9f4b8aa02ca88a0230128a7a26f369ea4432
--- /dev/null
+++ b/app/code/Magento/Msrp/etc/webapi_rest/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_collect_totals_after">
+        <observer name="catalog_msrp" instance="Magento\Msrp\Model\Observer\Frontend\Quote\SetCanApplyMsrp" method="execute" />
+    </event>
+</config>
diff --git a/app/code/Magento/Msrp/etc/webapi_soap/events.xml b/app/code/Magento/Msrp/etc/webapi_soap/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e4fb9f4b8aa02ca88a0230128a7a26f369ea4432
--- /dev/null
+++ b/app/code/Magento/Msrp/etc/webapi_soap/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_collect_totals_after">
+        <observer name="catalog_msrp" instance="Magento\Msrp\Model\Observer\Frontend\Quote\SetCanApplyMsrp" method="execute" />
+    </event>
+</config>
diff --git a/app/code/Magento/Paypal/view/frontend/web/js/action/set-payment-method.js b/app/code/Magento/Paypal/view/frontend/web/js/action/set-payment-method.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffae21860511e483f79b59db7b4b4c10bd02d5eb
--- /dev/null
+++ b/app/code/Magento/Paypal/view/frontend/web/js/action/set-payment-method.js
@@ -0,0 +1,53 @@
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+define(
+    [
+        'jquery',
+        'Magento_Checkout/js/model/quote',
+        'Magento_Checkout/js/model/url-builder',
+        'mage/storage',
+        'Magento_Checkout/js/model/error-processor',
+        'Magento_Customer/js/model/customer'
+    ],
+    function ($, quote, urlBuilder, storage, errorProcessor, customer) {
+        'use strict';
+
+        return function () {
+            var serviceUrl,
+                payload,
+                paymentData = quote.paymentMethod();
+
+            /**
+             * Checkout for guest and registered customer.
+             */
+            if (!customer.isLoggedIn()) {
+                serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/selected-payment-method', {
+                    quoteId: quote.getQuoteId()
+                });
+                payload = {
+                    cartId: quote.getQuoteId(),
+                    method: paymentData
+                };
+            } else {
+                serviceUrl = urlBuilder.createUrl('/carts/mine/selected-payment-method', {});
+                payload = {
+                    cartId: quote.getQuoteId(),
+                    method: paymentData
+                };
+            }
+            return storage.put(
+                serviceUrl, JSON.stringify(payload)
+            ).done(
+                function () {
+                    $.mage.redirect(window.checkoutConfig.payment.paypalExpress.redirectUrl[quote.paymentMethod().method]);
+                }
+            ).fail(
+                function (response) {
+                    errorProcessor.process(response);
+                }
+            );
+        };
+    }
+);
diff --git a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js
index 8f5b3e9f16509a3022c5b26b333b1785dfade68a..285bb05dc69e6bece200ba58ea60ba0e1588e5f8 100644
--- a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js
+++ b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/paypal-express-abstract.js
@@ -1,5 +1,5 @@
 /**
- * Copyright © 2015 Magento. All rights reserved.
+ * Copyright В© 2015 Magento. All rights reserved.
  * See COPYING.txt for license details.
  */
 /*browser:true*/
@@ -7,9 +7,10 @@
 define(
     [
         'jquery',
-        'Magento_Checkout/js/view/payment/default'
+        'Magento_Checkout/js/view/payment/default',
+        'Magento_Paypal/js/action/set-payment-method'
     ],
-    function ($, Component) {
+    function ($, Component, setPaymentMethodAction) {
         'use strict';
 
         return Component.extend({
@@ -67,8 +68,10 @@ define(
             },
 
             /** Redirect to paypal */
-            continueToPayPal: function() {
-                $.mage.redirect(window.checkoutConfig.payment.paypalExpress.redirectUrl[this.item.method]);
+            continueToPayPal: function () {
+                //update payment method information if additional data was changed
+                this.selectPaymentMethod();
+                setPaymentMethodAction();
                 return false;
             }
         });
diff --git a/app/code/Magento/Quote/Model/PaymentMethodManagement.php b/app/code/Magento/Quote/Model/PaymentMethodManagement.php
index dee5ff38db125b24c40792d3c714e42c79dd4120..d29e3732d747f9b920c40ee2931040b8b70a8907 100644
--- a/app/code/Magento/Quote/Model/PaymentMethodManagement.php
+++ b/app/code/Magento/Quote/Model/PaymentMethodManagement.php
@@ -38,6 +38,7 @@ class PaymentMethodManagement implements \Magento\Quote\Api\PaymentMethodManagem
         \Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
         \Magento\Payment\Model\Checks\ZeroTotal $zeroTotalValidator,
         \Magento\Payment\Model\MethodList $methodList
+
     ) {
         $this->quoteRepository = $quoteRepository;
         $this->zeroTotalValidator = $zeroTotalValidator;
@@ -68,10 +69,6 @@ class PaymentMethodManagement implements \Magento\Quote\Api\PaymentMethodManagem
         $payment->importData($data);
 
         if ($quote->isVirtual()) {
-            // check if billing address is set
-            if ($quote->getBillingAddress()->getCountryId() === null) {
-                throw new InvalidTransitionException(__('Billing address is not set'));
-            }
             $quote->getBillingAddress()->setPaymentMethod($payment->getMethod());
         } else {
             // check if shipping address is set
diff --git a/app/code/Magento/Quote/Test/Unit/Model/PaymentMethodManagementTest.php b/app/code/Magento/Quote/Test/Unit/Model/PaymentMethodManagementTest.php
index c81db89b83e9b7409f8a07d582ff710f53da9dea..acb2282f1a96d8139a4f438eae6e2212d1c82622 100644
--- a/app/code/Magento/Quote/Test/Unit/Model/PaymentMethodManagementTest.php
+++ b/app/code/Magento/Quote/Test/Unit/Model/PaymentMethodManagementTest.php
@@ -152,7 +152,6 @@ class PaymentMethodManagementTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $billingAddressMock->expects($this->once())->method('getCountryId')->willReturn(100);
         $billingAddressMock->expects($this->once())
             ->method('setPaymentMethod')
             ->with($paymentMethod)
@@ -160,7 +159,7 @@ class PaymentMethodManagementTest extends \PHPUnit_Framework_TestCase
 
         $quoteMock->expects($this->exactly(2))->method('getPayment')->willReturn($paymentMock);
         $quoteMock->expects($this->exactly(2))->method('isVirtual')->willReturn(true);
-        $quoteMock->expects($this->exactly(2))->method('getBillingAddress')->willReturn($billingAddressMock);
+        $quoteMock->expects($this->once())->method('getBillingAddress')->willReturn($billingAddressMock);
 
         $methodInstance = $this->getMockForAbstractClass('Magento\Payment\Model\MethodInterface');
         $paymentMock->expects($this->once())->method('getMethodInstance')->willReturn($methodInstance);
@@ -178,49 +177,6 @@ class PaymentMethodManagementTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($paymentId, $this->model->set($cartId, $methodMock));
     }
 
-    /**
-     * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException
-     * @expectedExceptionMessage Billing address is not set
-     */
-    public function testSetVirtualProductThrowsExceptionIfBillingAddressNotSet()
-    {
-        $cartId = 100;
-        $methodData = ['method' => 'data'];
-
-        $quoteMock = $this->getMock(
-            'Magento\Quote\Model\Quote',
-            ['getPayment', 'isVirtual', 'getBillingAddress'],
-            [],
-            '',
-            false
-        );
-        $this->quoteRepositoryMock->expects($this->once())->method('get')->with($cartId)->willReturn($quoteMock);
-
-        $methodMock = $this->getMock('Magento\Quote\Model\Quote\Payment', ['setChecks', 'getData'], [], '', false);
-        $methodMock->expects($this->once())
-            ->method('setChecks')
-            ->with([
-                \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_CHECKOUT,
-                \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_COUNTRY,
-                \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_CURRENCY,
-                \Magento\Payment\Model\Method\AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX,
-            ])
-            ->willReturnSelf();
-        $methodMock->expects($this->once())->method('getData')->willReturn($methodData);
-
-        $paymentMock = $this->getMock('Magento\Quote\Model\Quote\Payment', ['importData', 'getMethod'], [], '', false);
-        $paymentMock->expects($this->once())->method('importData')->with($methodData)->willReturnSelf();
-
-        $billingAddressMock = $this->getMock('Magento\Quote\Model\Quote\Address', ['getCountryId'], [], '', false);
-        $billingAddressMock->expects($this->once())->method('getCountryId')->willReturn(null);
-
-        $quoteMock->expects($this->once())->method('getPayment')->willReturn($paymentMock);
-        $quoteMock->expects($this->once())->method('isVirtual')->willReturn(true);
-        $quoteMock->expects($this->once())->method('getBillingAddress')->willReturn($billingAddressMock);
-
-        $this->model->set($cartId, $methodMock);
-    }
-
     /**
      * @expectedException \Magento\Framework\Exception\State\InvalidTransitionException
      * @expectedExceptionMessage The requested Payment Method is not available.
@@ -269,7 +225,6 @@ class PaymentMethodManagementTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $billingAddressMock->expects($this->once())->method('getCountryId')->willReturn(100);
         $billingAddressMock->expects($this->once())
             ->method('setPaymentMethod')
             ->with($paymentMethod)
@@ -277,7 +232,7 @@ class PaymentMethodManagementTest extends \PHPUnit_Framework_TestCase
 
         $quoteMock->expects($this->once())->method('getPayment')->willReturn($paymentMock);
         $quoteMock->expects($this->exactly(2))->method('isVirtual')->willReturn(true);
-        $quoteMock->expects($this->exactly(2))->method('getBillingAddress')->willReturn($billingAddressMock);
+        $quoteMock->expects($this->once())->method('getBillingAddress')->willReturn($billingAddressMock);
 
         $methodInstance = $this->getMockForAbstractClass('Magento\Payment\Model\MethodInterface');
         $paymentMock->expects($this->once())->method('getMethodInstance')->willReturn($methodInstance);
diff --git a/app/code/Magento/Quote/etc/frontend/events.xml b/app/code/Magento/Quote/etc/events.xml
similarity index 81%
rename from app/code/Magento/Quote/etc/frontend/events.xml
rename to app/code/Magento/Quote/etc/events.xml
index 8c38cda0dbe8436fc9d64a6fed11f2d2a8582b96..b14058b03e5fd77f6eec749ddb213a1c41a4a825 100644
--- a/app/code/Magento/Quote/etc/frontend/events.xml
+++ b/app/code/Magento/Quote/etc/events.xml
@@ -5,7 +5,7 @@
  * See COPYING.txt for license details.
  */
 -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
     <event name="sales_quote_address_collect_totals_before">
         <observer name="sales_customer_validate_vat_number" instance="Magento\Quote\Model\Observer\Frontend\Quote\Address\CollectTotals" method="dispatch" />
     </event>
diff --git a/app/code/Magento/Reports/etc/webapi_rest/events.xml b/app/code/Magento/Reports/etc/webapi_rest/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e8d93278a9def14d6032555c93f01f73e2b323b
--- /dev/null
+++ b/app/code/Magento/Reports/etc/webapi_rest/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_item_save_before">
+        <observer name="reports" instance="Magento\Reports\Model\Event\Observer" method="checkoutCartAddProduct" />
+    </event>
+</config>
diff --git a/app/code/Magento/Reports/etc/webapi_soap/events.xml b/app/code/Magento/Reports/etc/webapi_soap/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e8d93278a9def14d6032555c93f01f73e2b323b
--- /dev/null
+++ b/app/code/Magento/Reports/etc/webapi_soap/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_item_save_before">
+        <observer name="reports" instance="Magento\Reports\Model\Event\Observer" method="checkoutCartAddProduct" />
+    </event>
+</config>
diff --git a/app/code/Magento/Sales/etc/webapi_rest/events.xml b/app/code/Magento/Sales/etc/webapi_rest/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..763c0dcd5bc94cdd50da178debad4dc3146dd207
--- /dev/null
+++ b/app/code/Magento/Sales/etc/webapi_rest/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_address_collect_totals_after">
+        <observer name="sales_customer_validate_vat_number" instance="Magento\Sales\Model\Observer\Frontend\Quote\RestoreCustomerGroupId" method="execute" />
+    </event>
+</config>
diff --git a/app/code/Magento/Sales/etc/webapi_soap/events.xml b/app/code/Magento/Sales/etc/webapi_soap/events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..763c0dcd5bc94cdd50da178debad4dc3146dd207
--- /dev/null
+++ b/app/code/Magento/Sales/etc/webapi_soap/events.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2015 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
+    <event name="sales_quote_address_collect_totals_after">
+        <observer name="sales_customer_validate_vat_number" instance="Magento\Sales\Model\Observer\Frontend\Quote\RestoreCustomerGroupId" method="execute" />
+    </event>
+</config>
diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/PaymentMethodManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/PaymentMethodManagementTest.php
index 6cf9dacdbb0b184ddb1df7116a213f16a7f4416c..8a6115ef70be0b80a8e42b1ee9df067fafdbb544 100644
--- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/PaymentMethodManagementTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/PaymentMethodManagementTest.php
@@ -131,44 +131,6 @@ class PaymentMethodManagementTest extends \Magento\TestFramework\TestCase\Webapi
         $this->assertNotNull($this->_webApiCall($serviceInfo, $requestData));
     }
 
-    /**
-     * @magentoApiDataFixture Magento/Checkout/_files/quote_with_virtual_product_saved.php
-     * @expectedException \Exception
-     * @expectedExceptionMessage Billing address is not set
-     */
-    public function testSetPaymentWithVirtualProductWithoutAddress()
-    {
-        /** @var \Magento\Quote\Model\Quote  $quote */
-        $quote = $this->objectManager->create('\Magento\Quote\Model\Quote');
-        $quote->load('test_order_with_virtual_product_without_address', 'reserved_order_id');
-        $cartId = $quote->getId();
-
-        $serviceInfo = [
-            'rest' => [
-                'resourcePath' => self::RESOURCE_PATH . $cartId . '/selected-payment-method',
-                'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_PUT,
-            ],
-            'soap' => [
-                'service' => self::SERVICE_NAME,
-                'serviceVersion' => self::SERVICE_VERSION,
-                'operation' => self::SERVICE_NAME . 'set',
-            ],
-        ];
-
-        $requestData = [
-            "cartId" => $cartId,
-            "method" => [
-                'method' => 'checkmo',
-                'po_number' => '200',
-                'cc_owner' => 'tester',
-                'cc_type' => 'test',
-                'cc_exp_year' => '2014',
-                'cc_exp_month' => '1',
-            ],
-        ];
-        $this->assertNotNull($this->_webApiCall($serviceInfo, $requestData));
-    }
-
     /**
      * @magentoApiDataFixture Magento/Checkout/_files/quote_with_simple_product_saved.php
      * @expectedException \Exception