diff --git a/app/code/Magento/CatalogWidget/Model/Rule/Condition/Combine.php b/app/code/Magento/CatalogWidget/Model/Rule/Condition/Combine.php
index 283309247cd9d0fbdc9edc8b0cb2bf2d06b2f33c..e40aae5d189b04b9e63911fddbe4813e378fcfa8 100644
--- a/app/code/Magento/CatalogWidget/Model/Rule/Condition/Combine.php
+++ b/app/code/Magento/CatalogWidget/Model/Rule/Condition/Combine.php
@@ -82,7 +82,7 @@ class Combine extends \Magento\Rule\Model\Condition\Combine
     public function collectValidatedAttributes($productCollection)
     {
         foreach ($this->getConditions() as $condition) {
-            $condition->addToCollection($productCollection);
+            $condition->collectValidatedAttributes($productCollection);
         }
         return $this;
     }
diff --git a/app/code/Magento/CatalogWidget/Model/Rule/Condition/Product.php b/app/code/Magento/CatalogWidget/Model/Rule/Condition/Product.php
index 262ba8f6a6d8dd198da0cb85c87e37a4c1d73795..7d41741135b80498f9b77cc77e4014369efaefc1 100644
--- a/app/code/Magento/CatalogWidget/Model/Rule/Condition/Product.php
+++ b/app/code/Magento/CatalogWidget/Model/Rule/Condition/Product.php
@@ -223,4 +223,12 @@ class Product extends \Magento\Rule\Model\Condition\Product\AbstractProduct
 
         return $result;
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function collectValidatedAttributes($productCollection)
+    {
+        return $this->addToCollection($productCollection);
+    }
 }
diff --git a/app/code/Magento/CatalogWidget/Test/Unit/Model/Rule/Condition/CombineTest.php b/app/code/Magento/CatalogWidget/Test/Unit/Model/Rule/Condition/CombineTest.php
index fa6474e31e7ccb715c09d1b8d2df5523f2ec9f13..dd42ee1c7c9216fc3749a92c643c4afc972bc233 100644
--- a/app/code/Magento/CatalogWidget/Test/Unit/Model/Rule/Condition/CombineTest.php
+++ b/app/code/Magento/CatalogWidget/Test/Unit/Model/Rule/Condition/CombineTest.php
@@ -80,9 +80,9 @@ class CombineTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
         $condition = $this->getMockBuilder(\Magento\CatalogWidget\Model\Rule\Condition\Combine::class)
-            ->disableOriginalConstructor()->setMethods(['addToCollection'])
+            ->disableOriginalConstructor()->setMethods(['collectValidatedAttributes'])
             ->getMock();
-        $condition->expects($this->any())->method('addToCollection')->with($collection)
+        $condition->expects($this->any())->method('collectValidatedAttributes')->with($collection)
             ->will($this->returnSelf());
 
         $this->condition->setConditions([$condition]);
diff --git a/app/code/Magento/Checkout/Block/Cart/LayoutProcessor.php b/app/code/Magento/Checkout/Block/Cart/LayoutProcessor.php
index a492002b0a5a5f55219efe09c3422c39f46e9fee..a042c41634bcb615921b93e01c4c42b23bfb8cd4 100644
--- a/app/code/Magento/Checkout/Block/Cart/LayoutProcessor.php
+++ b/app/code/Magento/Checkout/Block/Cart/LayoutProcessor.php
@@ -85,14 +85,14 @@ class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcesso
                 'visible' => true,
                 'formElement' => 'select',
                 'label' => __('Country'),
-                'options' => $this->countryCollection->loadByStore()->toOptionArray(),
+                'options' => [],
                 'value' => null
             ],
             'region_id' => [
                 'visible' => true,
                 'formElement' => 'select',
                 'label' => __('State/Province'),
-                'options' => $this->regionCollection->load()->toOptionArray(),
+                'options' => [],
                 'value' => null
             ],
             'postcode' => [
@@ -103,6 +103,13 @@ class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcesso
             ]
         ];
 
+        if (!isset($jsLayout['components']['checkoutProvider']['dictionaries'])) {
+            $jsLayout['components']['checkoutProvider']['dictionaries'] = [
+                'country_id' => $this->countryCollection->loadByStore()->toOptionArray(),
+                'region_id' => $this->regionCollection->addAllowedCountriesFilter()->toOptionArray(),
+            ];
+        }
+
         if (isset($jsLayout['components']['block-summary']['children']['block-shipping']['children']
             ['address-fieldsets']['children'])
         ) {
diff --git a/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php b/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php
index 1882d88e04a8b25f51ccf0afbd92a1635f443735..e7686e4bea58b3a5f4db81e1b11f2e17770744c8 100644
--- a/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php
+++ b/app/code/Magento/Checkout/Block/Checkout/AttributeMerger.php
@@ -192,6 +192,15 @@ class AttributeMerger
             'visible' => isset($additionalConfig['visible']) ? $additionalConfig['visible'] : true,
         ];
 
+        if ($attributeCode === 'region_id' || $attributeCode === 'country_id') {
+            unset($element['options']);
+            $element['deps'] = [$providerName];
+            $element['imports'] = [
+                'initialOptions' => 'index = ' . $providerName . ':dictionaries.' . $attributeCode,
+                'setOptions' => 'index = ' . $providerName . ':dictionaries.' . $attributeCode
+            ];
+        }
+
         if (isset($attributeConfig['value']) && $attributeConfig['value'] != null) {
             $element['value'] = $attributeConfig['value'];
         } elseif (isset($attributeConfig['default']) && $attributeConfig['default'] != null) {
@@ -341,11 +350,11 @@ class AttributeMerger
      * @param string $attributeCode
      * @param array $attributeConfig
      * @return array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     protected function getFieldOptions($attributeCode, array $attributeConfig)
     {
-        $options = isset($attributeConfig['options']) ? $attributeConfig['options'] : [];
-        return ($attributeCode == 'country_id') ? $this->orderCountryOptions($options) : $options;
+        return isset($attributeConfig['options']) ? $attributeConfig['options'] : [];
     }
 
     /**
@@ -353,6 +362,7 @@ class AttributeMerger
      *
      * @param array $countryOptions
      * @return array
+     * @deprecated
      */
     protected function orderCountryOptions(array $countryOptions)
     {
diff --git a/app/code/Magento/Checkout/Block/Checkout/DirectoryDataProcessor.php b/app/code/Magento/Checkout/Block/Checkout/DirectoryDataProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a02ebbd079a407e531f17168531a5f9439915fb
--- /dev/null
+++ b/app/code/Magento/Checkout/Block/Checkout/DirectoryDataProcessor.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Checkout\Block\Checkout;
+
+use Magento\Directory\Helper\Data as DirectoryHelper;
+use Magento\Store\Api\StoreResolverInterface;
+
+/**
+ * Directory data processor.
+ *
+ * This class adds various country and region dictionaries to checkout page.
+ * This data can be used by other UI components during checkout flow.
+ */
+class DirectoryDataProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcessorInterface
+{
+    /**
+     * @var array
+     */
+    private $countryOptions;
+
+    /**
+     * @var array
+     */
+    private $regionOptions;
+
+    /**
+     * @var \Magento\Directory\Model\ResourceModel\Region\CollectionFactory
+     */
+    private $regionCollectionFactory;
+
+    /**
+     * @var \Magento\Directory\Model\ResourceModel\Region\CollectionFactory
+     */
+    private $countryCollectionFactory;
+
+    /**
+     * @var StoreResolverInterface
+     */
+    private $storeResolver;
+
+    /**
+     * @var DirectoryHelper
+     */
+    private $directoryHelper;
+
+    /**
+     * @param \Magento\Directory\Model\ResourceModel\Country\CollectionFactory $countryCollection
+     * @param \Magento\Directory\Model\ResourceModel\Region\CollectionFactory $regionCollection
+     * @param StoreResolverInterface $storeResolver
+     * @param DirectoryHelper $directoryHelper
+     */
+    public function __construct(
+        \Magento\Directory\Model\ResourceModel\Country\CollectionFactory $countryCollection,
+        \Magento\Directory\Model\ResourceModel\Region\CollectionFactory $regionCollection,
+        StoreResolverInterface $storeResolver,
+        DirectoryHelper $directoryHelper
+    ) {
+        $this->countryCollectionFactory = $countryCollection;
+        $this->regionCollectionFactory = $regionCollection;
+        $this->storeResolver = $storeResolver;
+        $this->directoryHelper = $directoryHelper;
+    }
+
+    /**
+     * Process js Layout of block
+     *
+     * @param array $jsLayout
+     * @return array
+     */
+    public function process($jsLayout)
+    {
+        if (!isset($jsLayout['components']['checkoutProvider']['dictionaries'])) {
+            $jsLayout['components']['checkoutProvider']['dictionaries'] = [
+                'country_id' => $this->getCountryOptions(),
+                'region_id' => $this->getRegionOptions(),
+            ];
+        }
+
+        return $jsLayout;
+    }
+
+    /**
+     * Get country options list.
+     *
+     * @return array
+     */
+    private function getCountryOptions()
+    {
+        if (!isset($this->countryOptions)) {
+            $this->countryOptions = $this->countryCollectionFactory->create()->loadByStore(
+                $this->storeResolver->getCurrentStoreId()
+            )->toOptionArray();
+            $this->countryOptions = $this->orderCountryOptions($this->countryOptions);
+        }
+
+        return $this->countryOptions;
+    }
+
+    /**
+     * Get region options list.
+     *
+     * @return array
+     */
+    private function getRegionOptions()
+    {
+        if (!isset($this->regionOptions)) {
+            $this->regionOptions = $this->regionCollectionFactory->create()->addAllowedCountriesFilter(
+                $this->storeResolver->getCurrentStoreId()
+            )->toOptionArray();
+        }
+
+        return $this->regionOptions;
+    }
+
+    /**
+     * Sort country options by top country codes.
+     *
+     * @param array $countryOptions
+     * @return array
+     */
+    private function orderCountryOptions(array $countryOptions)
+    {
+        $topCountryCodes = $this->directoryHelper->getTopCountryCodes();
+        if (empty($topCountryCodes)) {
+            return $countryOptions;
+        }
+
+        $headOptions = [];
+        $tailOptions = [[
+            'value' => 'delimiter',
+            'label' => '──────────',
+            'disabled' => true,
+        ]];
+        foreach ($countryOptions as $countryOption) {
+            if (empty($countryOption['value']) || in_array($countryOption['value'], $topCountryCodes)) {
+                array_push($headOptions, $countryOption);
+            } else {
+                array_push($tailOptions, $countryOption);
+            }
+        }
+        return array_merge($headOptions, $tailOptions);
+    }
+}
diff --git a/app/code/Magento/Checkout/Block/Checkout/LayoutProcessor.php b/app/code/Magento/Checkout/Block/Checkout/LayoutProcessor.php
index 1b2c7444198915c866a55ca2cc9b8e6b29544e39..fd8434703ab756a2664e235332d09e13e7890e19 100644
--- a/app/code/Magento/Checkout/Block/Checkout/LayoutProcessor.php
+++ b/app/code/Magento/Checkout/Block/Checkout/LayoutProcessor.php
@@ -7,7 +7,11 @@ namespace Magento\Checkout\Block\Checkout;
 
 use Magento\Checkout\Helper\Data;
 use Magento\Framework\App\ObjectManager;
+use Magento\Store\Api\StoreResolverInterface;
 
+/**
+ * Class LayoutProcessor
+ */
 class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcessorInterface
 {
     /**
@@ -35,6 +39,16 @@ class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcesso
      */
     private $checkoutDataHelper;
 
+    /**
+     * @var StoreResolverInterface
+     */
+    private $storeResolver;
+
+    /**
+     * @var \Magento\Shipping\Model\Config
+     */
+    private $shippingConfig;
+
     /**
      * @param \Magento\Customer\Model\AttributeMetadataDataProvider $attributeMetadataDataProvider
      * @param \Magento\Ui\Component\Form\AttributeMapper $attributeMapper
@@ -146,6 +160,16 @@ class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcesso
                 $elements
             );
         }
+        if (isset($jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
+            ['step-config']['children']['shipping-rates-validation']['children']
+        )) {
+            $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
+            ['step-config']['children']['shipping-rates-validation']['children'] =
+                $this->processShippingChildrenComponents(
+                    $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
+                    ['step-config']['children']['shipping-rates-validation']['children']
+                );
+        }
 
         if (isset($jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']
             ['children']['shippingAddress']['children']['shipping-address-fieldset']['children']
@@ -163,6 +187,26 @@ class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcesso
         return $jsLayout;
     }
 
+    /**
+     * Process shipping configuration to exclude inactive carriers.
+     *
+     * @param array $shippingRatesLayout
+     * @return array
+     */
+    private function processShippingChildrenComponents($shippingRatesLayout)
+    {
+        $activeCarriers = $this->getShippingConfig()->getActiveCarriers(
+            $this->getStoreResolver()->getCurrentStoreId()
+        );
+        foreach (array_keys($shippingRatesLayout) as $carrierName) {
+            $carrierKey = str_replace('-rates-validation', '', $carrierName);
+            if (!array_key_exists($carrierKey, $activeCarriers)) {
+                unset($shippingRatesLayout[$carrierName]);
+            }
+        }
+        return $shippingRatesLayout;
+    }
+
     /**
      * Appends billing address form component to payment layout
      * @param array $paymentLayout
@@ -314,4 +358,34 @@ class LayoutProcessor implements \Magento\Checkout\Block\Checkout\LayoutProcesso
 
         return $this->checkoutDataHelper;
     }
+
+    /**
+     * Retrieve Shipping Configuration.
+     *
+     * @return \Magento\Shipping\Model\Config
+     * @deprecated
+     */
+    private function getShippingConfig()
+    {
+        if (!$this->shippingConfig) {
+            $this->shippingConfig = ObjectManager::getInstance()->get(\Magento\Shipping\Model\Config::class);
+        }
+
+        return $this->shippingConfig;
+    }
+
+    /**
+     * Get store resolver.
+     *
+     * @return StoreResolverInterface
+     * @deprecated
+     */
+    private function getStoreResolver()
+    {
+        if (!$this->storeResolver) {
+            $this->storeResolver = ObjectManager::getInstance()->get(StoreResolverInterface::class);
+        }
+
+        return $this->storeResolver;
+    }
 }
diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/LayoutProcessorTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/LayoutProcessorTest.php
index 95ffed86cbb35177051303726222813942336c72..5eabb6c9c86a47def05a69762c21f0b47f5a608f 100644
--- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/LayoutProcessorTest.php
+++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/LayoutProcessorTest.php
@@ -69,7 +69,7 @@ class LayoutProcessorTest extends \PHPUnit_Framework_TestCase
         $this->countryCollection->expects($this->once())->method('loadByStore')->willReturnSelf();
         $this->countryCollection->expects($this->once())->method('toOptionArray')->willReturn($countries);
 
-        $this->regionCollection->expects($this->once())->method('load')->willReturnSelf();
+        $this->regionCollection->expects($this->once())->method('addAllowedCountriesFilter')->willReturnSelf();
         $this->regionCollection->expects($this->once())->method('toOptionArray')->willReturn($regions);
 
         $layoutMerged = $layout;
@@ -77,7 +77,12 @@ class LayoutProcessorTest extends \PHPUnit_Framework_TestCase
         ['address-fieldsets']['children']['fieldThree'] = ['param' => 'value'];
         $layoutMergedPointer = &$layoutMerged['components']['block-summary']['children']['block-shipping']
         ['children']['address-fieldsets']['children'];
-
+        $layoutMerged['components']['checkoutProvider'] = [
+            'dictionaries' => [
+                'country_id' => [],
+                'region_id' => [],
+            ]
+        ];
         $elements = [
             'city' => [
                 'visible' => false,
diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Checkout/DirectoryDataProcessorTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Checkout/DirectoryDataProcessorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c84fac464c047ad611268d26ac988adb2b419596
--- /dev/null
+++ b/app/code/Magento/Checkout/Test/Unit/Block/Checkout/DirectoryDataProcessorTest.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Checkout\Test\Unit\Block\Checkout;
+
+class DirectoryDataProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Checkout\Block\Checkout\DirectoryDataProcessor
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $countryCollectionFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $countryCollectionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $regionCollectionFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $regionCollectionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeResolverMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $directoryDataHelperMock;
+
+    protected function setUp()
+    {
+        $this->countryCollectionFactoryMock = $this->getMock(
+            \Magento\Directory\Model\ResourceModel\Country\CollectionFactory::class,
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->countryCollectionMock = $this->getMock(
+            \Magento\Directory\Model\ResourceModel\Country\Collection::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->regionCollectionFactoryMock = $this->getMock(
+            \Magento\Directory\Model\ResourceModel\Region\CollectionFactory::class,
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->regionCollectionMock = $this->getMock(
+            \Magento\Directory\Model\ResourceModel\Region\Collection::class,
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeResolverMock = $this->getMock(
+            \Magento\Store\Api\StoreResolverInterface::class
+        );
+        $this->directoryDataHelperMock = $this->getMock(
+            \Magento\Directory\Helper\Data::class,
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->model = new \Magento\Checkout\Block\Checkout\DirectoryDataProcessor(
+            $this->countryCollectionFactoryMock,
+            $this->regionCollectionFactoryMock,
+            $this->storeResolverMock,
+            $this->directoryDataHelperMock
+        );
+    }
+
+    public function testProcess()
+    {
+        $expectedResult['components']['checkoutProvider']['dictionaries'] = [
+            'country_id' => [],
+            'region_id' => [],
+        ];
+
+        $this->countryCollectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($this->countryCollectionMock);
+        $this->countryCollectionMock->expects($this->once())->method('loadByStore')->willReturnSelf();
+        $this->countryCollectionMock->expects($this->once())->method('toOptionArray')->willReturn([]);
+        $this->regionCollectionFactoryMock->expects($this->once())
+            ->method('create')
+            ->willReturn($this->regionCollectionMock);
+        $this->regionCollectionMock->expects($this->once())->method('addAllowedCountriesFilter')->willReturnSelf();
+        $this->regionCollectionMock->expects($this->once())->method('toOptionArray')->willReturn([]);
+
+        $this->assertEquals($expectedResult, $this->model->process([]));
+    }
+}
diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Checkout/LayoutProcessorTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Checkout/LayoutProcessorTest.php
index 1351213f990b54a573a5d5d3a015e7b940a5f7ee..95aed9b56afc33d2f08f778a2e4b1e2162d35fe6 100644
--- a/app/code/Magento/Checkout/Test/Unit/Block/Checkout/LayoutProcessorTest.php
+++ b/app/code/Magento/Checkout/Test/Unit/Block/Checkout/LayoutProcessorTest.php
@@ -17,6 +17,8 @@ use PHPUnit_Framework_MockObject_MockObject as MockObject;
 /**
  * LayoutProcessorTest covers a list of variations for
  * checkout layout processor
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class LayoutProcessorTest extends \PHPUnit_Framework_TestCase
 {
@@ -45,6 +47,11 @@ class LayoutProcessorTest extends \PHPUnit_Framework_TestCase
      */
     private $layoutProcessor;
 
+    /**
+     * @var MockObject
+     */
+    private $storeResolver;
+
     protected function setUp()
     {
         $objectManager = new ObjectManager($this);
@@ -79,8 +86,11 @@ class LayoutProcessorTest extends \PHPUnit_Framework_TestCase
             $this->attributeMerger
         );
 
+        $this->storeResolver = $this->getMock(\Magento\Store\Api\StoreResolverInterface::class);
+
         $objectManager->setBackwardCompatibleProperty($this->layoutProcessor, 'checkoutDataHelper', $this->dataHelper);
         $objectManager->setBackwardCompatibleProperty($this->layoutProcessor, 'options', $options);
+        $objectManager->setBackwardCompatibleProperty($this->layoutProcessor, 'storeResolver', $this->storeResolver);
     }
 
     /**
diff --git a/app/code/Magento/Checkout/etc/frontend/di.xml b/app/code/Magento/Checkout/etc/frontend/di.xml
index 6fb9058c3b7681c8905a40a5eace5d88d8566b6f..69ed33721740d680ec6662e43858e9c42a1c6629 100644
--- a/app/code/Magento/Checkout/etc/frontend/di.xml
+++ b/app/code/Magento/Checkout/etc/frontend/di.xml
@@ -55,6 +55,7 @@
             <argument name="layoutProcessors" xsi:type="array">
                 <item name="addressFormAttributes" xsi:type="object">Magento\Checkout\Block\Checkout\LayoutProcessor</item>
                 <item name="totalsSortOrder" xsi:type="object">Magento\Checkout\Block\Checkout\TotalsProcessor</item>
+                <item name="directoryData" xsi:type="object">Magento\Checkout\Block\Checkout\DirectoryDataProcessor</item>
             </argument>
         </arguments>
     </type>
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/model/new-customer-address.js b/app/code/Magento/Checkout/view/frontend/web/js/model/new-customer-address.js
index 9a3685b212b435e8c03adb7be2cd7a182e591b87..c215b1989edbeafe273819b09f2588f06169b4e5 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/model/new-customer-address.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/model/new-customer-address.js
@@ -10,13 +10,13 @@ define([], function () {
      * Returns new address object
      */
     return function (addressData) {
-        var identifier = Date.now();
-        var regionId = null;
+        var identifier = Date.now(),
+            regionId;
 
         if (addressData.region && addressData.region.region_id) {
             regionId = addressData.region.region_id;
         } else if (addressData.country_id && addressData.country_id == window.checkoutConfig.defaultCountryId) {
-            regionId = window.checkoutConfig.defaultRegionId;
+            regionId = window.checkoutConfig.defaultRegionId || undefined;
         }
 
         return {
@@ -25,7 +25,7 @@ define([], function () {
             regionId: regionId || addressData.regionId,
             regionCode: (addressData.region) ? addressData.region.region_code : null,
             region: (addressData.region) ? addressData.region.region : null,
-            customerId: addressData.customer_id,
+            customerId: addressData.customer_id || addressData.customerId,
             street: addressData.street,
             company: addressData.company,
             telephone: addressData.telephone,
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/cart/shipping-estimation.js b/app/code/Magento/Checkout/view/frontend/web/js/view/cart/shipping-estimation.js
index 08641f015f609a9b8c75e80e0cfd39a82a6f5b1e..cd43dc646584d52708f3923c042889fdb20e0d82 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/cart/shipping-estimation.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/cart/shipping-estimation.js
@@ -50,9 +50,13 @@ define(
                     if (address) {
                         estimatedAddress = address.isEditable() ?
                             addressConverter.quoteAddressToFormAddressData(address) :
-                            addressConverter.quoteAddressToFormAddressData(
-                                addressConverter.addressToEstimationAddress(address)
-                            );
+                            {
+                                // only the following fields must be used by estimation form data provider
+                                'country_id': address.countryId,
+                                region: address.region,
+                                'region_id': address.regionId,
+                                postcode: address.postcode
+                            };
                         checkoutProvider.set(
                             'shippingAddress',
                             $.extend({}, checkoutProvider.get('shippingAddress'), estimatedAddress)
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
index 8910e41731d11a9be99bf1777dc13e3550781976..fb15e47eaf7d487da1c8671c545f0b99ce2a7445 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js
@@ -79,7 +79,6 @@ define(
                     fieldsetName = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
 
                 this._super();
-                shippingRatesValidator.initFields(fieldsetName);
 
                 if (!quote.isVirtual()) {
                     stepNavigator.registerStep(
@@ -120,6 +119,7 @@ define(
                     checkoutProvider.on('shippingAddress', function (shippingAddressData) {
                         checkoutData.setShippingAddressFromData(shippingAddressData);
                     });
+                    shippingRatesValidator.initFields(fieldsetName);
                 });
 
                 return this;
diff --git a/app/code/Magento/Customer/view/frontend/web/js/model/customer/address.js b/app/code/Magento/Customer/view/frontend/web/js/model/customer/address.js
index 30fbef98fd39ab15db1c7971e3e86ad82e367253..e013a96e4890aee11d30641a2f2ee31c4e6088c2 100644
--- a/app/code/Magento/Customer/view/frontend/web/js/model/customer/address.js
+++ b/app/code/Magento/Customer/view/frontend/web/js/model/customer/address.js
@@ -10,11 +10,17 @@ define([], function() {
      * Returns new address object
      */
     return function (addressData) {
+        var regionId;
+
+        if (addressData.region['region_id'] && addressData.region['region_id'] !== '0') {
+            regionId = addressData.region['region_id'] + '';
+        }
+
         return {
             customerAddressId: addressData.id,
             email: addressData.email,
             countryId: addressData.country_id,
-            regionId: addressData.region_id,
+            regionId: regionId,
             regionCode: addressData.region.region_code,
             region: addressData.region.region,
             customerId: addressData.customer_id,
diff --git a/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php b/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php
index 718e0c0223d767dd3857f5c796d9b7f9d918900a..3fdb20165d4bea912e42c94e14c5c0b3e01cdf8e 100644
--- a/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php
+++ b/app/code/Magento/Directory/Model/ResourceModel/Region/Collection.php
@@ -9,6 +9,14 @@
  */
 namespace Magento\Directory\Model\ResourceModel\Region;
 
+use Magento\Directory\Model\AllowedCountries;
+use Magento\Framework\App\ObjectManager;
+use Magento\Store\Model\ScopeInterface;
+
+/**
+ * Class Collection
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
 {
     /**
@@ -30,6 +38,11 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      */
     protected $_localeResolver;
 
+    /**
+     * @var AllowedCountries
+     */
+    private $allowedCountriesReader;
+
     /**
      * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
      * @param \Psr\Log\LoggerInterface $logger
@@ -89,6 +102,40 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         return $this;
     }
 
+    /**
+     * Return Allowed Countries reader
+     *
+     * @return \Magento\Directory\Model\AllowedCountries
+     * @deprecated
+     */
+    private function getAllowedCountriesReader()
+    {
+        if (!$this->allowedCountriesReader) {
+            $this->allowedCountriesReader = ObjectManager::getInstance()->get(AllowedCountries::class);
+        }
+
+        return $this->allowedCountriesReader;
+    }
+
+    /**
+     * Set allowed countries filter based on the given store.
+     * This is a convenience method for collection filtering based on store configuration settings.
+     *
+     * @param null|int|string|\Magento\Store\Model\Store $store
+     * @return \Magento\Directory\Model\ResourceModel\Region\Collection
+     */
+    public function addAllowedCountriesFilter($store = null)
+    {
+        $allowedCountries = $this->getAllowedCountriesReader()
+            ->getAllowedCountries(ScopeInterface::SCOPE_STORE, $store);
+
+        if (!empty($allowedCountries)) {
+            $this->addFieldToFilter('main_table.country_id', ['in' => $allowedCountries]);
+        }
+
+        return $this;
+    }
+
     /**
      * Filter by country_id
      *
diff --git a/app/code/Magento/Directory/Test/Unit/Model/ResourceModel/Region/CollectionTest.php b/app/code/Magento/Directory/Test/Unit/Model/ResourceModel/Region/CollectionTest.php
index 59c054b00a5f9c11607ca2126c0e0174918785e6..5c09ab119295a4e511f99f80f8320950a2a8ff57 100644
--- a/app/code/Magento/Directory/Test/Unit/Model/ResourceModel/Region/CollectionTest.php
+++ b/app/code/Magento/Directory/Test/Unit/Model/ResourceModel/Region/CollectionTest.php
@@ -6,6 +6,7 @@
 namespace Magento\Directory\Test\Unit\Model\ResourceModel\Region;
 
 use Magento\Directory\Model\ResourceModel\Region\Collection;
+use Magento\Directory\Model\AllowedCountries;
 use Magento\Framework\DB\Adapter\Pdo\Mysql;
 use Magento\Framework\DB\Select;
 use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
@@ -15,7 +16,14 @@ use Magento\Framework\Data\Collection\EntityFactory;
 use Magento\Framework\Locale\ResolverInterface;
 use Magento\Framework\DataObject;
 use Psr\Log\LoggerInterface;
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use PHPUnit_Framework_MockObject_MockObject as MockObject;
 
+/**
+ * Class CollectionTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -23,15 +31,22 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
      */
     private $collection;
 
+    /**
+     * @var MockObject
+     */
+    private $allowedCountries;
+
     protected function setUp()
     {
+        $objectManager = new ObjectManager($this);
         $entityFactoryMock = $this->getMock(EntityFactory::class, [], [], '', false);
         $loggerMock = $this->getMock(LoggerInterface::class);
         $fetchStrategyMock = $this->getMock(FetchStrategyInterface::class);
         $eventManagerMock = $this->getMock(ManagerInterface::class);
         $localeResolverMock = $this->getMock(ResolverInterface::class);
         $connectionMock = $this->getMock(Mysql::class, [], [], '', false);
-        $resourceMock = $this->getMockForAbstractClass(AbstractDb::class,
+        $resourceMock = $this->getMockForAbstractClass(
+            AbstractDb::class,
             [],
             '',
             false,
@@ -39,6 +54,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
             true,
             ['getConnection', 'getMainTable', 'getTable', '__wakeup']
         );
+        $this->allowedCountries = $this->getMock(AllowedCountries::class, [], [], '', false);
 
         $selectMock = $this->getMock(Select::class, [], [], '', false);
         $connectionMock->expects($this->any())->method('select')->will($this->returnValue($selectMock));
@@ -54,6 +70,12 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
             $connectionMock,
             $resourceMock
         );
+
+        $objectManager->setBackwardCompatibleProperty(
+            $this->collection,
+            'allowedCountriesReader',
+            $this->allowedCountries
+        );
     }
 
     public function testToOptionArray()
@@ -98,4 +120,14 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals($expectedResult, $this->collection->toOptionArray());
     }
+
+    public function testAddAllowedCountriesFilter()
+    {
+        $allowedCountries = [1, 2, 3];
+        $this->allowedCountries->expects($this->once())->method('getAllowedCountries')->with(
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            null
+        )->willReturn($allowedCountries);
+        $this->assertEquals($this->collection->addAllowedCountriesFilter(), $this->collection);
+    }
 }
diff --git a/app/code/Magento/Multishipping/Block/Checkout/Billing/Items.php b/app/code/Magento/Multishipping/Block/Checkout/Billing/Items.php
index 5a3e581d5375bb983baac8516b63788331388da9..3d2ca91d3ba6c0b687a6361858ce13269967861e 100644
--- a/app/code/Magento/Multishipping/Block/Checkout/Billing/Items.php
+++ b/app/code/Magento/Multishipping/Block/Checkout/Billing/Items.php
@@ -68,7 +68,7 @@ class Items extends \Magento\Sales\Block\Items\AbstractItems
      */
     public function getVirtualProductEditUrl()
     {
-        return $this->getUrl('*/cart');
+        return $this->getUrl('checkout/cart');
     }
 
     /**
diff --git a/app/code/Magento/Multishipping/Block/Checkout/Overview.php b/app/code/Magento/Multishipping/Block/Checkout/Overview.php
index 0031b6416d333eb32eb032ead7267ca4d8f9da9c..299e85d6f13c31a4633d9886f4565866def62802 100644
--- a/app/code/Magento/Multishipping/Block/Checkout/Overview.php
+++ b/app/code/Magento/Multishipping/Block/Checkout/Overview.php
@@ -297,7 +297,7 @@ class Overview extends \Magento\Sales\Block\Items\AbstractItems
      */
     public function getVirtualProductEditUrl()
     {
-        return $this->getUrl('*/cart');
+        return $this->getUrl('checkout/cart');
     }
 
     /**
diff --git a/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/Billing/ItemsTest.php b/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/Billing/ItemsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..056ac173621743ac162ba744d83a60d097cf12fc
--- /dev/null
+++ b/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/Billing/ItemsTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Multishipping\Test\Unit\Block\Checkout\Billing;
+
+
+class ItemsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Multishipping\Block\Checkout\Billing\Items
+     */
+    private $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $urlBuilderMock;
+
+    protected function setUp()
+    {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+                $this->urlBuilderMock = $this->getMock(\Magento\Framework\UrlInterface::class);
+        $this->model = $objectManager->getObject(
+            \Magento\Multishipping\Block\Checkout\Billing\Items::class,
+            [
+                'urlBuilder' => $this->urlBuilderMock
+            ]
+        );
+    }
+
+    public function testGetVirtualProductEditUrl()
+    {
+        $url = 'http://example.com';
+        $this->urlBuilderMock->expects($this->once())->method('getUrl')->with('checkout/cart', [])->willReturn($url);
+        $this->assertEquals($url, $this->model->getVirtualProductEditUrl());
+    }
+}
diff --git a/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/OverviewTest.php b/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/OverviewTest.php
index fc2169f38e4af88559b112931ac0952ecd82f5d0..b583ad258595b7101fb8683df6c9932a20ee1b3f 100644
--- a/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/OverviewTest.php
+++ b/app/code/Magento/Multishipping/Test/Unit/Block/Checkout/OverviewTest.php
@@ -52,6 +52,11 @@ class OverviewTest extends \PHPUnit_Framework_TestCase
      */
     protected $quoteMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $urlBuilderMock;
+
     protected function setUp()
     {
         $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
@@ -83,13 +88,15 @@ class OverviewTest extends \PHPUnit_Framework_TestCase
         $this->checkoutMock =
             $this->getMock(\Magento\Multishipping\Model\Checkout\Type\Multishipping::class, [], [], '', false);
         $this->quoteMock = $this->getMock(\Magento\Quote\Model\Quote::class, [], [], '', false);
+        $this->urlBuilderMock = $this->getMock(\Magento\Framework\UrlInterface::class);
         $this->model = $objectManager->getObject(
             \Magento\Multishipping\Block\Checkout\Overview::class,
             [
                 'priceCurrency' => $this->priceCurrencyMock,
                 'totalsCollector' => $this->totalsCollectorMock,
                 'totalsReader' => $this->totalsReaderMock,
-                'multishipping' => $this->checkoutMock
+                'multishipping' => $this->checkoutMock,
+                'urlBuilder' => $this->urlBuilderMock
             ]
         );
     }
@@ -189,4 +196,11 @@ class OverviewTest extends \PHPUnit_Framework_TestCase
             ->willReturn([$totalMock]);
         return $totalMock;
     }
+
+    public function testGetVirtualProductEditUrl()
+    {
+        $url = 'http://example.com';
+        $this->urlBuilderMock->expects($this->once())->method('getUrl')->with('checkout/cart', [])->willReturn($url);
+        $this->assertEquals($url, $this->model->getVirtualProductEditUrl());
+    }
 }
diff --git a/app/code/Magento/Payment/Plugin/PaymentConfigurationProcess.php b/app/code/Magento/Payment/Plugin/PaymentConfigurationProcess.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b107b74295b3a842c00429543b00e0466b1d530
--- /dev/null
+++ b/app/code/Magento/Payment/Plugin/PaymentConfigurationProcess.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Payment\Plugin;
+
+/**
+ * Class PaymentConfigurationProcess
+ *
+ * Removes inactive payment methods and group from checkout configuration.
+ */
+class PaymentConfigurationProcess
+{
+    /**
+     * @var \Magento\Payment\Api\PaymentMethodListInterface
+     */
+    private $paymentMethodList;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @param \Magento\Payment\Api\PaymentMethodListInterface $paymentMethodList
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        \Magento\Payment\Api\PaymentMethodListInterface $paymentMethodList,
+        \Magento\Store\Model\StoreManagerInterface $storeManager
+    ) {
+        $this->paymentMethodList = $paymentMethodList;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * Checkout LayoutProcessor before process plugin.
+     *
+     * @param \Magento\Checkout\Block\Checkout\LayoutProcessor $processor
+     * @param array $jsLayout
+     * @return array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function beforeProcess(\Magento\Checkout\Block\Checkout\LayoutProcessor $processor, $jsLayout)
+    {
+        $configuration = &$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'];
+
+        if (!isset($configuration)) {
+            return [$jsLayout];
+        }
+
+        $storeId = $this->storeManager->getStore()->getId();
+        $activePaymentMethodList = $this->paymentMethodList->getActiveList($storeId);
+        $getCodeFunc = function ($method) {
+            return $method->getCode();
+        };
+        $activePaymentMethodCodes = array_map($getCodeFunc, $activePaymentMethodList);
+
+        foreach ($configuration as $paymentGroup => $groupConfig) {
+            $notActivePaymentMethodCodes = array_diff(array_keys($groupConfig['methods']), $activePaymentMethodCodes);
+            foreach ($notActivePaymentMethodCodes as $notActivePaymentMethodCode) {
+                unset($configuration[$paymentGroup]['methods'][$notActivePaymentMethodCode]);
+            }
+            if (empty($configuration[$paymentGroup]['methods'])) {
+                unset($configuration[$paymentGroup]);
+            }
+        }
+
+        return [$jsLayout];
+    }
+}
diff --git a/app/code/Magento/Payment/Test/Unit/Plugin/PaymentConfigurationProcessTest.php b/app/code/Magento/Payment/Test/Unit/Plugin/PaymentConfigurationProcessTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e49c8718e6044de36cc6a1018d052dc48ed7485
--- /dev/null
+++ b/app/code/Magento/Payment/Test/Unit/Plugin/PaymentConfigurationProcessTest.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Payment\Test\Unit\Plugin;
+
+/**
+ * Class PaymentConfigurationProcessTest.
+ */
+class PaymentConfigurationProcessTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var \Magento\Store\Api\Data\StoreInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $store;
+
+    /**
+     * @var \Magento\Payment\Api\PaymentMethodListInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $paymentMethodList;
+
+    /**
+     * @var \Magento\Checkout\Block\Checkout\LayoutProcessor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $layoutProcessor;
+
+    /**
+     * @var \Magento\Payment\Plugin\PaymentConfigurationProcess
+     */
+    private $plugin;
+
+    /**
+     * Set up
+     */
+    protected function setUp()
+    {
+        $this->storeManager = $this
+            ->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getStore'])
+            ->getMockForAbstractClass();
+        $this->store = $this
+            ->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getId'])
+            ->getMockForAbstractClass();
+        $this->paymentMethodList = $this
+            ->getMockBuilder(\Magento\Payment\Api\PaymentMethodListInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getActiveList'])
+            ->getMockForAbstractClass();
+        $this->layoutProcessor =  $this
+            ->getMockBuilder(\Magento\Checkout\Block\Checkout\LayoutProcessor::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['process'])
+            ->getMockForAbstractClass();
+
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->plugin = $objectManagerHelper->getObject(
+            \Magento\Payment\Plugin\PaymentConfigurationProcess::class,
+            [
+                'paymentMethodList' => $this->paymentMethodList,
+                'storeManager' => $this->storeManager
+            ]
+        );
+    }
+
+    /**
+     * @param array $jsLayout
+     * @param array $activePaymentList
+     * @param array $expectedResult
+     * @dataProvider beforeProcessDataProvider
+     */
+    public function testBeforeProcess($jsLayout, $activePaymentList, $expectedResult)
+    {
+        $this->store->expects($this->once())->method('getId')->willReturn(1);
+        $this->storeManager->expects($this->once())->method('getStore')->willReturn($this->store);
+        $this->paymentMethodList->expects($this->once())
+            ->method('getActiveList')
+            ->with(1)
+            ->willReturn($activePaymentList);
+
+        $result = $this->plugin->beforeProcess($this->layoutProcessor, $jsLayout);
+        $this->assertEquals($result[0], $expectedResult);
+    }
+
+    /**
+     * Data provider for BeforeProcess.
+     *
+     * @return array
+     */
+    public function beforeProcessDataProvider()
+    {
+        $jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'] = [
+            'braintree' => [
+                'methods' => [
+                    'braintree_paypal' => [],
+                    'braintree' => []
+                ]
+            ],
+            'paypal-payments' => [
+                'methods' => [
+                    'payflowpro' => [],
+                    'payflow_link' => []
+                ]
+            ]
+        ];
+        $result1['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'] = [];
+        $result2['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'] = [
+            'braintree' => [
+                'methods' => [
+                    'braintree' => [],
+                    'braintree_paypal' => []
+                ]
+            ]
+        ];
+
+        $braintreePaymentMethod = $this
+            ->getMockBuilder(\Magento\Payment\Api\Data\PaymentMethodInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getCode'])
+            ->getMockForAbstractClass();
+        $braintreePaypalPaymentMethod = $this
+            ->getMockBuilder(\Magento\Payment\Api\Data\PaymentMethodInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getCode'])
+            ->getMockForAbstractClass();
+
+        $braintreePaymentMethod->expects($this->any())->method('getCode')->willReturn('braintree');
+        $braintreePaypalPaymentMethod->expects($this->any())->method('getCode')->willReturn('braintree_paypal');
+
+        return [
+            [$jsLayout, [], $result1],
+            [$jsLayout, [$braintreePaymentMethod, $braintreePaypalPaymentMethod], $result2]
+        ];
+    }
+}
diff --git a/app/code/Magento/Payment/etc/frontend/di.xml b/app/code/Magento/Payment/etc/frontend/di.xml
index 4ff3c013b676523fe20a3deb49f32758c01e604e..471a7ce9e2de585609eb490ada35248c4ee59be3 100644
--- a/app/code/Magento/Payment/etc/frontend/di.xml
+++ b/app/code/Magento/Payment/etc/frontend/di.xml
@@ -19,4 +19,7 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Checkout\Block\Checkout\LayoutProcessor">
+        <plugin name="ProcessPaymentConfiguration" type="Magento\Payment\Plugin\PaymentConfigurationProcess"/>
+    </type>
 </config>
\ No newline at end of file
diff --git a/app/code/Magento/Sales/view/adminhtml/ui_component/sales_order_grid.xml b/app/code/Magento/Sales/view/adminhtml/ui_component/sales_order_grid.xml
index e0a5471b1e45ee1f6ba9bd8c05d0145656a642ea..0dc555c93d94d3db64e102f24b2fa4e6f45e278f 100644
--- a/app/code/Magento/Sales/view/adminhtml/ui_component/sales_order_grid.xml
+++ b/app/code/Magento/Sales/view/adminhtml/ui_component/sales_order_grid.xml
@@ -322,7 +322,7 @@
                 </item>
             </argument>
         </column>
-        <column name="total_refunded" class="Magento\Sales\Ui\Component\Listing\Column\Price">
+        <column name="total_refunded" class="Magento\Sales\Ui\Component\Listing\Column\PurchasedPrice">
             <argument name="data" xsi:type="array">
                 <item name="config" xsi:type="array">
                     <item name="filter" xsi:type="string">textRange</item>
diff --git a/app/code/Magento/Tax/Model/Sales/Total/Quote/CommonTaxCollector.php b/app/code/Magento/Tax/Model/Sales/Total/Quote/CommonTaxCollector.php
index 07b9c558043b0ddee1c3b99f63fa0b2f8aa27490..c2c53a3d7754ab080bb9fa818d3cb8d65eac2531 100644
--- a/app/code/Magento/Tax/Model/Sales/Total/Quote/CommonTaxCollector.php
+++ b/app/code/Magento/Tax/Model/Sales/Total/Quote/CommonTaxCollector.php
@@ -535,6 +535,7 @@ class CommonTaxCollector extends AbstractTotal
         $total->setSubtotalInclTax($subtotalInclTax);
         $total->setBaseSubtotalTotalInclTax($baseSubtotalInclTax);
         $total->setBaseSubtotalInclTax($baseSubtotalInclTax);
+        $shippingAssignment->getShipping()->getAddress()->setBaseSubtotalTotalInclTax($baseSubtotalInclTax);;
 
         return $this;
     }
diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/select.js b/app/code/Magento/Ui/view/base/web/js/form/element/select.js
index 1887639c8d0313fe466aadb89b3cdaf7adc6bd81..4567bba1d017aec81e53dc668b35b4bf696c49d3 100644
--- a/app/code/Magento/Ui/view/base/web/js/form/element/select.js
+++ b/app/code/Magento/Ui/view/base/web/js/form/element/select.js
@@ -105,7 +105,9 @@ define([
     return Abstract.extend({
         defaults: {
             customName: '${ $.parentName }.${ $.index }_input',
-            elementTmpl: 'ui/form/element/select'
+            elementTmpl: 'ui/form/element/select',
+            caption: '',
+            options: []
         },
 
         /**
@@ -127,28 +129,6 @@ define([
             return this;
         },
 
-        /**
-         * Parses options and merges the result with instance
-         *
-         * @param  {Object} config
-         * @returns {Object} Chainable.
-         */
-        initConfig: function (config) {
-            var options = config.options,
-                captionValue = config.captionValue || '',
-                result = parseOptions(options, captionValue);
-
-            if (config.caption) {
-                delete result.caption;
-            }
-
-            _.extend(config, result);
-
-            this._super();
-
-            return this;
-        },
-
         /**
          * Calls 'initObservable' of parent, initializes 'options' and 'initialOptions'
          *     properties, calls 'setOptions' passing options to it
@@ -160,7 +140,7 @@ define([
 
             this.initialOptions = this.options;
 
-            this.observe('options')
+            this.observe('options caption')
                 .setOptions(this.options());
 
             return this;
@@ -209,7 +189,7 @@ define([
                 return option && option.value;
             }
 
-            if (!this.caption) {
+            if (!this.caption()) {
                 return findFirst(this.options);
             }
         },
@@ -254,14 +234,20 @@ define([
          * @returns {Object} Chainable
          */
         setOptions: function (data) {
-            var isVisible;
+            var captionValue = this.captionValue || '',
+                result = parseOptions(data, captionValue),
+                isVisible;
+
+            this.indexedOptions = indexOptions(result.options);
 
-            this.indexedOptions = indexOptions(data);
+            this.options(result.options);
 
-            this.options(data);
+            if (!this.caption()) {
+                this.caption(result.caption);
+            }
 
             if (this.customEntry) {
-                isVisible = !!data.length;
+                isVisible = !!result.options.length;
 
                 this.setVisible(isVisible);
                 this.toggleInput(!isVisible);
@@ -301,7 +287,7 @@ define([
          * @returns {Object} Chainable.
          */
         clear: function () {
-            var value = this.caption ? '' : findFirst(this.options);
+            var value = this.caption() ? '' : findFirst(this.options);
 
             this.value(value);
 
diff --git a/app/code/Magento/Vault/Plugin/PaymentVaultConfigurationProcess.php b/app/code/Magento/Vault/Plugin/PaymentVaultConfigurationProcess.php
new file mode 100644
index 0000000000000000000000000000000000000000..db38ccbed417a95870a9da916a64e36b4281353d
--- /dev/null
+++ b/app/code/Magento/Vault/Plugin/PaymentVaultConfigurationProcess.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Vault\Plugin;
+
+/**
+ * Class PaymentVaultConfigurationProcess
+ *
+ * Checks if vault group have active vaults.
+ */
+class PaymentVaultConfigurationProcess
+{
+    /**
+     * @var \Magento\Vault\Api\PaymentMethodListInterface
+     */
+    private $vaultPaymentList;
+
+    /**
+     * @var \Magento\Vault\Api\PaymentMethodListInterface
+     */
+    private $paymentMethodList;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    private $storeManager;
+
+    /**
+     * @param \Magento\Vault\Api\PaymentMethodListInterface $vaultPaymentList
+     * @param \Magento\Payment\Api\PaymentMethodListInterface $paymentMethodList
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        \Magento\Vault\Api\PaymentMethodListInterface $vaultPaymentList,
+        \Magento\Payment\Api\PaymentMethodListInterface $paymentMethodList,
+        \Magento\Store\Model\StoreManagerInterface $storeManager
+    ) {
+        $this->vaultPaymentList = $vaultPaymentList;
+        $this->paymentMethodList = $paymentMethodList;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * Checkout LayoutProcessor before process plugin.
+     *
+     * @param \Magento\Checkout\Block\Checkout\LayoutProcessor $processor
+     * @param array $jsLayout
+     * @return array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function beforeProcess(\Magento\Checkout\Block\Checkout\LayoutProcessor $processor, $jsLayout)
+    {
+        $configuration = &$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'];
+
+        if (!isset($configuration)) {
+            return [$jsLayout];
+        }
+
+        $storeId = $this->storeManager->getStore()->getId();
+        $activePaymentMethodList = $this->paymentMethodList->getActiveList($storeId);
+        $activeVaultList = $this->vaultPaymentList->getActiveList($storeId);
+        $getCodeFunc = function ($method) {
+            return $method->getCode();
+        };
+        $getProviderCodeFunc = function ($method) {
+            return $method->getProviderCode();
+        };
+        $activePaymentMethodCodes = array_map($getCodeFunc, $activePaymentMethodList);
+        $activeVaultProviderCodes = array_map($getProviderCodeFunc, $activeVaultList);
+        $activePaymentMethodCodes = array_merge(
+            $activePaymentMethodCodes,
+            $activeVaultProviderCodes
+        );
+
+        foreach ($configuration as $paymentGroup => $groupConfig) {
+            $notActivePaymentMethodCodes = array_diff(array_keys($groupConfig['methods']), $activePaymentMethodCodes);
+            foreach ($notActivePaymentMethodCodes as $notActivePaymentMethodCode) {
+                unset($configuration[$paymentGroup]['methods'][$notActivePaymentMethodCode]);
+            }
+            if ($paymentGroup === 'vault' && !empty($activeVaultProviderCodes)) {
+                continue;
+            }
+            if (empty($configuration[$paymentGroup]['methods'])) {
+                unset($configuration[$paymentGroup]);
+            }
+        }
+
+        return [$jsLayout];
+    }
+}
diff --git a/app/code/Magento/Vault/Test/Unit/Plugin/PaymentVaultConfigurationProcessTest.php b/app/code/Magento/Vault/Test/Unit/Plugin/PaymentVaultConfigurationProcessTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e7a3fd0aebdfcd8054a7276dcce04ec5f49dcb8
--- /dev/null
+++ b/app/code/Magento/Vault/Test/Unit/Plugin/PaymentVaultConfigurationProcessTest.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Vault\Test\Unit\Plugin;
+
+/**
+ * Class PaymentVaultConfigurationProcessTest.
+ */
+class PaymentVaultConfigurationProcessTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var \Magento\Store\Api\Data\StoreInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $store;
+
+    /**
+     * @var \Magento\Vault\Api\PaymentMethodListInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $vaultList;
+
+    /**
+     * @var \Magento\Payment\Api\PaymentMethodListInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $paymentMethodList;
+
+    /**
+     * @var \Magento\Checkout\Block\Checkout\LayoutProcessor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $layoutProcessor;
+
+    /**
+     * @var \Magento\Vault\Plugin\PaymentVaultConfigurationProcess
+     */
+    private $plugin;
+
+    /**
+     * Set up
+     */
+    protected function setUp()
+    {
+        $this->storeManager = $this
+            ->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getStore'])
+            ->getMockForAbstractClass();
+        $this->store = $this
+            ->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getId'])
+            ->getMockForAbstractClass();
+        $this->vaultList = $this
+            ->getMockBuilder(\Magento\Vault\Api\PaymentMethodListInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getActiveList'])
+            ->getMockForAbstractClass();
+        $this->paymentMethodList = $this
+            ->getMockBuilder(\Magento\Payment\Api\PaymentMethodListInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getActiveList'])
+            ->getMockForAbstractClass();
+        $this->layoutProcessor =  $this
+            ->getMockBuilder(\Magento\Checkout\Block\Checkout\LayoutProcessor::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['process'])
+            ->getMockForAbstractClass();
+
+        $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->plugin = $objectManagerHelper->getObject(
+            \Magento\Vault\Plugin\PaymentVaultConfigurationProcess::class,
+            [
+                'vaultPaymentList' => $this->vaultList,
+                'paymentMethodList' => $this->paymentMethodList,
+                'storeManager' => $this->storeManager
+            ]
+        );
+    }
+
+    /**
+     * @param array $jsLayout
+     * @param array $activeVaultList
+     * @param array $activePaymentList
+     * @param array $expectedResult
+     * @dataProvider beforeProcessDataProvider
+     */
+    public function testBeforeProcess($jsLayout, $activeVaultList, $activePaymentList, $expectedResult)
+    {
+        $this->store->expects($this->once())->method('getId')->willReturn(1);
+        $this->storeManager->expects($this->once())->method('getStore')->willReturn($this->store);
+        $this->vaultList->expects($this->once())->method('getActiveList')->with(1)->willReturn($activeVaultList);
+        $this->paymentMethodList->expects($this->once())
+            ->method('getActiveList')
+            ->with(1)
+            ->willReturn($activePaymentList);
+        $result = $this->plugin->beforeProcess($this->layoutProcessor, $jsLayout);
+        $this->assertEquals($result[0], $expectedResult);
+    }
+
+    /**
+     * Data provider for BeforeProcess.
+     *
+     * @return array
+     */
+    public function beforeProcessDataProvider()
+    {
+        $jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'] = [
+            'vault' => [
+                'methods' => []
+            ],
+            'braintree' => [
+                'methods' => [
+                    'braintree_paypal' => [],
+                    'braintree' => []
+                ]
+            ],
+            'paypal-payments' => [
+                'methods' => [
+                    'payflowpro' => [],
+                    'payflow_link' => []
+                ]
+            ]
+        ];
+        $result1['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'] = [];
+        $result2['components']['checkout']['children']['steps']['children']['billing-step']
+        ['children']['payment']['children']['renders']['children'] = [
+            'vault' => [
+                'methods' => []
+            ],
+            'braintree' => [
+                'methods' => [
+                    'braintree_paypal' => []
+                ]
+            ]
+        ];
+
+        $vaultPaymentMethod = $this
+            ->getMockBuilder(\Magento\Vault\Api\PaymentMethodListInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(['getCode', 'getProviderCode'])
+            ->getMockForAbstractClass();
+
+        $vaultPaymentMethod->expects($this->any())->method('getCode')->willReturn('braintree_paypal_vault');
+        $vaultPaymentMethod->expects($this->any())->method('getProviderCode')->willReturn('braintree_paypal');
+
+        return [
+            [$jsLayout, [], [], $result1],
+            [$jsLayout, [$vaultPaymentMethod], [$vaultPaymentMethod], $result2]
+        ];
+    }
+}
diff --git a/app/code/Magento/Vault/etc/frontend/di.xml b/app/code/Magento/Vault/etc/frontend/di.xml
index d7f699faff53c6e48c6d3d854b265ded269e4dcc..0af0e4cd32217f952d3c49fc7424e99bc8a1ffe0 100644
--- a/app/code/Magento/Vault/etc/frontend/di.xml
+++ b/app/code/Magento/Vault/etc/frontend/di.xml
@@ -19,4 +19,8 @@
             <argument name="session" xsi:type="object">Magento\Customer\Model\Session</argument>
         </arguments>
     </type>
+    <type name="Magento\Checkout\Block\Checkout\LayoutProcessor">
+        <plugin name="ProcessPaymentVaultConfiguration" type="Magento\Vault\Plugin\PaymentVaultConfigurationProcess"/>
+        <plugin name="ProcessPaymentConfiguration" disabled="true"/>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Links/CompareLink.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Links/CompareLink.php
index c81d85a724dcf22ef37e2aa497bf2c6be22f51bd..86c30f4caf8a4ccb10bd7cdebc5f5b8137bfa6b2 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Links/CompareLink.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Links/CompareLink.php
@@ -20,6 +20,13 @@ class CompareLink extends Block
      */
     protected $qtyCompareProducts = '.compare .counter.qty';
 
+    /**
+     * Locator value for Compare Products link.
+     *
+     * @var string
+     */
+    protected $linkCompareProducts = '[data-role="compare-products-link"] a.compare';
+
     /**
      * Get qty of Products in Compare list.
      *
@@ -32,4 +39,14 @@ class CompareLink extends Block
         preg_match_all('/^\d+/', $compareProductLink->getText(), $matches);
         return $matches[0][0];
     }
+
+    /**
+     * Wait for compare products link to appear
+     *
+     * @return void
+     */
+    public function waitForCompareProductsLinks()
+    {
+        $this->waitForElementVisible($this->linkCompareProducts);
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/ConfigurableProduct/ConfigurableAttributesData.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/ConfigurableProduct/ConfigurableAttributesData.php
index 65f80eb7144638b59e61a984c27582a316e9b129..65715d116ab45780dcacae89ef987a16e9127ceb 100644
--- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/ConfigurableProduct/ConfigurableAttributesData.php
+++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Fixture/ConfigurableProduct/ConfigurableAttributesData.php
@@ -277,10 +277,12 @@ class ConfigurableAttributesData extends DataSource
             $variationsMatrix = $this->addVariationMatrix($variationsMatrix, $attribute, $attributeKey);
         }
 
-        foreach ($data['matrix'] as $key => $value) {
-            if (isset($value['sku']) && $value['sku'] === '') {
-                unset($variationsMatrix[$key]['sku']);
-                unset($data['matrix'][$key]['sku']);
+        if (isset($data['matrix'])) {
+            foreach ($data['matrix'] as $key => $value) {
+                if (isset($value['sku']) && $value['sku'] === '') {
+                    unset($variationsMatrix[$key]['sku']);
+                    unset($data['matrix'][$key]['sku']);
+                }
             }
         }
 
diff --git a/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetRecentlyComparedProducts.php b/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetRecentlyComparedProducts.php
index 745c3afe0aa91cc794d99e7312b620128d3306b4..c32ba27b671655a47a8400391f5fc7a7671d7083 100644
--- a/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetRecentlyComparedProducts.php
+++ b/dev/tests/functional/tests/app/Magento/Widget/Test/Constraint/AssertWidgetRecentlyComparedProducts.php
@@ -118,6 +118,7 @@ class AssertWidgetRecentlyComparedProducts extends AbstractConstraint
     protected function removeCompareProducts()
     {
         $this->cmsIndex->open();
+        $this->cmsIndex->getCompareLinkBlock()->waitForCompareProductsLinks();
         $this->cmsIndex->getLinksBlock()->openLink("Compare Products");
         $this->catalogProductCompare->getCompareProductsBlock()->removeAllProducts();
     }
diff --git a/dev/tests/functional/tests/app/Magento/Widget/Test/TestCase/CreateWidgetEntityTest.xml b/dev/tests/functional/tests/app/Magento/Widget/Test/TestCase/CreateWidgetEntityTest.xml
index 225759df91f179dbd911fca662c05476c4830a69..57920ead79a7d113e37123d3603462759728393c 100644
--- a/dev/tests/functional/tests/app/Magento/Widget/Test/TestCase/CreateWidgetEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Widget/Test/TestCase/CreateWidgetEntityTest.xml
@@ -42,7 +42,7 @@
             <constraint name="Magento\Widget\Test\Constraint\AssertWidgetRecentlyViewedProducts" />
         </variation>
         <variation name="CreateWidgetEntityTestVariation4">
-            <data name="tag" xsi:type="string">severity:S1, stable:no</data>
+            <data name="tag" xsi:type="string">severity:S1</data>
             <data name="widget/data/code" xsi:type="string">Recently Compared Products</data>
             <data name="widget/data/theme_id" xsi:type="string">Magento Luma</data>
             <data name="widget/data/title" xsi:type="string">Title_%isolation%</data>
diff --git a/dev/tests/integration/testsuite/Magento/Tax/Model/Sales/Total/Quote/SubtotalTest.php b/dev/tests/integration/testsuite/Magento/Tax/Model/Sales/Total/Quote/SubtotalTest.php
index 383cc31a84228631d62864e9e2f6c2d78551d9d5..41b0fdaff08c5b0b8b7291347a2a121cf0a4c68b 100644
--- a/dev/tests/integration/testsuite/Magento/Tax/Model/Sales/Total/Quote/SubtotalTest.php
+++ b/dev/tests/integration/testsuite/Magento/Tax/Model/Sales/Total/Quote/SubtotalTest.php
@@ -125,6 +125,7 @@ class SubtotalTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals($expected['subtotal'], $total->getSubtotal());
         $this->assertEquals($expected['subtotal'] + $expected['tax_amount'], $total->getSubtotalInclTax());
+        $this->assertEquals($expected['subtotal'] + $expected['tax_amount'], $address->getBaseSubtotalTotalInclTax());
         $this->assertEquals($expected['discount_amount'], $total->getDiscountAmount());
         $items = $address->getAllItems();
         /** @var \Magento\Quote\Model\Quote\Address\Item $item */
diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/select.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/select.test.js
index db5855b0a692bb7ac0c9b75de35d228abe309016..5d75b8c595366169166d3964bbd95d988b1d5606 100644
--- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/select.test.js
+++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/form/element/select.test.js
@@ -121,7 +121,7 @@ define([
                     {
                         value: 'valLast'
                     }];
-                model.caption = false;
+                model.caption('');
                 expect(model.normalizeData('')).toEqual('valFirst');
             });
         });