diff --git a/app/code/Magento/Authorizenet/Model/Directpost.php b/app/code/Magento/Authorizenet/Model/Directpost.php
index d755cc71cce2b932f471e5148639b6e2b355db58..c4261e9581b82c92fec3505aae4180a1fe30011f 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost.php
@@ -119,6 +119,11 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
      */
     protected $transactionRepository;
 
+    /**
+     * @var \Psr\Log\LoggerInterface
+     */
+    private $psrLogger;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -761,7 +766,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
     {
         try {
             $transactionId = $this->getResponse()->getXTransId();
-            $data = $payment->getMethodInstance()->getTransactionDetails($transactionId);
+            $data = $this->transactionService->getTransactionDetails($this, $transactionId);
             $transactionStatus = (string)$data->transaction->transactionStatus;
             $fdsFilterAction = (string)$data->transaction->FDSFilterAction;
 
@@ -779,6 +784,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
                 $payment->getOrder()->addStatusHistoryComment($message);
             }
         } catch (\Exception $e) {
+            $this->getPsrLogger()->critical($e);
             //this request is optional
         }
         return $this;
@@ -805,7 +811,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
             $order->registerCancellation($message)->save();
         } catch (\Exception $e) {
             //quiet decline
-            $this->logger->critical($e);
+            $this->getPsrLogger()->critical($e);
         }
     }
 
@@ -973,4 +979,18 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
 
         return $response;
     }
+
+    /**
+     * @return \Psr\Log\LoggerInterface
+     *
+     * @deprecated
+     */
+    private function getPsrLogger()
+    {
+        if (null === $this->psrLogger) {
+            $this->psrLogger = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Psr\Log\LoggerInterface::class);
+        }
+        return $this->psrLogger;
+    }
 }
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js b/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js
index f88b11bf87a43e7b2feb4ec95fb3eafb6f69d056..2d142417ac099b023d2e715cbac026cfdada14e9 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/action/place-order.js
@@ -6,48 +6,31 @@ define(
     [
         'Magento_Checkout/js/model/quote',
         'Magento_Checkout/js/model/url-builder',
-        'mage/storage',
-        'Magento_Checkout/js/model/error-processor',
         'Magento_Customer/js/model/customer',
-        'Magento_Checkout/js/model/full-screen-loader'
+        'Magento_Checkout/js/model/place-order'
     ],
-    function (quote, urlBuilder, storage, errorProcessor, customer, fullScreenLoader) {
+    function (quote, urlBuilder, customer, placeOrderService) {
         'use strict';
 
         return function (paymentData, messageContainer) {
-            var serviceUrl,
-                payload;
+            var serviceUrl, payload;
 
-            /** Checkout for guest and registered customer. */
-            if (!customer.isLoggedIn()) {
+            payload = {
+                cartId: quote.getQuoteId(),
+                billingAddress: quote.billingAddress(),
+                paymentMethod: paymentData
+            };
+
+            if (customer.isLoggedIn()) {
+                serviceUrl = urlBuilder.createUrl('/carts/mine/payment-information', {});
+            } else {
                 serviceUrl = urlBuilder.createUrl('/guest-carts/:quoteId/payment-information', {
                     quoteId: quote.getQuoteId()
                 });
-                payload = {
-                    cartId: quote.getQuoteId(),
-                    email: quote.guestEmail,
-                    paymentMethod: paymentData,
-                    billingAddress: quote.billingAddress()
-                };
-            } else {
-                serviceUrl = urlBuilder.createUrl('/carts/mine/payment-information', {});
-                payload = {
-                    cartId: quote.getQuoteId(),
-                    paymentMethod: paymentData,
-                    billingAddress: quote.billingAddress()
-                };
+                payload.email = quote.guestEmail;
             }
 
-            fullScreenLoader.startLoader();
-
-            return storage.post(
-                serviceUrl, JSON.stringify(payload)
-            ).fail(
-                function (response) {
-                    errorProcessor.process(response, messageContainer);
-                    fullScreenLoader.stopLoader();
-                }
-            );
+            return placeOrderService(serviceUrl, payload, messageContainer);
         };
     }
 );
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js b/app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js
new file mode 100644
index 0000000000000000000000000000000000000000..68548cb1b28d3e2a4abe66c8be13c9dd48b73ec2
--- /dev/null
+++ b/app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js
@@ -0,0 +1,27 @@
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+define(
+    [
+        'mage/storage',
+        'Magento_Checkout/js/model/error-processor',
+        'Magento_Checkout/js/model/full-screen-loader'
+    ],
+    function (storage, errorProcessor, fullScreenLoader) {
+        'use strict';
+
+        return function (serviceUrl, payload, messageContainer) {
+            fullScreenLoader.startLoader();
+
+            return storage.post(
+                serviceUrl, JSON.stringify(payload)
+            ).fail(
+                function (response) {
+                    errorProcessor.process(response, messageContainer);
+                    fullScreenLoader.stopLoader();
+                }
+            );
+        };
+    }
+);
diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php
index b9725a98209599aac6fe187ded298d03a8070e97..8a626dd2d42b8cdd5af810d3dd64ef58d7055834 100644
--- a/app/code/Magento/Dhl/Model/Carrier.php
+++ b/app/code/Magento/Dhl/Model/Carrier.php
@@ -1123,9 +1123,8 @@ class Carrier extends \Magento\Dhl\Model\AbstractDhl implements \Magento\Shippin
                     throw new \Magento\Framework\Exception\LocalizedException($responseError);
                 }
                 $this->debugErrors($this->_errors);
-
-                return false;
             }
+            $result->append($this->getErrorMessage());
         }
 
         return $result;
diff --git a/app/code/Magento/Fedex/Model/Carrier.php b/app/code/Magento/Fedex/Model/Carrier.php
index c03d89e480c355c2e6abe3f1d9d1585e66a793a4..4cd95cb5b4ba9d3c433d311440b509ee93c6dd3e 100644
--- a/app/code/Magento/Fedex/Model/Carrier.php
+++ b/app/code/Magento/Fedex/Model/Carrier.php
@@ -501,7 +501,10 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C
         // make general request for all methods
         $response = $this->_doRatesRequest(self::RATE_REQUEST_GENERAL);
         $preparedGeneral = $this->_prepareRateResponse($response);
-        if (!$preparedGeneral->getError() || $this->_result->getError() && $preparedGeneral->getError()) {
+        if (!$preparedGeneral->getError()
+            || $this->_result->getError() && $preparedGeneral->getError()
+            || empty($this->_result->getAllRates())
+        ) {
             $this->_result->append($preparedGeneral);
         }
 
diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php
index a824adbd2bf82ed733841813ba42d72622bfdf39..04e149cae270e1ff5077e55ce0283f9a51066e82 100644
--- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php
+++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/PlaceOrder.php
@@ -62,15 +62,21 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress
      */
     public function execute()
     {
-        try {
-            if ($this->isValidationRequired() &&
-                !$this->agreementsValidator->isValid(array_keys($this->getRequest()->getPost('agreement', [])))
-            ) {
-                throw new \Magento\Framework\Exception\LocalizedException(
-                    __('Please agree to all the terms and conditions before placing the order.')
-                );
-            }
+        if ($this->isValidationRequired() &&
+            !$this->agreementsValidator->isValid(array_keys($this->getRequest()->getPost('agreement', [])))
+        ) {
+            $e = new \Magento\Framework\Exception\LocalizedException(
+                __('Please agree to all the terms and conditions before placing the order.')
+            );
+            $this->messageManager->addExceptionMessage(
+                $e,
+                $e->getMessage()
+            );
+            $this->_redirect('*/*/review');
+            return;
+        }
 
+        try {
             $this->_initCheckout();
             $this->_checkout->place($this->_initToken());
 
@@ -108,12 +114,6 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress
             return;
         } catch (ApiProcessableException $e) {
             $this->_processPaypalApiError($e);
-        } catch (\Magento\Framework\Exception\LocalizedException $e) {
-            $this->messageManager->addExceptionMessage(
-                $e,
-                $e->getMessage()
-            );
-            $this->_redirect('*/*/review');
         } catch (\Exception $e) {
             $this->messageManager->addExceptionMessage(
                 $e,
@@ -141,6 +141,9 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress
             case ApiProcessableException::API_DO_EXPRESS_CHECKOUT_FAIL:
                 $this->_redirectSameToken();
                 break;
+            case ApiProcessableException::API_ADDRESS_MATCH_FAIL:
+                $this->redirectToOrderReviewPageAndShowError($exception->getUserMessage());
+                break;
             case ApiProcessableException::API_UNABLE_TRANSACTION_COMPLETE:
                 if ($this->_config->getPaymentAction() == \Magento\Payment\Model\Method\AbstractMethod::ACTION_ORDER) {
                     $paypalTransactionData = $this->_getCheckoutSession()->getPaypalTransactionData();
@@ -182,6 +185,18 @@ class PlaceOrder extends \Magento\Paypal\Controller\Express\AbstractExpress
         $this->_redirect('checkout/cart');
     }
 
+    /**
+     * Redirect customer to the paypal order review page and show error message
+     *
+     * @param string $errorMessage
+     * @return void
+     */
+    private function redirectToOrderReviewPageAndShowError($errorMessage)
+    {
+        $this->messageManager->addErrorMessage($errorMessage);
+        $this->_redirect('*/*/review');
+    }
+
     /**
      * Return true if agreements validation required
      *
diff --git a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php
index 20c9b5f7fb08fbcd78fc46cfa7c2e8ebce3436a1..aef1f4aa87920d3dc1a801ff5ee47b2c33ff84c5 100644
--- a/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php
+++ b/app/code/Magento/Paypal/Controller/Express/AbstractExpress/Start.php
@@ -21,7 +21,6 @@ class Start extends GetToken
     public function execute()
     {
         try {
-
             $token = $this->getToken();
             if ($token === null) {
 
diff --git a/app/code/Magento/Paypal/Controller/Express/GetToken.php b/app/code/Magento/Paypal/Controller/Express/GetToken.php
index c96cdb420bb3aca6bacfe83a9eb281a574e37c39..a7c00bf1f38322c811422f3e4b26f84934ed8bfd 100644
--- a/app/code/Magento/Paypal/Controller/Express/GetToken.php
+++ b/app/code/Magento/Paypal/Controller/Express/GetToken.php
@@ -53,8 +53,9 @@ class GetToken extends AbstractExpress
             if ($token === null) {
                 $token = false;
             }
+            $url = $this->_checkout->getRedirectUrl();
             $this->_initToken($token);
-            $controllerResult->setData(['token' => $token]);
+            $controllerResult->setData(['url' => $url]);
         } catch (LocalizedException $exception) {
             $this->messageManager->addExceptionMessage(
                 $exception,
diff --git a/app/code/Magento/Paypal/Model/Api/Nvp.php b/app/code/Magento/Paypal/Model/Api/Nvp.php
index 521887b6c3c524e4f82fb348bfcc47d63f2db99e..d1cc47a06ff8ff89d4f1b0d95748184ad0244e4d 100644
--- a/app/code/Magento/Paypal/Model/Api/Nvp.php
+++ b/app/code/Magento/Paypal/Model/Api/Nvp.php
@@ -1288,9 +1288,10 @@ class Nvp extends \Magento\Paypal\Model\Api\AbstractApi
         $exceptionPhrase = __('PayPal gateway has rejected request. %1', $errorMessages);
 
         /** @var \Magento\Framework\Exception\LocalizedException $exception */
-        $exception = count($errors) == 1 && $this->_isProcessableError($errors[0]['code'])
+        $firstError = $errors[0]['code'];
+        $exception = $this->_isProcessableError($firstError)
             ? $this->_processableExceptionFactory->create(
-                ['phrase' => $exceptionPhrase, 'code' => $errors[0]['code']]
+                ['phrase' => $exceptionPhrase, 'code' => $firstError]
             )
             : $this->_frameworkExceptionFactory->create(
                 ['phrase' => $exceptionPhrase]
diff --git a/app/code/Magento/Paypal/Model/Api/ProcessableException.php b/app/code/Magento/Paypal/Model/Api/ProcessableException.php
index a44e9ae5f3e753ef8c8a2e99a1bf768de8f16bfb..2a7ce0f104203c1a2803e1d77314f3c04cefbf0e 100644
--- a/app/code/Magento/Paypal/Model/Api/ProcessableException.php
+++ b/app/code/Magento/Paypal/Model/Api/ProcessableException.php
@@ -25,6 +25,7 @@ class ProcessableException extends LocalizedException
     const API_COUNTRY_FILTER_DECLINE = 10537;
     const API_MAXIMUM_AMOUNT_FILTER_DECLINE = 10538;
     const API_OTHER_FILTER_DECLINE = 10539;
+    const API_ADDRESS_MATCH_FAIL = 10736;
     /**#@-*/
 
     /**
@@ -61,8 +62,13 @@ class ProcessableException extends LocalizedException
                     'I\'m sorry - but we are not able to complete your transaction. Please contact us so we can assist you.'
                 );
                 break;
+            case self::API_ADDRESS_MATCH_FAIL:
+                $message = __(
+                    'A match of the Shipping Address City, State, and Postal Code failed.'
+                );
+                break;
             default:
-                $message = __($this->getMessage());
+                $message = __('We can\'t place the order.');
                 break;
         }
         return $message;
diff --git a/app/code/Magento/Paypal/Model/Express.php b/app/code/Magento/Paypal/Model/Express.php
index 2464ef48498ce967dc6b074e695f4b685bfc3bd0..a10a2654bf529b63a70c07247bba9b9c154368d0 100644
--- a/app/code/Magento/Paypal/Model/Express.php
+++ b/app/code/Magento/Paypal/Model/Express.php
@@ -266,6 +266,7 @@ class Express extends \Magento\Payment\Model\Method\AbstractMethod
                 ApiProcessableException::API_COUNTRY_FILTER_DECLINE,
                 ApiProcessableException::API_MAXIMUM_AMOUNT_FILTER_DECLINE,
                 ApiProcessableException::API_OTHER_FILTER_DECLINE,
+                ApiProcessableException::API_ADDRESS_MATCH_FAIL,
             ]
         );
     }
diff --git a/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php b/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php
index 63c6d364e82f43bddcc14fe7595560e494aef7fc..c90431dc4dc5979136d5f274517af4efe7c67c21 100644
--- a/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php
+++ b/app/code/Magento/Paypal/Test/Unit/Model/Api/ProcessableExceptionTest.php
@@ -5,19 +5,16 @@
  */
 namespace Magento\Paypal\Test\Unit\Model\Api;
 
-use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Paypal\Model\Api\ProcessableException;
 
 class ProcessableExceptionTest extends \PHPUnit_Framework_TestCase
 {
-    /**
-     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
-     */
-    protected $objectManager;
+    const UNKNOWN_CODE = 10411;
 
     /**
-     * @var \Magento\Paypal\Model\Api\ProcessableException
+     * @var ProcessableException
      */
-    protected $model;
+    private $model;
 
     /**
      * @param int $code
@@ -27,8 +24,7 @@ class ProcessableExceptionTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetUserMessage($code, $msg)
     {
-        $this->objectManager = new ObjectManager($this);
-        $this->model = new \Magento\Paypal\Model\Api\ProcessableException(__($msg), null, $code);
+        $this->model = new ProcessableException(__($msg), null, $code);
         $this->assertEquals($msg, $this->model->getUserMessage());
     }
 
@@ -39,28 +35,35 @@ class ProcessableExceptionTest extends \PHPUnit_Framework_TestCase
     {
         return [
             [
-                10001,
+                ProcessableException::API_INTERNAL_ERROR,
                 "I'm sorry - but we were not able to process your payment. "
                 . "Please try another payment method or contact us so we can assist you.",
             ],
             [
-                10417,
+                ProcessableException::API_UNABLE_PROCESS_PAYMENT_ERROR_CODE,
                 "I'm sorry - but we were not able to process your payment. "
                 . "Please try another payment method or contact us so we can assist you."
             ],
             [
-                10537,
+                ProcessableException::API_COUNTRY_FILTER_DECLINE,
                 "I'm sorry - but we are not able to complete your transaction. Please contact us so we can assist you."
             ],
             [
-                10538,
+                ProcessableException::API_MAXIMUM_AMOUNT_FILTER_DECLINE,
                 "I'm sorry - but we are not able to complete your transaction. Please contact us so we can assist you."
             ],
             [
-                10539,
+                ProcessableException::API_OTHER_FILTER_DECLINE,
                 "I'm sorry - but we are not able to complete your transaction. Please contact us so we can assist you."
             ],
-            [10411, "something went wrong"]
+            [
+                ProcessableException::API_ADDRESS_MATCH_FAIL,
+                'A match of the Shipping Address City, State, and Postal Code failed.'
+            ],
+            [
+                self::UNKNOWN_CODE,
+                "We can't place the order."
+            ]
         ];
     }
 }
diff --git a/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php b/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php
index 288b01bd05d399f3599158e686295044d250d767..75f4c14d8517e23b08dc59f46850ae63df5d4830 100644
--- a/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php
+++ b/app/code/Magento/Paypal/Test/Unit/Model/ExpressTest.php
@@ -22,6 +22,7 @@ class ExpressTest extends \PHPUnit_Framework_TestCase
         ApiProcessableException::API_COUNTRY_FILTER_DECLINE,
         ApiProcessableException::API_MAXIMUM_AMOUNT_FILTER_DECLINE,
         ApiProcessableException::API_OTHER_FILTER_DECLINE,
+        ApiProcessableException::API_ADDRESS_MATCH_FAIL
     ];
 
     /**
diff --git a/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js b/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js
index e2f70141de02218a46bf0222af200e503ac35170..d70de53581276d34886263558deb455f03a55094 100644
--- a/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js
+++ b/app/code/Magento/Paypal/view/frontend/web/js/in-context/express-checkout.js
@@ -42,8 +42,8 @@ define(
                             }
                         ).done(
                             function (response) {
-                                if (response && response.token) {
-                                    paypalExpressCheckout.checkout.startFlow(response.token);
+                                if (response && response.url) {
+                                    paypalExpressCheckout.checkout.startFlow(response.url);
 
                                     return;
                                 }
diff --git a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js
index 9d8ba97f26775ae95714cf8f15a2b892e6150fba..b95c0a7839a6dca8c21040c518192049e16611c5 100644
--- a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js
+++ b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/iframe-methods.js
@@ -50,6 +50,7 @@ define(
              */
             placePendingPaymentOrder: function () {
                 if (this.placeOrder()) {
+                    fullScreenLoader.startLoader();
                     this.isInAction(true);
                     // capture all click events
                     document.addEventListener('click', iframe.stopEventPropagation, true);
@@ -61,6 +62,7 @@ define(
                 return this._super()
                     .fail(
                         function () {
+                            fullScreenLoader.stopLoader();
                             self.isInAction(false);
                             document.removeEventListener('click', iframe.stopEventPropagation, true);
                         }
@@ -71,7 +73,15 @@ define(
              * After place order callback
              */
             afterPlaceOrder: function () {
+                if (this.iframeIsLoaded) {
+                    document.getElementById(this.getCode() + '-iframe')
+                        .contentWindow.location.reload();
+                }
+
                 this.paymentReady(true);
+                this.iframeIsLoaded = true;
+                this.isPlaceOrderActionAllowed(true);
+                fullScreenLoader.stopLoader();
             },
 
             /**
diff --git a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js
index d93e0ea702fca98fcd447cc5786a830fa0f8df52..7538d3a02aa9b76a769845f5f32d471d110a7983 100644
--- a/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js
+++ b/app/code/Magento/Paypal/view/frontend/web/js/view/payment/method-renderer/in-context/checkout-express.js
@@ -52,8 +52,8 @@ define(
                                         }
                                     ).done(
                                         function (response) {
-                                            if (response && response.token) {
-                                                paypalExpressCheckout.checkout.startFlow(response.token);
+                                            if (response && response.url) {
+                                                paypalExpressCheckout.checkout.startFlow(response.url);
 
                                                 return;
                                             }