diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php b/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php
index 950e2253a95dc21218ee666bb5d747b3991d3118..d2a3196868543db0fb9832aca40529df2c32f965 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/GalleryManagement.php
@@ -94,13 +94,16 @@ class GalleryManagement implements \Magento\Catalog\Api\ProductAttributeMediaGal
         }
         $found = false;
         foreach ($existingMediaGalleryEntries as $key => $existingEntry) {
+            $entryTypes = (array)$entry->getTypes();
+            $existingEntryTypes = (array)$existingMediaGalleryEntries[$key]->getTypes();
+            $existingMediaGalleryEntries[$key]->setTypes(array_diff($existingEntryTypes, $entryTypes));
+
             if ($existingEntry->getId() == $entry->getId()) {
                 $found = true;
                 if ($entry->getFile()) {
                     $entry->setId(null);
                 }
                 $existingMediaGalleryEntries[$key] = $entry;
-                break;
             }
         }
         if (!$found) {
diff --git a/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php b/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php
index 3c757f8a05a2daf0ab30c9efb2031c15cefa1d4f..ec2521350d14d991e9c8deff2a74f5ff4865fbfc 100644
--- a/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php
+++ b/app/code/Magento/Catalog/Model/Product/Gallery/Processor.php
@@ -298,11 +298,11 @@ class Processor
         if (is_array($mediaAttribute)) {
             foreach ($mediaAttribute as $attribute) {
                 if (in_array($attribute, $mediaAttributeCodes)) {
-                    $product->setData($attribute, null);
+                    $product->setData($attribute, 'no_selection');
                 }
             }
         } elseif (in_array($mediaAttribute, $mediaAttributeCodes)) {
-            $product->setData($mediaAttribute, null);
+            $product->setData($mediaAttribute, 'no_selection');
         }
 
         return $this;
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php
index fb2d197749e01bdd15b1574d2fca4831a04e4583..e3845a2b51cec716d37e27430023ee2be2409bef 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/GalleryManagementTest.php
@@ -191,20 +191,33 @@ class GalleryManagementTest extends \PHPUnit_Framework_TestCase
         $productSku = 'testProduct';
         $entryMock = $this->getMock(\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface::class);
         $entryId = 42;
+        $entrySecondId = 43;
         $this->productRepositoryMock->expects($this->once())->method('get')->with($productSku)
             ->willReturn($this->productMock);
         $existingEntryMock = $this->getMock(
             \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface::class
         );
+        $existingSecondEntryMock = $this->getMock(
+            \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterface::class
+        );
+
         $existingEntryMock->expects($this->once())->method('getId')->willReturn($entryId);
+        $existingEntryMock->expects($this->once())->method('getTypes')->willReturn(['small_image']);
+        $existingEntryMock->expects($this->once())->method('setTypes')->with(['small_image']);
+        $existingSecondEntryMock->expects($this->once())->method('getId')->willReturn($entrySecondId);
+        $existingSecondEntryMock->expects($this->once())->method('getTypes')->willReturn(['image']);
+        $existingSecondEntryMock->expects($this->once())->method('setTypes')->with([]);
         $this->productMock->expects($this->once())->method('getMediaGalleryEntries')
-            ->willReturn([$existingEntryMock]);
-        $entryMock->expects($this->once())->method('getId')->willReturn($entryId);
+            ->willReturn([$existingEntryMock, $existingSecondEntryMock]);
+
+        $entryMock->expects($this->exactly(2))->method('getId')->willReturn($entryId);
         $entryMock->expects($this->once())->method('getFile')->willReturn("base64");
         $entryMock->expects($this->once())->method('setId')->with(null);
+        $entryMock->expects($this->exactly(2))->method('getTypes')->willReturn(['image']);
 
         $this->productMock->expects($this->once())->method('setMediaGalleryEntries')
-            ->willReturn([$entryMock]);
+            ->with([$entryMock, $existingSecondEntryMock])
+            ->willReturnSelf();
         $this->productRepositoryMock->expects($this->once())->method('save')->with($this->productMock);
         $this->assertTrue($this->model->update($productSku, $entryMock));
     }
diff --git a/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/ProcessorTest.php b/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/ProcessorTest.php
index 61d4e3a5c76d5a3fdf57438c082a210c9b60ac5a..50c3c4ad0122c5490fa535c07fa7d677514d91c9 100644
--- a/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/ProcessorTest.php
+++ b/app/code/Magento/Catalog/Test/Unit/Model/Product/Gallery/ProcessorTest.php
@@ -197,4 +197,56 @@ class ProcessorTest extends \PHPUnit_Framework_TestCase
             [false]
         ];
     }
+
+    /**
+     * @param int $setDataExpectsCalls
+     * @param string|null $setDataArgument
+     * @param array|string $mediaAttribute
+     * @dataProvider clearMediaAttributeDataProvider
+     */
+    public function testClearMediaAttribute($setDataExpectsCalls, $setDataArgument, $mediaAttribute)
+    {
+        $productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $productMock->expects($this->exactly($setDataExpectsCalls))
+            ->method('setData')
+            ->with($setDataArgument, 'no_selection');
+
+        $this->mediaConfig->expects($this->once())
+            ->method('getMediaAttributeCodes')
+            ->willReturn(['image', 'small_image']);
+
+        $this->assertSame($this->model, $this->model->clearMediaAttribute($productMock, $mediaAttribute));
+    }
+
+    /**
+     * @return array
+     */
+    public function clearMediaAttributeDataProvider()
+    {
+        return [
+            [
+                'setDataExpectsCalls' => 1,
+                'setDataArgument' => 'image',
+                'mediaAttribute' => 'image',
+            ],
+            [
+                'setDataExpectsCalls' => 1,
+                'setDataArgument' => 'image',
+                'mediaAttribute' => ['image'],
+            ],
+            [
+                'setDataExpectsCalls' => 0,
+                'setDataArgument' => null,
+                'mediaAttribute' => 'some_image',
+            ],
+            [
+                'setDataExpectsCalls' => 0,
+                'setDataArgument' => null,
+                'mediaAttribute' => ['some_image'],
+            ],
+        ];
+    }
 }
diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
index 324404ead6c9f5845526512ed6ed39e87f94157c..0f5a0a425a5a5358cf98715827a7950d5e0489fd 100644
--- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
+++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductAttributeMediaGalleryManagementInterfaceTest.php
@@ -237,8 +237,8 @@ class ProductAttributeMediaGalleryManagementInterfaceTest extends \Magento\TestF
 
         $targetProduct = $this->getTargetSimpleProduct();
         $this->assertEquals('/m/a/magento_image.jpg', $targetProduct->getData('thumbnail'));
-        $this->assertNull($targetProduct->getData('image'));
-        $this->assertNull($targetProduct->getData('small_image'));
+        $this->assertEquals('no_selection', $targetProduct->getData('image'));
+        $this->assertEquals('no_selection', $targetProduct->getData('small_image'));
         $mediaGallery = $targetProduct->getData('media_gallery');
         $this->assertCount(1, $mediaGallery['images']);
         $updatedImage = array_shift($mediaGallery['images']);
diff --git a/dev/tests/functional/credentials.xml.dist b/dev/tests/functional/credentials.xml.dist
index 88794d183e8781d5cea1c9199370c67daae1585c..78186091a568ddba7368126c4b9217714e35d127 100644
--- a/dev/tests/functional/credentials.xml.dist
+++ b/dev/tests/functional/credentials.xml.dist
@@ -32,10 +32,15 @@
     <field path="payment/authorizenet_directpost/trans_key" value="" />
     <field path="payment/authorizenet_directpost/trans_md5" value="" />
 
-    <field path="payment/braintree_section/braintree/braintree_advanced/merchant_account_id" value="" />
-    <field path="payment/braintree_section/braintree/braintree_required/merchant_id" value="" />
-    <field path="payment/braintree_section/braintree/braintree_required/public_key" value="" />
-    <field path="payment/braintree_section/braintree/braintree_required/private_key" value="" />
+    <field replace="braintree_enabled_fraud_merchant_account_id" value="" />
+    <field replace="braintree_enabled_fraud_merchant_id" value="" />
+    <field replace="braintree_enabled_fraud_public_key" value="" />
+    <field replace="braintree_enabled_fraud_private_key" value="" />
+
+    <field replace="braintree_disabled_fraud_merchant_account_id" value="" />
+    <field replace="braintree_disabled_fraud_merchant_id" value="" />
+    <field replace="braintree_disabled_fraud_public_key" value="" />
+    <field replace="braintree_disabled_fraud_private_key" value="" />
 
     <field path="payment/paypal_group_all_in_one/wpp_usuk/wpp_required_settings/wpp_and_express_checkout/business_account" value="" />
     <field path="payment/paypal_group_all_in_one/wpp_usuk/wpp_required_settings/wpp_and_express_checkout/api_username" value="" />
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/ConfigData.xml
index 7f01e4f46106c020c10457a8f3e0fb0a7f1de8d7..268ce5795221dbbe3f545891c4d2e420bc87440e 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/ConfigData.xml
@@ -11,26 +11,26 @@
             <field name="payment/braintree_section/braintree/braintree_required/merchant_id" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">PAYMENT_BRAINTREE_MERCHANT_ID</item>
-                <item name="value" xsi:type="string">PAYMENT_BRAINTREE_MERCHANT_ID</item>
+                <item name="label" xsi:type="string">Merchant ID</item>
+                <item name="value" xsi:type="string">%braintree_disabled_fraud_merchant_id%</item>
             </field>
             <field name="payment/braintree_section/braintree/braintree_required/public_key" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">PAYMENT_PAYMENT_BRAINTREE_PUBLIC_KEY</item>
-                <item name="value" xsi:type="string">PAYMENT_PAYMENT_BRAINTREE_PUBLIC_KEY</item>
+                <item name="label" xsi:type="string">Public Key</item>
+                <item name="value" xsi:type="string">%braintree_disabled_fraud_public_key%</item>
             </field>
             <field name="payment/braintree_section/braintree/braintree_required/private_key" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">PAYMENT_BRAINTREE_PRIVATE_KEY</item>
-                <item name="value" xsi:type="string">PAYMENT_BRAINTREE_PRIVATE_KEY</item>
+                <item name="label" xsi:type="string">Private Key</item>
+                <item name="value" xsi:type="string">%braintree_disabled_fraud_private_key%</item>
             </field>
             <field name="payment/braintree_section/braintree/braintree_advanced/merchant_account_id" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
-                <item name="label" xsi:type="string">PAYMENT_BRAINTREE_MERCHANT_ACCOUNT_ID</item>
-                <item name="value" xsi:type="string">PAYMENT_BRAINTREE_MERCHANT_ACCOUNT_ID</item>
+                <item name="label" xsi:type="string">Merchant Account ID</item>
+                <item name="value" xsi:type="string">%braintree_disabled_fraud_merchant_account_id%</item>
             </field>
             <field name="payment/braintree_section/braintree/braintree_required/payment_action" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -51,6 +51,7 @@
                 <item name="value" xsi:type="number">1</item>
             </field>
         </dataset>
+
         <dataset name="braintree_rollback">
             <field name="payment/braintree/active" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -59,6 +60,16 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
+        <dataset name="braintree_incorrect_merchant_account_id">
+            <field name="payment/braintree_section/braintree/braintree_advanced/merchant_account_id" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Merchant Account ID</item>
+                <item name="value" xsi:type="string">incorrect</item>
+            </field>
+        </dataset>
+
         <dataset name="braintree_sale">
             <field name="payment/braintree/payment_action" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -67,6 +78,7 @@
                 <item name="value" xsi:type="string">authorize_capture</item>
             </field>
         </dataset>
+
         <dataset name="braintree_3d_secure">
             <field name="payment/braintree_section/braintree/braintree_3dsecure/verify_3dsecure" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -75,6 +87,7 @@
                 <item name="value" xsi:type="number">1</item>
             </field>
         </dataset>
+
         <dataset name="braintree_3d_secure_rollback">
             <field name="payment/braintree_section/braintree/braintree_3dsecure/verify_3dsecure" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -83,6 +96,7 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_3d_secure_uk">
             <field name="payment/braintree/verify_3dsecure" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -107,6 +121,7 @@
                 </item>
             </field>
         </dataset>
+
         <dataset name="braintree_3d_secure_uk_rollback">
             <field name="payment/braintree_section/braintree/braintree_3dsecure/verify_3dsecure" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -121,6 +136,7 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_3d_secure_not_triggered_due_threshold">
             <field name="payment/braintree/verify_3dsecure" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -135,6 +151,7 @@
                 <item name="value" xsi:type="number">300</item>
             </field>
         </dataset>
+
         <dataset name="braintree_3d_secure_not_triggered_due_threshold_rollback">
             <field name="payment/braintree/verify_3dsecure" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -143,6 +160,7 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_use_vault">
             <field name="payment/braintree_section/braintree/braintree_cc_vault_active" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -151,6 +169,7 @@
                 <item name="value" xsi:type="number">1</item>
             </field>
         </dataset>
+
         <dataset name="braintree_use_vault_rollback">
             <field name="payment/braintree_section/braintree/braintree_cc_vault_active" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -159,6 +178,7 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_paypal">
             <field name="payment/braintree_section/braintree/active_braintree_paypal" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -173,6 +193,7 @@
                 <item name="value" xsi:type="string">authorize</item>
             </field>
         </dataset>
+
         <dataset name="braintree_paypal_rollback">
             <field name="payment/braintree_section/braintree/active_braintree_paypal" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -181,7 +202,14 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_paypal_sale">
+            <field name="payment/braintree_section/braintree/active_braintree_paypal" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
             <field name="payment/braintree_section/braintree/braintree_paypal/payment_action" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
                 <item name="scope_id" xsi:type="number">1</item>
@@ -189,6 +217,16 @@
                 <item name="value" xsi:type="string">authorize_capture</item>
             </field>
         </dataset>
+
+        <dataset name="braintree_paypal_sale_rollback">
+            <field name="payment/braintree_section/braintree/active_braintree_paypal" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">No</item>
+                <item name="value" xsi:type="number">0</item>
+            </field>
+        </dataset>
+
         <dataset name="braintree_paypal_skip_order_review">
             <field name="payment/braintree_section/braintree/braintree_paypal/skip_order_review" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -197,6 +235,7 @@
                 <item name="value" xsi:type="number">1</item>
             </field>
         </dataset>
+
         <dataset name="braintree_paypal_skip_order_review_rollback">
             <field name="payment/braintree_section/braintree/braintree_paypal/skip_order_review" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -205,6 +244,7 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_paypal_use_vault">
             <field name="payment/braintree_section/braintree/braintree_paypal/braintree_paypal_vault_active" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -213,6 +253,7 @@
                 <item name="value" xsi:type="number">1</item>
             </field>
         </dataset>
+
         <dataset name="braintree_paypal_use_vault_rollback">
             <field name="payment/braintree_section/braintree/braintree_paypal/braintree_paypal_vault_active" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -221,6 +262,7 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
         <dataset name="braintree_fraudprotection">
             <field name="payment/braintree/fraudprotection" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -229,6 +271,7 @@
                 <item name="value" xsi:type="number">1</item>
             </field>
         </dataset>
+
         <dataset name="braintree_fraudprotection_rollback">
             <field name="payment/braintree/fraudprotection" xsi:type="array">
                 <item name="scope" xsi:type="string">payment</item>
@@ -237,5 +280,59 @@
                 <item name="value" xsi:type="number">0</item>
             </field>
         </dataset>
+
+        <dataset name="braintree_fraud_tool_enabled_account">
+            <field name="payment/braintree_section/braintree/braintree_required/merchant_id" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Merchant ID</item>
+                <item name="value" xsi:type="string">%braintree_enabled_fraud_merchant_id%</item>
+            </field>
+            <field name="payment/braintree_section/braintree/braintree_required/public_key" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Public Key</item>
+                <item name="value" xsi:type="string">%braintree_enabled_fraud_public_key%</item>
+            </field>
+            <field name="payment/braintree_section/braintree/braintree_required/private_key" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Private Key</item>
+                <item name="value" xsi:type="string">%braintree_enabled_fraud_private_key%</item>
+            </field>
+            <field name="payment/braintree_section/braintree/braintree_advanced/merchant_account_id" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Merchant Account ID</item>
+                <item name="value" xsi:type="string">%braintree_enabled_fraud_merchant_account_id%</item>
+            </field>
+            <field name="payment/braintree_section/braintree/braintree_required/payment_action" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Authorize</item>
+                <item name="value" xsi:type="string">authorize</item>
+            </field>
+            <field name="payment/braintree_section/braintree/braintree_advanced/debug" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+            <field name="payment/braintree_section/braintree/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+        </dataset>
+
+        <dataset name="braintree_fraud_tool_enabled_account_rollback">
+            <field name="payment/braintree/active" xsi:type="array">
+                <item name="scope" xsi:type="string">payment</item>
+                <item name="scope_id" xsi:type="number">1</item>
+                <item name="label" xsi:type="string">No</item>
+                <item name="value" xsi:type="number">0</item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml
index e750aa9cb423444e2cc17b8e269a7a62b9289f20..6aa9383ff2bd1051364b1498d799ebb681714aca 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/Repository/CreditCard.xml
@@ -13,17 +13,26 @@
             <field name="credit_card_exp_year" xsi:type="string">2020</field>
             <field name="cvv" xsi:type="string">123</field>
         </dataset>
+
         <dataset name="visa_braintree_3dsecure">
             <field name="credit_card_number" xsi:type="string">4000000000000002</field>
             <field name="credit_card_exp_month" xsi:type="string">01</field>
             <field name="credit_card_exp_year" xsi:type="string">20</field>
             <field name="cvv" xsi:type="string">123</field>
         </dataset>
+
         <dataset name="visa_braintree_3dsecure_failed">
             <field name="credit_card_number" xsi:type="string">4000000000000028</field>
             <field name="credit_card_exp_month" xsi:type="string">01</field>
             <field name="credit_card_exp_year" xsi:type="string">2020</field>
             <field name="cvv" xsi:type="string">123</field>
         </dataset>
+
+        <dataset name="visa_braintree_fraud_rejected">
+            <field name="credit_card_number" xsi:type="string">4000111111111511</field>
+            <field name="credit_card_exp_month" xsi:type="string">01</field>
+            <field name="credit_card_exp_year" xsi:type="string">2020</field>
+            <field name="cvv" xsi:type="string">123</field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
index 9614923691c6c097702c3a222bfc52edfcd2489a..083bd33feca7b133903b9f83eb12c4d5b3f1fcfa 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderBackendTest.xml
@@ -64,5 +64,28 @@
             <constraint name="Magento\Sales\Test\Constraint\AssertCaptureInCommentsHistory" />
             <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGridOnFrontend" />
         </variation>
+        <variation name="CreateOrderBackendTestBraintreeVariation3" summary="Checkout with Braintree Credit Card from Admin (Basic Fraud Protection)" ticketId="MAGETWO-46470">
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="products/1" xsi:type="string">configurableProduct::with_one_option</data>
+            <data name="products/2" xsi:type="string">bundleProduct::bundle_fixed_100_dollar_product</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="taxRule" xsi:type="string">us_ca_ny_rule</data>
+            <data name="billingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="saveAddress" xsi:type="string">No</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="prices" xsi:type="array">
+                <item name="grandTotal" xsi:type="string">145.98</item>
+            </data>
+            <data name="payment/method" xsi:type="string">braintree</data>
+            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_braintree_fraud_rejected</data>
+            <data name="configData" xsi:type="string">braintree</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderSuccessCreateMessage" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" />
+            <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGridOnFrontend" />
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4a2aa551a18170002045f821de2d492ddb7a2082
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutDeclinedTest.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Checkout\Test\TestCase\OnePageCheckoutDeclinedTest" summary="Error message during OnePageCheckout">
+        <variation name="OnePageCheckoutBraintreeDeclinedTestVariation1" summary="Registered Checkout with Braintree Credit Card from Storefront with Advanced Fraud Protection failed" ticketId="MAGETWO-46469">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
+            <data name="checkoutMethod" xsi:type="string">login</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="payment/method" xsi:type="string">braintree</data>
+            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_braintree_fraud_rejected</data>
+            <data name="expectedErrorMessage" xsi:type="string">Transaction has been declined. Please try again later.</data>
+            <data name="configData" xsi:type="string">braintree_fraud_tool_enabled_account, braintree_fraudprotection</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCheckoutErrorMessage" />
+        </variation>
+        <variation name="OnePageCheckoutBraintreeDeclinedTestVariation2" summary="Checkout with Braintree Credit Card configured with incorrect credentials" ticketId="MAGETWO-46244">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="payment/method" xsi:type="string">braintree</data>
+            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
+            <data name="expectedErrorMessage" xsi:type="string">Sorry, but something went wrong</data>
+            <data name="configData" xsi:type="string">braintree, braintree_incorrect_merchant_account_id</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCheckoutErrorMessage" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml
index 920047e7037e135115424a192b9c9cb3267982d5..54fdfc96dc947db330c37b701132bfc0e3fcbeb0 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutTest.xml
@@ -23,7 +23,7 @@
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure</data>
-            <data name="isVaultEnabled" xsi:type="boolean">false</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree, braintree_3d_secure_not_triggered_due_threshold</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
@@ -47,7 +47,7 @@
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure</data>
-            <data name="isVaultEnabled" xsi:type="boolean">false</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree, braintree_3d_secure_uk</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
@@ -71,7 +71,7 @@
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
-            <data name="isVaultEnabled" xsi:type="boolean">false</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:extended_acceptance_test, test_type:3rd_party_test, severity:S0</data>
@@ -99,7 +99,7 @@
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
-            <data name="isVaultEnabled" xsi:type="boolean">false</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">braintree, braintree_sale</data>
             <data name="status" xsi:type="string">Processing</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S0</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.php b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f21b8f219cb13dd426c1aad3cdb0f6ba24b06a6
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Braintree\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure payment method.
+ * 2. Create products.
+ *
+ * Steps:
+ * 1. Log in Storefront.
+ * 2. Add products to the Shopping Cart.
+ * 5. Click the 'Proceed to Checkout' button.
+ * 6. Fill shipping information.
+ * 7. Select shipping method.
+ * 8. Select payment method.
+ * 9. Verify order total on review step.
+ * 10. Click 'Place Order' button.
+ * 11. Specify password in 3D Secure popup.
+ * 12. Click 'Submit'.
+ * 13. Perform assertions.
+ *
+ * @group Braintree
+ * @ZephyrId MAGETWO-46477
+ */
+class OnePageCheckoutWith3dSecureFailedTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    const SEVERITY = 'S1';
+    /* end tags */
+
+    /**
+     * Verifies error message on Onepage Checkout if 3d secure validation is failed.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2a17d1496a72dfb1bb63073ccd982abf3522ca9f
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/OnePageCheckoutWith3dSecureFailedTest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Braintree\Test\TestCase\OnePageCheckoutWith3dSecureFailedTest" summary="Onepage checkout with Braintree payment method with 3D Secure enabled.">
+        <variation name="OnePageCheckoutBraintree3dSecureFailedTestVariation1" summary="Guest Checkout with Braintree Credit Card from Storefront with  3D Secure verification failed" ticketId="MAGETWO-46477">
+            <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingAddress/dataset" xsi:type="string">US_address_1</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
+            <data name="shipping/shipping_method" xsi:type="string">Fixed</data>
+            <data name="payment/method" xsi:type="string">braintree</data>
+            <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
+            <data name="creditCard/dataset" xsi:type="string">visa_braintree_3dsecure_failed</data>
+            <data name="secure3d/dataset" xsi:type="string">secure3d_braintree</data>
+            <data name="configData" xsi:type="string">braintree, braintree_3d_secure</data>
+            <data name="expectedErrorMessage" xsi:type="string">Please try again with another form of payment.</data>
+            <data name="status" xsi:type="string">Processing</data>
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <constraint name="Magento\Checkout\Test\Constraint\AssertCheckoutErrorMessage" />
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
index ad4d5cc06e92e260aed4c90e6f534f2540d25034..66d912d77bba7836ab2f747757f32f2a82cf02ec 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml
@@ -20,6 +20,7 @@
             </data>
             <data name="payment/method" xsi:type="string">braintree</data>
             <data name="vault/method" xsi:type="string">braintree_cc_vault</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="creditCardClass" xsi:type="string">credit_card_braintree</data>
             <data name="creditCard/dataset" xsi:type="string">visa_braintree</data>
             <data name="configData" xsi:type="string">braintree, braintree_use_vault</data>
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestStep/PlaceOrderWith3dSecureFailedStep.php b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestStep/PlaceOrderWith3dSecureFailedStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..00a8fce571617e5cd643d9b05bd914dc24e3eb43
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestStep/PlaceOrderWith3dSecureFailedStep.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Braintree\Test\TestStep;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Braintree\Test\Fixture\Secure3dBraintree;
+
+/**
+ * Click 'Place order' button and submit 3D secure verification step.
+ */
+class PlaceOrderWith3dSecureFailedStep implements TestStepInterface
+{
+    /**
+     * Onepage checkout page.
+     *
+     * @var CheckoutOnepage
+     */
+    private $checkoutOnepage;
+
+    /**
+     * 3D Secure fixture.
+     *
+     * @var Secure3dBraintree
+     */
+    private $secure3d;
+
+    /**
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param Secure3dBraintree $secure3d
+     */
+    public function __construct(
+        CheckoutOnepage $checkoutOnepage,
+        Secure3dBraintree $secure3d
+    ) {
+        $this->checkoutOnepage = $checkoutOnepage;
+        $this->secure3d = $secure3d;
+    }
+
+    /**
+     * Click 'Place order' button and submit 3D secure verification.
+     *
+     * @return array
+     */
+    public function run()
+    {
+        $this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
+
+        $this->checkoutOnepage->getBraintree3dSecureBlock()->fill($this->secure3d);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml
index 12aa92d35064d457cef4a544daace01314723d99..6ad46774f0f765b01761f6227465c63b695535d6 100644
--- a/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml
@@ -21,6 +21,19 @@
         <step name="fillBillingInformation" module="Magento_Checkout" next="placeOrderWith3dSecure" />
         <step name="placeOrderWith3dSecure" module="Magento_Braintree" />
     </scenario>
+    <scenario name="OnePageCheckoutWith3dSecureFailedTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
+        <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
+        <step name="fillShippingMethod" module="Magento_Checkout" next="selectPaymentMethod" />
+        <step name="selectPaymentMethod" module="Magento_Checkout" next="fillBillingInformation" />
+        <step name="fillBillingInformation" module="Magento_Checkout" next="placeOrderWith3dSecureFailed" />
+        <step name="placeOrderWith3dSecureFailed" module="Magento_Braintree" />
+    </scenario>
     <scenario name="UseVaultWith3dSecureOnCheckoutTest" firstStep="setupConfiguration">
         <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
         <step name="createProducts" module="Magento_Catalog" next="addProductsToTheCart" />
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
index de6adb0efd8b21df23cf0531624fa0b90983225d..5baf4a4cb7c3e273588d85c1217e6824cdefad92 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
@@ -522,14 +522,16 @@ class View extends AbstractConfigureBlock
     }
 
     /**
-     * Check id media gallery is visible for the product.
+     * Check if media gallery is visible for the product.
      *
      * @return bool
      */
     public function isGalleryVisible()
     {
         $this->waitForElementNotVisible($this->galleryLoader);
-        return $this->_rootElement->find($this->mediaGallery)->isVisible();
+        $this->waitForElementVisible($this->mediaGallery);
+
+        return true;
     }
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php
index 49b900e4eedce313df7809a574e150f3c63c4787..507bb5673effc80e7525b238d0b14b2ee6d40c11 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Login.php
@@ -6,6 +6,7 @@
 namespace Magento\Checkout\Test\Block\Onepage;
 
 use Magento\Checkout\Test\Fixture\Checkout;
+use Magento\Customer\Test\Fixture\Customer;
 use Magento\Mtf\Block\Form;
 use Magento\Mtf\Fixture\FixtureInterface;
 
@@ -93,14 +94,15 @@ class Login extends Form
     /**
      * Fill required fields for guest checkout.
      *
-     * @param FixtureInterface $customer
+     * @param Customer $customer
      * @return void
      */
-    public function fillGuestFields(FixtureInterface $customer)
+    public function fillGuestFields(Customer $customer)
     {
         $mapping = $this->dataMapping();
         $this->_rootElement->find($mapping['email']['selector'], $mapping['email']['strategy'])
             ->setValue($customer->getEmail());
+        $this->waitForElementNotVisible($this->loadingMask);
     }
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/Method.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/Method.php
index cce29d23f63b18fc2c469e3df964cb2dd81188e0..24bddf79c1a07c9205e0b22426946e11b92d0489 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/Method.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Shipping/Method.php
@@ -22,26 +22,49 @@ class Method extends Block
     protected $shippingMethod = './/tbody//tr[td[contains(., "%s")] and td[contains(., "%s")]]//input';
 
     /**
-     * Continue checkout button
+     * Continue checkout button.
      *
      * @var string
      */
     protected $continue = '#shipping-method-buttons-container button';
 
     /**
-     * Wait element
+     * Wait element.
      *
      * @var string
      */
     protected $waitElement = '.loading-mask';
 
     /**
-     * Block wait element
+     * Block wait element.
      *
      * @var string
      */
     protected $blockWaitElement = '._block-content-loading';
 
+    /**
+     * Wait until shipping rates will appear.
+     *
+     * @return void
+     */
+    private function waitForShippingRates()
+    {
+        // Code under test uses JavaScript setTimeout at this point as well.
+        sleep(3);
+        $this->waitForElementNotVisible($this->blockWaitElement);
+    }
+
+    /**
+     * Retrieve if the shipping methods loader appears.
+     *
+     * @return bool|null
+     */
+    public function isLoaderAppeared()
+    {
+        $this->_rootElement->click();
+        return $this->waitForElementVisible($this->waitElement);
+    }
+
     /**
      * Select shipping method.
      *
@@ -50,15 +73,26 @@ class Method extends Block
      */
     public function selectShippingMethod(array $method)
     {
-        // Code under test uses JavaScript setTimeout at this point as well.
-        sleep(3);
+        $this->waitForShippingRates();
         $selector = sprintf($this->shippingMethod, $method['shipping_method'], $method['shipping_service']);
-        $this->waitForElementNotVisible($this->blockWaitElement);
         $this->_rootElement->find($selector, Locator::SELECTOR_XPATH)->click();
     }
 
     /**
-     * Click continue button
+     * Check whether shipping method is available in the shipping rates.
+     *
+     * @param array $method
+     * @return bool
+     */
+    public function isShippingMethodAvaiable(array $method)
+    {
+        $this->waitForShippingRates();
+        $selector = sprintf($this->shippingMethod, $method['shipping_method'], $method['shipping_service']);
+        return $this->_rootElement->find($selector, Locator::SELECTOR_XPATH)->isVisible();
+    }
+
+    /**
+     * Click continue button.
      *
      * @return void
      */
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertCheckoutErrorMessage.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertCheckoutErrorMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..24fc2419721b51e3b16c4bcc25e88d13497591c2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Constraint/AssertCheckoutErrorMessage.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Checkout\Test\Constraint;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Assert that error message is correct.
+ */
+class AssertCheckoutErrorMessage extends AbstractConstraint
+{
+    /**
+     * Assert that error message is correct.
+     *
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param string $expectedErrorMessage
+     * @return void
+     */
+    public function processAssert(CheckoutOnepage $checkoutOnepage, $expectedErrorMessage)
+    {
+        \PHPUnit_Framework_Assert::assertEquals(
+            $expectedErrorMessage,
+            $checkoutOnepage->getMessagesBlock()->getErrorMessage(),
+            'Wrong error message is displayed.'
+        );
+    }
+
+    /**
+     * Returns string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Error message on Checkout onepage page is correct.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutOnepage.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutOnepage.xml
index 0ab3bbb2c2cfcb01330fecd582bb235ed7805068..00ac573da2e7e658b2dc3a9de50a7185bb2512fb 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutOnepage.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutOnepage.xml
@@ -17,7 +17,7 @@
         <block name="paymentBlock" class="Magento\Checkout\Test\Block\Onepage\Payment" locator="#checkout-step-payment" strategy="css selector" />
         <block name="discountCodesBlock" class="Magento\Checkout\Test\Block\Onepage\Payment\DiscountCodes" locator=".discount-code" strategy="css selector" />
         <block name="reviewBlock" class="Magento\Checkout\Test\Block\Onepage\Review" locator=".opc-block-summary" strategy="css selector" />
-        <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator=".page.messages" strategy="css selector" />
+        <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="//*[@id='checkout']//div[@data-role='checkout-messages' and .//div]" strategy="xpath" />
         <block name="customAddressBlock" class="Magento\Checkout\Test\Block\Onepage\CustomAddress" locator=".checkout-billing-address" strategy="css selector" />
     </page>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutDeclinedTest.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutDeclinedTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..990c3df13e9b1f00e6a2171dfb8f2216b38f0ec3
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestCase/OnePageCheckoutDeclinedTest.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Checkout\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure payment method.
+ * 2. Create products.
+ *
+ * Steps:
+ * 1. Log in Storefront.
+ * 2. Add products to the Shopping Cart.
+ * 3. Click the 'Proceed to Checkout' button.
+ * 4. Fill shipping information.
+ * 5. Select shipping method.
+ * 6. Select payment method.
+ * 7. Click 'Place Order' button.
+ * 8. Perform assertions.
+ *
+ * @group Checkout
+ * @ZephyrId MAGETWO-46469
+ */
+class OnePageCheckoutDeclinedTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    const SEVERITY = 'S1';
+    /* end tags */
+
+    /**
+     * Verifies error message on Onepage Checkout.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/ClickPlaceOrderButtonStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/ClickPlaceOrderButtonStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf086e55d5a305f716f4b64513190b32c7708cba
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/ClickPlaceOrderButtonStep.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Checkout\Test\TestStep;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\TestStep\TestStepInterface;
+
+/**
+ * Click 'Place order' button.
+ */
+class ClickPlaceOrderButtonStep implements TestStepInterface
+{
+    /**
+     * Onepage checkout page.
+     *
+     * @var CheckoutOnepage
+     */
+    private $checkoutOnepage;
+
+    /**
+     * @param CheckoutOnepage $checkoutOnepage
+     */
+    public function __construct(CheckoutOnepage $checkoutOnepage)
+    {
+        $this->checkoutOnepage = $checkoutOnepage;
+    }
+
+    /**
+     * Click 'Place order' button.
+     *
+     * @return array
+     */
+    public function run()
+    {
+        $this->checkoutOnepage->getPaymentBlock()->getSelectedPaymentMethodBlock()->clickPlaceOrder();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectCheckoutMethodStep.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectCheckoutMethodStep.php
index cb32e5f0ddfe61d9e97e8ef211ce71bfa46ee71a..3af915e22bfcb1c85ebb53b84872ef4ed255fac2 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectCheckoutMethodStep.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/TestStep/SelectCheckoutMethodStep.php
@@ -59,13 +59,6 @@ class SelectCheckoutMethodStep implements TestStepInterface
      */
     private $customerAccountCreatePage;
 
-    /**
-     * Shipping carrier and method.
-     *
-     * @var array
-     */
-    protected $shipping;
-
     /**
      * @constructor
      * @param CheckoutOnepage $checkoutOnepage
@@ -74,7 +67,6 @@ class SelectCheckoutMethodStep implements TestStepInterface
      * @param LogoutCustomerOnFrontendStep $logoutCustomerOnFrontend
      * @param ClickProceedToCheckoutStep $clickProceedToCheckoutStep
      * @param string $checkoutMethod
-     * @param array $shipping
      */
     public function __construct(
         CheckoutOnepage $checkoutOnepage,
@@ -82,8 +74,7 @@ class SelectCheckoutMethodStep implements TestStepInterface
         Customer $customer,
         LogoutCustomerOnFrontendStep $logoutCustomerOnFrontend,
         ClickProceedToCheckoutStep $clickProceedToCheckoutStep,
-        $checkoutMethod,
-        array $shipping = []
+        $checkoutMethod
     ) {
         $this->checkoutOnepage = $checkoutOnepage;
         $this->customerAccountCreatePage = $customerAccountCreatePage;
@@ -91,7 +82,6 @@ class SelectCheckoutMethodStep implements TestStepInterface
         $this->logoutCustomerOnFrontend = $logoutCustomerOnFrontend;
         $this->clickProceedToCheckoutStep = $clickProceedToCheckoutStep;
         $this->checkoutMethod = $checkoutMethod;
-        $this->shipping = $shipping;
     }
 
     /**
@@ -120,9 +110,7 @@ class SelectCheckoutMethodStep implements TestStepInterface
                 $this->checkoutOnepage->getLoginBlock()->loginCustomer($this->customer);
             }
         } elseif ($this->checkoutMethod === 'guest') {
-            if (empty($this->shipping)) {
-                $this->checkoutOnepage->getLoginBlock()->fillGuestFields($this->customer);
-            }
+            $this->checkoutOnepage->getLoginBlock()->fillGuestFields($this->customer);
         } elseif ($this->checkoutMethod === 'sign_in') {
             $this->checkoutOnepage->getAuthenticationWrapperBlock()->signInLinkClick();
             $this->checkoutOnepage->getAuthenticationWrapperBlock()->loginCustomer($this->customer);
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml
index 24b369200e71d99df604457603969594b40862ca..d7a61b0eaaa2fece41b7d1f464f0e56bdb80d159 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/di.xml
@@ -22,4 +22,9 @@
             <argument name="severity" xsi:type="string">S0</argument>
         </arguments>
     </type>
+    <type name="Magento\Checkout\Test\Constraint\AssertCheckoutErrorMessage">
+        <arguments>
+            <argument name="severity" xsi:type="string">S1</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml
index 24eb96c0a9347741384ffd6718bf349eeb452c85..e9b49babbba1936aae49b20339a56732b5b2531b 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/etc/testcase.xml
@@ -28,4 +28,17 @@
         <step name="addProductsToTheCart" module="Magento_Checkout" next="ProceedToCheckout" />
         <step name="ProceedToCheckout" module="Magento_Checkout" />
     </scenario>
+    <scenario name="OnePageCheckoutDeclinedTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
+        <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
+        <step name="fillShippingMethod" module="Magento_Checkout" next="selectPaymentMethod" />
+        <step name="selectPaymentMethod" module="Magento_Checkout" next="fillBillingInformation" />
+        <step name="fillBillingInformation" module="Magento_Checkout" next="clickPlaceOrderButton" />
+        <step name="clickPlaceOrderButton" module="Magento_Checkout" />
+    </scenario>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml
index 8baa7ce0d9310f7e2d7a17fab8c904530cf25629..ba85d0d13bfc68761ea562802f259dcda28ff738 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml
@@ -241,6 +241,40 @@
             <field name="telephone" xsi:type="string">333-33-333-33</field>
         </dataset>
 
+        <dataset name="DE_address_Frankfurt">
+            <field name="firstname" xsi:type="string">Jan</field>
+            <field name="lastname" xsi:type="string">Jansen</field>
+            <field name="company" xsi:type="string">Magento %isolation%</field>
+            <field name="city" xsi:type="string">Frankfurt</field>
+            <field name="street" xsi:type="string">Marzellenstrasse 13-17</field>
+            <field name="postcode" xsi:type="string">10789</field>
+            <field name="country_id" xsi:type="string">Germany</field>
+            <field name="region" xsi:type="string">Hessen</field>
+            <field name="telephone" xsi:type="string">333-33-333-33</field>
+        </dataset>
+
+        <dataset name="KE_Nairobi">
+            <field name="firstname" xsi:type="string">John</field>
+            <field name="lastname" xsi:type="string">Doe</field>
+            <field name="company" xsi:type="string">Magento %isolation%</field>
+            <field name="city" xsi:type="string">Nairobi</field>
+            <field name="street" xsi:type="string">6161 West Centinela Avenue</field>
+            <field name="telephone" xsi:type="string">555-55-555-55</field>
+            <field name="country_id" xsi:type="string">Kenya</field>
+            <field name="postcode" xsi:type="string">12345</field>
+        </dataset>
+
+        <dataset name="KE_Mombasa">
+            <field name="firstname" xsi:type="string">John</field>
+            <field name="lastname" xsi:type="string">Doe</field>
+            <field name="company" xsi:type="string">Magento %isolation%</field>
+            <field name="city" xsi:type="string">Mombasa</field>
+            <field name="street" xsi:type="string">6161 West Centinela Avenue</field>
+            <field name="telephone" xsi:type="string">555-55-555-55</field>
+            <field name="country_id" xsi:type="string">Kenya</field>
+            <field name="postcode" xsi:type="string">12345</field>
+        </dataset>
+
         <dataset name="customer_UK_US_addresses">
             <field name="firstname" xsi:type="string">John</field>
             <field name="lastname" xsi:type="string">Doe%isolation%</field>
diff --git a/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/CityBasedShippingRateTest.xml b/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/CityBasedShippingRateTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e54439c8cd05c5537542d1769d58714d89fc4fb2
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Dhl/Test/TestCase/CityBasedShippingRateTest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Shipping\Test\TestCase\CityBasedShippingRateTest" summary="Shipping rates can be reloaded based on changes in City field value">
+        <variation name="CityBasedShippingRateDHLTestVariation" summary="Shipping rates can be reloaded based on changes in City field value for DHL shipping method" ticketId="MAGETWO-56124">
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingMethod/shipping_service" xsi:type="string">DHL</data>
+            <data name="shippingMethod/shipping_method" xsi:type="string">Express easy</data>
+            <data name="clearShippingAddress/postcode" xsi:type="string" />
+            <data name="clearShippingAddress/city" xsi:type="string" />
+            <data name="clearShippingAddress/country_id" xsi:type="string" />
+            <data name="shippingAddresses/0/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/1/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/1/postcode" xsi:type="string">12345</data>
+            <data name="shippingAddresses/2/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/2/postcode" xsi:type="string">12345</data>
+            <data name="shippingAddresses/2/city" xsi:type="string">Nairobi</data>
+            <data name="shippingAddresses/3/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/3/postcode" xsi:type="string">12345</data>
+            <data name="shippingAddresses/3/city" xsi:type="string">Mombasa</data>
+            <data name="shippingAddresses/4/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/4/city" xsi:type="string">Mombasa</data>
+            <data name="shippingAddresses/5/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/5/city" xsi:type="string">Nairobi</data>
+            <data name="isShippingAvailable" xsi:type="array">
+                <item name="0" xsi:type="boolean">false</item>
+                <item name="1" xsi:type="boolean">false</item>
+                <item name="2" xsi:type="boolean">true</item>
+                <item name="3" xsi:type="boolean">true</item>
+                <item name="4" xsi:type="boolean">true</item>
+                <item name="5" xsi:type="boolean">true</item>
+            </data>
+            <data name="configData" xsi:type="string">dhl_eu, shipping_origin_CH, config_base_currency_ch</data>
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/CityBasedShippingRateTest.xml b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/CityBasedShippingRateTest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6a2fd5776a27d307e7c0f8372438b42f38fd7f5
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/CityBasedShippingRateTest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
+    <testCase name="Magento\Shipping\Test\TestCase\CityBasedShippingRateTest" summary="Shipping rates can be reloaded based on changes in City field value">
+        <variation name="CityBasedShippingRateFedexTestVariation" summary="Shipping rates can be reloaded based on changes in City field value for Fedex shipping method" ticketId="MAGETWO-56124">
+            <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
+            <data name="products/0" xsi:type="string">catalogProductSimple::default</data>
+            <data name="checkoutMethod" xsi:type="string">guest</data>
+            <data name="customer/dataset" xsi:type="string">default</data>
+            <data name="shippingMethod/shipping_service" xsi:type="string">Federal Express</data>
+            <data name="shippingMethod/shipping_method" xsi:type="string">International Economy</data>
+            <data name="clearShippingAddress/postcode" xsi:type="string" />
+            <data name="clearShippingAddress/city" xsi:type="string" />
+            <data name="clearShippingAddress/country_id" xsi:type="string" />
+            <data name="shippingAddresses/0/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/1/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/1/postcode" xsi:type="string">12345</data>
+            <data name="shippingAddresses/2/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/2/postcode" xsi:type="string">12345</data>
+            <data name="shippingAddresses/2/city" xsi:type="string">Nairobi</data>
+            <data name="shippingAddresses/3/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/3/postcode" xsi:type="string">12345</data>
+            <data name="shippingAddresses/3/city" xsi:type="string">Mombasa</data>
+            <data name="shippingAddresses/4/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/4/city" xsi:type="string">Mombasa</data>
+            <data name="shippingAddresses/5/country_id" xsi:type="string">Kenya</data>
+            <data name="shippingAddresses/5/city" xsi:type="string">Nairobi</data>
+            <data name="isShippingAvailable" xsi:type="array">
+                <item name="0" xsi:type="boolean">false</item>
+                <item name="1" xsi:type="boolean">true</item>
+                <item name="2" xsi:type="boolean">true</item>
+                <item name="3" xsi:type="boolean">true</item>
+                <item name="4" xsi:type="boolean">false</item>
+                <item name="5" xsi:type="boolean">false</item>
+            </data>
+            <data name="configData" xsi:type="string">fedex, shipping_origin_US_CA</data>
+        </variation>
+    </testCase>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml
index f6ac4ac4f0a3c4591c12de7215600010c5fb857c..11f9d9d5270e679df9cd5237b4a51139cb51475e 100644
--- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/OnePageCheckoutTest.xml
@@ -21,7 +21,7 @@
             </data>
             <data name="creditCardClass" xsi:type="string">credit_card</data>
             <data name="creditCard/dataset" xsi:type="string">visa_default</data>
-            <data name="isVaultEnabled" xsi:type="boolean">false</data>
+            <data name="isVaultPresent" xsi:type="boolean">false</data>
             <data name="configData" xsi:type="string">payflowpro</data>
             <data name="tag" xsi:type="string">test_type:3rd_party_test, severity:S1</data>
             <constraint name="Magento\Checkout\Test\Constraint\AssertOrderSuccessPlacedMessage" />
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php
index d1f27d14a6619f71fc2e459adad23888d4fb51b7..4b3768295799695fbb45db1a17e75acb193b91f7 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/View/Tab/Invoices/Grid.php
@@ -9,7 +9,7 @@ namespace Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Invoices;
 /**
  * Invoices grid on order view page.
  */
-class Grid extends \Magento\Backend\Test\Block\Widget\Grid
+class Grid extends \Magento\Ui\Test\Block\Adminhtml\DataGrid
 {
     /**
      * Locator value for link in action column.
@@ -34,6 +34,9 @@ class Grid extends \Magento\Backend\Test\Block\Widget\Grid
         'id' => [
             'selector' => 'input[name="increment_id"]',
         ],
+        'order_id' => [
+            'selector' => 'input[name="order_increment_id"]',
+        ],
         'status' => [
             'selector' => 'select[name="state"]',
             'input' => 'select',
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceStatusInOrdersGrid.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceStatusInOrdersGrid.php
new file mode 100644
index 0000000000000000000000000000000000000000..6695786923b5c00c71e12101855421554e940281
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Constraint/AssertInvoiceStatusInOrdersGrid.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Sales\Test\Constraint;
+
+use Magento\Sales\Test\Page\Adminhtml\SalesOrderView;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Assert invoice status on order page in Admin.
+ */
+class AssertInvoiceStatusInOrdersGrid extends AbstractConstraint
+{
+    /**
+     * Assert invoice status on order page in Admin.
+     *
+     * @param SalesOrderView $salesOrderView
+     * @param string $invoiceStatus
+     * @param string $orderId
+     * @return void
+     */
+    public function processAssert(
+        SalesOrderView $salesOrderView,
+        $invoiceStatus,
+        $orderId
+    ) {
+        $salesOrderView->open(['order_id' => $orderId]);
+        $salesOrderView->getOrderForm()->openTab('invoices');
+        /** @var \Magento\Sales\Test\Block\Adminhtml\Order\View\Tab\Invoices\Grid $grid */
+        $grid = $salesOrderView->getOrderForm()->getTab('invoices')->getGridBlock();
+        $filter = [
+            'order_id' => $orderId,
+            'status' => $invoiceStatus,
+        ];
+        \PHPUnit_Framework_Assert::assertTrue(
+            $grid->isRowVisible($filter),
+            'Invoice status is incorrect.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Invoice status is correct.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml
index f42c97e1a6614a927da685f9cd5e1f8c84ff0c32..df10cccbd82136f027f4ee6b236cafe272cdbdc8 100644
--- a/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml
+++ b/dev/tests/functional/tests/app/Magento/Sales/Test/etc/di.xml
@@ -11,6 +11,11 @@
             <argument name="severity" xsi:type="string">S0</argument>
         </arguments>
     </type>
+    <type name="Magento\Sales\Test\Constraint\AssertInvoiceStatusInOrdersGrid">
+        <arguments>
+            <argument name="severity" xsi:type="string">S1</argument>
+        </arguments>
+    </type>
     <type name="Magento\Sales\Test\Constraint\AssertOrderStatusDuplicateStatus">
         <arguments>
             <argument name="severity" xsi:type="string">S0</argument>
diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertCityBasedShippingRateChanged.php b/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertCityBasedShippingRateChanged.php
new file mode 100644
index 0000000000000000000000000000000000000000..a10b47a2f9950f311d4c8ebcbdd3babb46faf6a8
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/Constraint/AssertCityBasedShippingRateChanged.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Shipping\Test\Constraint;
+
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Check that Shipping rate changes due to City change.
+ */
+class AssertCityBasedShippingRateChanged extends AbstractConstraint
+{
+    /**
+     * Assert that Shipping rate changed on City change.
+     *
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param array $shippingMethod
+     * @param bool $isShippingAvailable
+     * @return void
+     */
+    public function processAssert(CheckoutOnepage $checkoutOnepage, $shippingMethod, $isShippingAvailable)
+    {
+        if ($isShippingAvailable) {
+            \PHPUnit_Framework_Assert::assertTrue(
+                $checkoutOnepage->getShippingMethodBlock()->isLoaderAppeared(),
+                'Shipping rate has not been changed.'
+            );
+        }
+        $shippingAvaialability = $isShippingAvailable ? 'avaiable' : 'unavailable';
+        \PHPUnit_Framework_Assert::assertEquals(
+            $isShippingAvailable,
+            $checkoutOnepage->getShippingMethodBlock()->isShippingMethodAvaiable($shippingMethod),
+            "Shipping rates for {$shippingMethod['shipping_service']} should be $shippingAvaialability."
+        );
+    }
+
+    /**
+     * Returns a string representation of successful assertion.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return "Shipping rate has been changed.";
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/TestCase/CityBasedShippingRateTest.php b/dev/tests/functional/tests/app/Magento/Shipping/Test/TestCase/CityBasedShippingRateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..294cf129c607308425fc6e9a3574b047d8b2ff18
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/TestCase/CityBasedShippingRateTest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Shipping\Test\TestCase;
+
+use Magento\Mtf\TestCase\Scenario;
+
+/**
+ * Preconditions:
+ * 1. Configure shipping method.
+ * 2. Create products.
+ * 3. Create and setup customer.
+ *
+ * Steps:
+ * 1. Go to Frontend.
+ * 2. Add products to the cart.
+ * 3. Click the 'Proceed to Checkout' button.
+ * 4. Fill shipping information.
+ * 5. Perform assertions.
+ *
+ * @group Shipping
+ * @ZephyrId MAGETWO-56124
+ */
+class CityBasedShippingRateTest extends Scenario
+{
+    /* tags */
+    const MVP = 'yes';
+    const TEST_TYPE = '3rd_party_test';
+    const SEVERITY = 'S1';
+    /* end tags */
+
+    /**
+     * Runs City Based Shipping Rate test.
+     *
+     * @return void
+     */
+    public function test()
+    {
+        $this->executeScenario();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/TestStep/FillShippingAddressesStep.php b/dev/tests/functional/tests/app/Magento/Shipping/Test/TestStep/FillShippingAddressesStep.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a0f5ea7e269d71234e3cdacbc8c570c6bb040ed
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/TestStep/FillShippingAddressesStep.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Shipping\Test\TestStep;
+
+use Magento\Mtf\Fixture\FixtureFactory;
+use Magento\Mtf\TestStep\TestStepInterface;
+use Magento\Customer\Test\Fixture\Address;
+use Magento\Checkout\Test\Page\CheckoutOnepage;
+use Magento\Shipping\Test\Constraint\AssertCityBasedShippingRateChanged;
+
+/**
+ * Fill shipping addresses and assert rates relouding.
+ */
+class FillShippingAddressesStep implements TestStepInterface
+{
+    /**
+     * Onepage checkout page.
+     *
+     * @var CheckoutOnepage
+     */
+    private $checkoutOnepage;
+
+    /**
+     * Address fixture.
+     *
+     * @var Address[]
+     */
+    private $shippingAddresses;
+
+    /**
+     * Assert City based Shipping rate.
+     *
+     * @var array
+     */
+    private $assertRate;
+
+    /**
+     * @var array
+     */
+    private $isShippingAvailable;
+
+    /**
+     * Shipping method.
+     *
+     * @var array
+     */
+    private $shippingMethod;
+
+    /**
+     * @param CheckoutOnepage $checkoutOnepage
+     * @param FixtureFactory $fixtureFactory
+     * @param AssertCityBasedShippingRateChanged $assertRate
+     * @param array $shippingMethod
+     * @param array $shippingAddresses
+     * @param array $clearShippingAddress
+     * @param array $isShippingAvailable
+     */
+    public function __construct(
+        CheckoutOnepage $checkoutOnepage,
+        FixtureFactory $fixtureFactory,
+        AssertCityBasedShippingRateChanged $assertRate,
+        array $shippingMethod,
+        array $shippingAddresses,
+        array $clearShippingAddress,
+        array $isShippingAvailable
+    ) {
+        $this->checkoutOnepage = $checkoutOnepage;
+        $this->assertRate = $assertRate;
+
+        foreach ($shippingAddresses as $address) {
+            $data = array_merge($clearShippingAddress, $address);
+            $this->shippingAddresses[] = $fixtureFactory->createByCode('address', ['data' => $data]);
+        }
+        $this->isShippingAvailable = $isShippingAvailable;
+        $this->shippingMethod = $shippingMethod;
+    }
+
+    /**
+     * Fill shipping address and assert if the shipping rates is reloaded.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        foreach ($this->shippingAddresses as $key => $shippingAddress) {
+            $this->checkoutOnepage->getShippingBlock()->fill($shippingAddress);
+            $this->assertRate->processAssert(
+                $this->checkoutOnepage,
+                $this->shippingMethod,
+                $this->isShippingAvailable[$key]
+            );
+        }
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/etc/di.xml b/dev/tests/functional/tests/app/Magento/Shipping/Test/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d0d24b810fb44bd0caa7dec1e6b302006904b102
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/etc/di.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+ -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <type name="Magento\Shipping\Test\Constraint\AssertCityBasedShippingRateChanged">
+        <arguments>
+            <argument name="severity" xsi:type="string">S1</argument>
+        </arguments>
+    </type>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Shipping/Test/etc/testcase.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b1fabed80066b6933f58f89e69aa59ea20042d65
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/etc/testcase.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/Magento/Mtf/TestCase/etc/testcase.xsd">
+    <scenario name="CityBasedShippingRateTest" firstStep="setupConfiguration">
+        <step name="setupConfiguration" module="Magento_Config" next="createProducts" />
+        <step name="createProducts" module="Magento_Catalog" next="addProductsToTheCart" />
+        <step name="addProductsToTheCart" module="Magento_Checkout" next="proceedToCheckout" />
+        <step name="proceedToCheckout" module="Magento_Checkout" next="createCustomer" />
+        <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" />
+        <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddresses" />
+        <step name="fillShippingAddresses" module="Magento_Shipping" />
+    </scenario>
+</config>
diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/CheckSaveCreditCardOptionStep.php b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/CheckSaveCreditCardOptionStep.php
index b0f33872103f27ffe00e2b1323574fa0fdc6b88a..eee0f1be86ef79198a7864df8be90e8a225ea840 100644
--- a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/CheckSaveCreditCardOptionStep.php
+++ b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/CheckSaveCreditCardOptionStep.php
@@ -36,28 +36,28 @@ class CheckSaveCreditCardOptionStep implements TestStepInterface
     private $payment;
 
     /**
-     * If vault is enabled for payment method.
+     * If 'Save for later use' checkbox is present in credit card form.
      *
      * @var null|bool
      */
-    private $isVaultEnabled;
+    private $isVaultPresent;
 
     /**
      * @param CheckoutOnepage $checkoutOnepage
      * @param AssertSaveCreditCardOptionNotPresent $assertSaveCreditCardOptionNotPresent
      * @param array $payment
-     * @param null|bool $isVaultEnabled
+     * @param null|bool $isVaultPresent
      */
     public function __construct(
         CheckoutOnepage $checkoutOnepage,
         AssertSaveCreditCardOptionNotPresent $assertSaveCreditCardOptionNotPresent,
         array $payment,
-        $isVaultEnabled = null
+        $isVaultPresent = null
     ) {
         $this->checkoutOnepage = $checkoutOnepage;
         $this->assertSaveCreditCardOptionNotPresent = $assertSaveCreditCardOptionNotPresent;
         $this->payment = $payment;
-        $this->isVaultEnabled = $isVaultEnabled;
+        $this->isVaultPresent = $isVaultPresent;
     }
 
     /**
@@ -67,7 +67,7 @@ class CheckSaveCreditCardOptionStep implements TestStepInterface
      */
     public function run()
     {
-        if ($this->isVaultEnabled === false) {
+        if ($this->isVaultPresent === false) {
             $this->assertSaveCreditCardOptionNotPresent->processAssert(
                 $this->checkoutOnepage,
                 $this->payment['method']
diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Vault/Test/etc/testcase.xml
index 6289a8392ee7544777959e8afffe9fd999388713..ee55d7ef5ba905973cbbfb38effab1ccc7f750e0 100644
--- a/dev/tests/functional/tests/app/Magento/Vault/Test/etc/testcase.xml
+++ b/dev/tests/functional/tests/app/Magento/Vault/Test/etc/testcase.xml
@@ -56,7 +56,8 @@
         <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" />
         <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" />
         <step name="fillShippingMethod" module="Magento_Checkout" next="selectPaymentMethod" />
-        <step name="selectPaymentMethod" module="Magento_Checkout" next="fillBillingInformation" />
+        <step name="selectPaymentMethod" module="Magento_Checkout" next="checkSaveCreditCardOption" />
+        <step name="checkSaveCreditCardOption" module="Magento_Vault" next="fillBillingInformation" />
         <step name="fillBillingInformation" module="Magento_Checkout" next="placeOrder" />
         <step name="placeOrder" module="Magento_Checkout" next="openOrder" />
         <step name="openOrder" module="Magento_Sales" next="reorder" />
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ProcessorTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ProcessorTest.php
index 9c9e564939070e99b097477a221f445811a25ef1..ae954fdc7cfbb7bdc7c66dfb4ab9a25e977e8fae 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ProcessorTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Gallery/ProcessorTest.php
@@ -146,15 +146,15 @@ class ProcessorTest extends \PHPUnit_Framework_TestCase
         );
         $product->setData(['image' => 'test1', 'small_image' => 'test2', 'thumbnail' => 'test3']);
 
-        $this->assertNotEmpty($product->getData('image'));
+        $this->assertNotEquals('no_selection', $product->getData('image'));
         $this->_model->clearMediaAttribute($product, 'image');
-        $this->assertNull($product->getData('image'));
+        $this->assertEquals('no_selection', $product->getData('image'));
 
-        $this->assertNotEmpty($product->getData('small_image'));
-        $this->assertNotEmpty($product->getData('thumbnail'));
+        $this->assertNotEquals('no_selection', $product->getData('small_image'));
+        $this->assertNotEquals('no_selection', $product->getData('thumbnail'));
         $this->_model->clearMediaAttribute($product, ['small_image', 'thumbnail']);
-        $this->assertNull($product->getData('small_image'));
-        $this->assertNull($product->getData('thumbnail'));
+        $this->assertEquals('no_selection', $product->getData('small_image'));
+        $this->assertEquals('no_selection', $product->getData('thumbnail'));
     }
 
     public function testSetMediaAttribute()
diff --git a/dev/tests/integration/testsuite/Magento/Directory/Model/ObserverTest.php b/dev/tests/integration/testsuite/Magento/Directory/Model/ObserverTest.php
index 389fd4b253eb7c8e8a89237f1b7a20be9aa777fe..95fd6110bb432e72daa2af66d7b65f7abbdb3d0f 100644
--- a/dev/tests/integration/testsuite/Magento/Directory/Model/ObserverTest.php
+++ b/dev/tests/integration/testsuite/Magento/Directory/Model/ObserverTest.php
@@ -62,12 +62,12 @@ class ObserverTest extends \PHPUnit_Framework_TestCase
     {
         //skipping test if service is unavailable
         $url = str_replace('{{CURRENCY_FROM}}', 'USD',
-            \Magento\Directory\Model\Currency\Import\Webservicex::CURRENCY_CONVERTER_URL
+            \Magento\Directory\Model\Currency\Import\Webservicex::CURRENCY_CONVERTER_URL
         );
         $url = str_replace('{{CURRENCY_TO}}', 'GBP', $url);
         try {
             file_get_contents($url);
-        } catch (\PHPUnit_Framework_Error_Warning $e) {
+        } catch (\PHPUnit_Framework_Exception $e) {
             $this->markTestSkipped('http://www.webservicex.net is unavailable ');
         }