diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js b/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js
index 2ca86001d726002b81df9f2c6adc83bac7443080..5f6dbfed0b8daf38953cd4d3b389fbe5668de728 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/billing-address.js
@@ -18,7 +18,8 @@ define(
     function (ko, Component, customer, addressList, quote, createBillingAddress, selectBillingAddress, $t) {
         "use strict";
 
-        var newAddressOption = {
+        var lastSelectedBillingAddress = null,
+            newAddressOption = {
             getAddressInline: function() {
                 return $t('New Address');
             },
@@ -71,6 +72,8 @@ define(
                     selectBillingAddress(quote.shippingAddress());
                     this.isAddressDetailsVisible(true);
                 } else {
+                    lastSelectedBillingAddress = quote.billingAddress();
+                    quote.billingAddress(null);
                     this.isAddressDetailsVisible(false);
                 }
                 return true;
@@ -97,10 +100,13 @@ define(
             },
 
             editAddress: function () {
+                lastSelectedBillingAddress = quote.billingAddress();
+                quote.billingAddress(null);
                 this.isAddressDetailsVisible(false);
             },
 
             cancelAddressEdit: function () {
+                this.restoreBillingAddress();
                 if (quote.billingAddress()) {
                     // restore 'Same As Shipping' checkbox state
                     this.isAddressSameAsShipping(
@@ -110,6 +116,12 @@ define(
                 }
             },
 
+            restoreBillingAddress: function() {
+                if (lastSelectedBillingAddress != null) {
+                    selectBillingAddress(lastSelectedBillingAddress);
+                }
+            },
+
             onAddressChange: function (address) {
                 this.isAddressFormVisible(address == newAddressOption);
             }
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js b/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js
index 7fa9e10b69a781d1f9afc86bc79ae7cc39c388d7..1734a79d09f5490d746e13a4d60eb524ba60f664 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/view/payment/default.js
@@ -17,6 +17,7 @@ define(
         'use strict';
         return Component.extend({
             redirectAfterPlaceOrder: true,
+            isPlaceOrderActionAllowed: ko.observable(true),
             /**
              * Initialize view.
              *
@@ -24,6 +25,11 @@ define(
              */
             initialize: function () {
                 this._super().initChildren();
+
+                quote.billingAddress.subscribe(function(address) {
+                    this.isPlaceOrderActionAllowed((address !== null));
+                }, this);
+
                 return this;
             },
 
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html
index dfcbf3131970749bfec9ab0537c3ef12f689fae7..66cf873c311eb639b8ce0bfba6e43228c5cb915e 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/banktransfer.html
@@ -29,7 +29,12 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {'title': $t('Place Order')}, enable: (getCode() == isChecked())"
+                        data-bind="
+                        click: placeOrder,
+                        attr: {'title': $t('Place Order')},
+                        enable: (getCode() == isChecked()),
+                        css: {disabled: !isPlaceOrderActionAllowed()}
+                        "
                         disabled>
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html
index 569d5b0a48eb368622fee51306a8d9c30b075cf7..10287d8090d4129e8ddc02880e42c704354478d3 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/cashondelivery.html
@@ -29,7 +29,12 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {title: $t('Place Order')}, enable: (getCode() == isChecked())"
+                        data-bind="
+                        click: placeOrder,
+                        attr: {title: $t('Place Order')},
+                        enable: (getCode() == isChecked()),
+                        css: {disabled: !isPlaceOrderActionAllowed()}
+                        "
                         disabled>
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html
index 58f85845434792ab778b177461ac493a743d649d..ba6c374417b49b5477cf92a5c040e5c2ac732767 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/checkmo.html
@@ -41,7 +41,12 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {title: $t('Place Order')}, enable: (getCode() == isChecked())"
+                        data-bind="
+                        click: placeOrder,
+                        attr: {title: $t('Place Order')},
+                        css: {disabled: !isPlaceOrderActionAllowed()},
+                        enable: (getCode() == isChecked())
+                        "
                         disabled>
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
diff --git a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html
index 585d61feae7d7c7423285c3db12f5351adc2d385..ab531080cdfde2b2bc9173afc8e0e257033fce52 100644
--- a/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html
+++ b/app/code/Magento/OfflinePayments/view/frontend/web/template/payment/purchaseorder-form.html
@@ -49,7 +49,12 @@
                     <div class="primary">
                         <button class="action primary checkout"
                                 type="submit"
-                                data-bind="click: placeOrder, attr: {title: $t('Place Order')}, enable: (getCode() == isChecked())"
+                                data-bind="
+                                click: placeOrder,
+                                attr: {title: $t('Place Order')},
+                                enable: (getCode() == isChecked()),
+                                css: {disabled: !isPlaceOrderActionAllowed()}
+                                "
                                 data-role="review-save">
                             <span data-bind="text: $t('Place Order')"></span>
                         </button>
diff --git a/app/code/Magento/Payment/view/frontend/web/template/payment/free.html b/app/code/Magento/Payment/view/frontend/web/template/payment/free.html
index fb33eafd3cfbb59e8fffe9983692fe3d2fad1050..483920bbe980eb903a4fadaba0dca5695f3d8189 100644
--- a/app/code/Magento/Payment/view/frontend/web/template/payment/free.html
+++ b/app/code/Magento/Payment/view/frontend/web/template/payment/free.html
@@ -27,7 +27,11 @@
             <div class="primary">
                 <button class="action primary checkout"
                         type="submit"
-                        data-bind="click: placeOrder, attr: {title: $t('Place Order')}">
+                        data-bind="
+                        click: placeOrder,
+                        attr: {title: $t('Place Order')},
+                        css: {disabled: !isPlaceOrderActionAllowed()}
+                        ">
                     <span data-bind="text: $t('Place Order')"></span>
                 </button>
             </div>
diff --git a/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html b/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html
index 2fec488a491cb1787d622de53a3c4764c404c4c4..9e4d53bda7384775fecdc37eeecb63ba90664972 100644
--- a/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html
+++ b/app/code/Magento/Payment/view/frontend/web/template/payment/iframe.html
@@ -30,7 +30,9 @@
     <div class="primary">
         <button data-role="review-save" type="submit"
                 data-bind="attr: {title: $t('Place order')}"
-                class="button action primary checkout"><span data-bind="text: $t('Place order')"></span></button>
+                class="button action primary checkout">
+            <span data-bind="text: $t('Place order')"></span>
+        </button>
         <button type="submit" id="originalPlaceOrder" class="hidden"
                 data-bind="click: originalPlaceOrder($parents[1])"></button>
     </div>