diff --git a/js/civicrm_stripe.js b/js/civicrm_stripe.js
index 4d31ae9d3ed10385a158d1d43d07b0297e7e6915..fc450014dd6e1efa7853a8fb27233e4452708ff9 100644
--- a/js/civicrm_stripe.js
+++ b/js/civicrm_stripe.js
@@ -35,8 +35,7 @@ CRM.$(function($) {
         checkAndLoad();
       }
     }
-    debugging('reload completed.');
-    $(form).trigger('crmBillingFormReloadComplete');
+    triggerEvent('crmBillingFormReloadComplete');
   };
   // On initial run we need to call this now.
   window.civicrmStripeHandleReload();
@@ -76,6 +75,7 @@ CRM.$(function($) {
     for (i = 0; i < submitButtons.length; ++i) {
       submitButtons[i].removeAttribute('disabled');
     }
+    triggerEvent('crmBillingFormNotValid');
   }
 
   function handleCardPayment() {
@@ -340,7 +340,7 @@ CRM.$(function($) {
         $('div#card-errors').hide();
         document.querySelector('#billing-payment-block').scrollIntoView();
         window.scrollBy(0, -50);
-        $(form).trigger('crmBillingFormNotValid');
+        triggerEvent('crmBillingFormNotValid');
         return false;
       }
 
@@ -628,6 +628,11 @@ CRM.$(function($) {
     }
   }
 
+  function triggerEvent(event) {
+    debugging('Firing Event: ' + event);
+    $(form).trigger(event);
+  }
+
   function addDrupalWebformActionElement(submitAction) {
     var hiddenInput = null;
     if (document.getElementById('action') !== null) {
diff --git a/js/civicrm_stripe.min.js b/js/civicrm_stripe.min.js
index 5ef7055d9c9d364a6e9567be9f7e39c13858be42..f02fb4bf680980b2e89d088ca4617ef98f3469a3 100644
--- a/js/civicrm_stripe.min.js
+++ b/js/civicrm_stripe.min.js
@@ -1 +1 @@
-CRM.$(function(d){g("civicrm_stripe loaded, dom-ready function firing.");if(window.civicrmStripeHandleReload){g("calling existing civicrmStripeHandleReload.");window.civicrmStripeHandleReload();return}var s;var b;var c;var w;var q=false;window.onbeforeunload=null;window.civicrmStripeHandleReload=function(){g("civicrmStripeHandleReload");var D=document.getElementById("card-element");if((typeof D!=="undefined")&&(D)){if(!D.children.length){g("checkAndLoad from document.ready");o()}}g("reload completed.");d(c).trigger("crmBillingFormReloadComplete")};window.civicrmStripeHandleReload();function x(F,D){g(F+": success - submitting form");var E=document.createElement("input");E.setAttribute("type","hidden");E.setAttribute("name",F);E.setAttribute("value",D.id);c.appendChild(E);c.submit()}function r(){for(i=0;i<w.length;++i){w[i].setAttribute("disabled",true)}return c.submit()}function j(E){g("error: "+E.message);var D=document.getElementById("card-errors");D.style.display="block";D.textContent=E.message;document.querySelector("#billing-payment-block").scrollIntoView();window.scrollBy(0,-50);c.dataset.submitted=false;for(i=0;i<w.length;++i){w[i].removeAttribute("disabled")}}function B(){g("handle card payment");s.createPaymentMethod("card",b).then(function(D){if(D.error){j(D.error)}else{if(h()||a()){x("paymentMethodID",D.paymentMethod)}else{var E=CRM.url("civicrm/stripe/confirm-payment");d.post(E,{payment_method_id:D.paymentMethod.id,amount:t().toFixed(2),currency:CRM.vars.stripe.currency,id:CRM.vars.stripe.id,description:document.title,csrfToken:CRM.vars.stripe.csrfToken}).then(function(F){y(F)})}}})}function y(D){g("handleServerResponse");if(D.error){j(D.error)}else{if(D.requires_action){u(D)}else{x("paymentIntentID",D.paymentIntent)}}}function u(D){s.handleCardAction(D.payment_intent_client_secret).then(function(E){if(E.error){j(E.error)}else{x("paymentIntentID",E.paymentIntent)}})}d(document).ajaxComplete(function(F,G,E){if((E.url.match("civicrm(/|%2F)payment(/|%2F)form")!==null)||(E.url.match("civicrm(/|%2F)contact(/|%2F)view(/|%2F)participant")!==null)){if(typeof CRM.vars.stripe==="undefined"){return}var D=m();if(D!==null){if(D!==parseInt(CRM.vars.stripe.id)){g("payment processor changed to id: "+D);if(D===0){return n()}CRM.api3("PaymentProcessor","getvalue",{"return":"user_name",id:D,payment_processor_type_id:CRM.vars.stripe.paymentProcessorTypeID}).done(function(H){var I=H.result;if(I){g("Setting new stripe key to: "+I);CRM.vars.stripe.publishableKey=I}else{return n()}g("checkAndLoad from ajaxComplete");o()})}}}});function n(){g("New payment processor is not Stripe, clearing CRM.vars.stripe");if((typeof b!=="undefined")&&(b)){g("destroying card element");b.destroy();b=undefined}delete (CRM.vars.stripe)}function o(){if(typeof CRM.vars.stripe==="undefined"){g("CRM.vars.stripe not defined! Not a Stripe processor?");return}if(typeof Stripe==="undefined"){if(q){return}q=true;g("Stripe.js is not loaded!");d.getScript("https://js.stripe.com/v3",function(){g("Script loaded and executed.");q=false;f()})}else{f()}}function f(){g("loadStripeBillingBlock");if(typeof s==="undefined"){s=Stripe(CRM.vars.stripe.publishableKey)}var K=s.elements({locale:CRM.vars.stripe.locale});var H={base:{fontSize:"20px"}};var E=document.getElementById("billing_postal_code-"+CRM.vars.stripe.billingAddressID).value;g("existing postcode: "+E);b=K.create("card",{style:H,value:{postalCode:E}});b.mount("#card-element");g("created new card element",b);if(document.getElementById("billing_postal_code-5").value){document.getElementById("billing_postal_code-5").setAttribute("disabled",true)}else{document.getElementsByClassName("billing_postal_code-"+CRM.vars.stripe.billingAddressID+"-section")[0].setAttribute("hidden",true)}b.addEventListener("change",function(L){k(L)});c=l();if(typeof c.length==="undefined"||c.length===0){g("No billing form!");return}e();w=C();c.dataset.submitdontprocess=false;var D=c.querySelectorAll('[type="submit"][formnovalidate="1"], [type="submit"][formnovalidate="formnovalidate"], [type="submit"].cancel, [type="submit"].webform-previous'),G;for(G=0;G<D.length;++G){D[G].addEventListener("click",J())}function J(){g("adding submitdontprocess");c.dataset.submitdontprocess=true}for(G=0;G<w.length;++G){w[G].addEventListener("click",F)}function F(L){if(c.dataset.submitted===true){return}c.dataset.submitted=true;if(typeof CRM.vars.stripe==="undefined"){return r()}g("clearing submitdontprocess");c.dataset.submitdontprocess=false;return I(L)}for(G=0;G<w.length;++G){w[G].removeAttribute("onclick")}p();if(A()){d("[type=submit]").click(function(){v(this.value)});c.addEventListener("keydown",function(L){if(L.keyCode===13){v(this.value);I(event)}});d("#billingcheckbox:input").hide();d('label[for="billingcheckbox"]').hide()}function I(N){N.preventDefault();g("submit handler");if(d(c).valid()===false){g("Form not valid");d("div#card-errors").hide();document.querySelector("#billing-payment-block").scrollIntoView();window.scrollBy(0,-50);d(c).trigger("crmBillingFormNotValid");return false}if(typeof CRM.vars.stripe==="undefined"){g("Submitting - not a stripe processor");return true}if(c.dataset.submitted===true){g("form already submitted");return false}var P=parseInt(CRM.vars.stripe.id);var M=null;if(A()){if(!d('input[name="submitted[civicrm_1_contribution_1_contribution_payment_processor_id]"]').length){M=P}else{M=parseInt(c.querySelector('input[name="submitted[civicrm_1_contribution_1_contribution_payment_processor_id]"]:checked').value)}}else{if((c.querySelector(".crm-section.payment_processor-section")!==null)||(c.querySelector(".crm-section.credit_card_info-section")!==null)){P=CRM.vars.stripe.id;if(c.querySelector('input[name="payment_processor_id"]:checked')!==null){M=parseInt(c.querySelector('input[name="payment_processor_id"]:checked').value)}}}if((M===0)||(P===null)||((M===null)&&(P===null))){g("Not a Stripe transaction, or pay-later");return r()}else{g("Stripe is the selected payprocessor")}if(typeof CRM.vars.stripe.publishableKey==="undefined"){g("submit missing stripe-pub-key element or value");return true}if(c.dataset.submitdontprocess===true){g("non-payment submit detected - not submitting payment");return true}if(A()){if(d("#billing-payment-block").is(":hidden")){g("no payment processor on webform");return true}var O=d('[name="submitted[civicrm_1_contribution_1_contribution_payment_processor_id]"]');if(O.length){if(O.filter(":checked").val()==="0"||O.filter(":checked").val()===0){g("no payment processor selected");return true}}}var L=t();if(L===0){g("Total amount is 0");return r()}if(c.dataset.submitted===true){alert("Form already submitted. Please wait.");return false}else{c.dataset.submitted=true}for(G=0;G<w.length;++G){w[G].setAttribute("disabled",true)}B();return true}}function A(){if(c!==null){return c.classList.contains("webform-client-form")||c.classList.contains("webform-submission-form")}return false}function l(){var D=d("div#card-element").closest("form").prop("id");if((typeof D==="undefined")||(!D.length)){D=d("input[name=hidden_processor]").closest("form").prop("id")}return document.getElementById(D)}function C(){var D=null;if(A()){D=c.querySelectorAll('[type="submit"].webform-submit');if(!D){D=c.querySelectorAll('[type="submit"].webform-button--submit')}}else{D=c.querySelectorAll('[type="submit"].validate')}return D}function t(){var D=0;if(a()){D=null}else{if(document.getElementById("totalTaxAmount")!==null){D=parseFloat(z());g("Calculated amount using internal calculateTaxAmount()")}else{if(typeof calculateTotalFee=="function"){D=parseFloat(calculateTotalFee())}else{if(A()){d(".line-item:visible","#wf-crm-billing-items").each(function(){D+=parseFloat(d(this).data("amount"))})}else{if(document.getElementById("total_amount")){D=parseFloat(document.getElementById("total_amount").value)}}}}}g("getTotalAmount: "+D);return D}function z(){var D=0;if(document.getElementById("totalTaxAmount")===null){return D}if(document.getElementById("totalTaxAmount").textContent.length===0){D=document.getElementById("total_amount").value}else{D=document.getElementById("totalTaxAmount").textContent.split(" ").pop()}return D}function h(){var D=false;if(A()){if(d('input[id$="contribution-installments"]').length!==0&&d('input[id$="contribution-installments"]').val()>1){D=true}}if(document.getElementById("is_recur")!==null){if(document.getElementById("is_recur").type=="hidden"){D=(document.getElementById("is_recur").value==1)}else{D=Boolean(document.getElementById("is_recur").checked)}}else{if(d('input[name="auto_renew"]').length!==0){if(d('input[name="auto_renew"]').prop("checked")){D=true}else{if(document.getElementById("auto_renew").type=="hidden"){D=(document.getElementById("auto_renew").value==1)}else{D=Boolean(document.getElementById("auto_renew").checked)}}}}g("isRecur is "+D);return D}function k(E){if(E.empty){d("div#card-errors").hide()}else{if(E.error){j(E.error)}else{if(E.complete){d("div#card-errors").hide();var D=document.getElementById("billing_postal_code-"+CRM.vars.stripe.billingAddressID);if(D){D.value=E.value.postalCode}}}}}function p(){cividiscountElements=c.querySelectorAll("input#discountcode");var D=function(E){if(E.keyCode===13){E.preventDefault();g("adding submitdontprocess");c.dataset.submitdontprocess=true}};for(i=0;i<cividiscountElements.length;++i){cividiscountElements[i].addEventListener("keydown",D)}}function e(){d("div.label span.crm-marker").each(function(){d(this).closest("div").next("div").find("input").addClass("required")});var D=d(c).validate();D.settings.errorClass="crm-inline-error alert alert-danger";D.settings.ignore=".select2-offscreen, [readonly], :hidden:not(.crm-select2)"}function a(){if((document.getElementById("additional_participants")!==null)&&(document.getElementById("additional_participants").value.length!==0)){g("We don't know the final price - registering additional participants");return true}return false}function g(D){if((typeof(CRM.vars.stripe)==="undefined")||(Boolean(CRM.vars.stripe.jsDebug)===true)){console.log(new Date().toISOString()+" civicrm_stripe.js: "+D)}}function v(E){var D=null;if(document.getElementById("action")!==null){D=document.getElementById("action")}else{D=document.createElement("input")}D.setAttribute("type","hidden");D.setAttribute("name","op");D.setAttribute("id","action");D.setAttribute("value",E);c.appendChild(D)}function m(){if((typeof c==="undefined")||(!c)){c=l();if(!c){return null}}var D=c.querySelector('input[name="payment_processor_id"]:checked');if(D!==null){return parseInt(D.value)}return null}});
\ No newline at end of file
+CRM.$(function(e){h("civicrm_stripe loaded, dom-ready function firing.");if(window.civicrmStripeHandleReload){h("calling existing civicrmStripeHandleReload.");window.civicrmStripeHandleReload();return}var t;var b;var c;var x;var r=false;window.onbeforeunload=null;window.civicrmStripeHandleReload=function(){h("civicrmStripeHandleReload");var E=document.getElementById("card-element");if((typeof E!=="undefined")&&(E)){if(!E.children.length){h("checkAndLoad from document.ready");p()}}d("crmBillingFormReloadComplete")};window.civicrmStripeHandleReload();function y(G,E){h(G+": success - submitting form");var F=document.createElement("input");F.setAttribute("type","hidden");F.setAttribute("name",G);F.setAttribute("value",E.id);c.appendChild(F);c.submit()}function s(){for(i=0;i<x.length;++i){x[i].setAttribute("disabled",true)}return c.submit()}function k(F){h("error: "+F.message);var E=document.getElementById("card-errors");E.style.display="block";E.textContent=F.message;document.querySelector("#billing-payment-block").scrollIntoView();window.scrollBy(0,-50);c.dataset.submitted=false;for(i=0;i<x.length;++i){x[i].removeAttribute("disabled")}d("crmBillingFormNotValid")}function C(){h("handle card payment");t.createPaymentMethod("card",b).then(function(E){if(E.error){k(E.error)}else{if(j()||a()){y("paymentMethodID",E.paymentMethod)}else{var F=CRM.url("civicrm/stripe/confirm-payment");e.post(F,{payment_method_id:E.paymentMethod.id,amount:u().toFixed(2),currency:CRM.vars.stripe.currency,id:CRM.vars.stripe.id,description:document.title,csrfToken:CRM.vars.stripe.csrfToken}).then(function(G){z(G)})}}})}function z(E){h("handleServerResponse");if(E.error){k(E.error)}else{if(E.requires_action){v(E)}else{y("paymentIntentID",E.paymentIntent)}}}function v(E){t.handleCardAction(E.payment_intent_client_secret).then(function(F){if(F.error){k(F.error)}else{y("paymentIntentID",F.paymentIntent)}})}e(document).ajaxComplete(function(G,H,F){if((F.url.match("civicrm(/|%2F)payment(/|%2F)form")!==null)||(F.url.match("civicrm(/|%2F)contact(/|%2F)view(/|%2F)participant")!==null)){if(typeof CRM.vars.stripe==="undefined"){return}var E=n();if(E!==null){if(E!==parseInt(CRM.vars.stripe.id)){h("payment processor changed to id: "+E);if(E===0){return o()}CRM.api3("PaymentProcessor","getvalue",{"return":"user_name",id:E,payment_processor_type_id:CRM.vars.stripe.paymentProcessorTypeID}).done(function(I){var J=I.result;if(J){h("Setting new stripe key to: "+J);CRM.vars.stripe.publishableKey=J}else{return o()}h("checkAndLoad from ajaxComplete");p()})}}}});function o(){h("New payment processor is not Stripe, clearing CRM.vars.stripe");if((typeof b!=="undefined")&&(b)){h("destroying card element");b.destroy();b=undefined}delete (CRM.vars.stripe)}function p(){if(typeof CRM.vars.stripe==="undefined"){h("CRM.vars.stripe not defined! Not a Stripe processor?");return}if(typeof Stripe==="undefined"){if(r){return}r=true;h("Stripe.js is not loaded!");e.getScript("https://js.stripe.com/v3",function(){h("Script loaded and executed.");r=false;g()})}else{g()}}function g(){h("loadStripeBillingBlock");if(typeof t==="undefined"){t=Stripe(CRM.vars.stripe.publishableKey)}var L=t.elements({locale:CRM.vars.stripe.locale});var I={base:{fontSize:"20px"}};var F=document.getElementById("billing_postal_code-"+CRM.vars.stripe.billingAddressID).value;h("existing postcode: "+F);b=L.create("card",{style:I,value:{postalCode:F}});b.mount("#card-element");h("created new card element",b);if(document.getElementById("billing_postal_code-5").value){document.getElementById("billing_postal_code-5").setAttribute("disabled",true)}else{document.getElementsByClassName("billing_postal_code-"+CRM.vars.stripe.billingAddressID+"-section")[0].setAttribute("hidden",true)}b.addEventListener("change",function(M){l(M)});c=m();if(typeof c.length==="undefined"||c.length===0){h("No billing form!");return}f();x=D();c.dataset.submitdontprocess=false;var E=c.querySelectorAll('[type="submit"][formnovalidate="1"], [type="submit"][formnovalidate="formnovalidate"], [type="submit"].cancel, [type="submit"].webform-previous'),H;for(H=0;H<E.length;++H){E[H].addEventListener("click",K())}function K(){h("adding submitdontprocess");c.dataset.submitdontprocess=true}for(H=0;H<x.length;++H){x[H].addEventListener("click",G)}function G(M){if(c.dataset.submitted===true){return}c.dataset.submitted=true;if(typeof CRM.vars.stripe==="undefined"){return s()}h("clearing submitdontprocess");c.dataset.submitdontprocess=false;return J(M)}for(H=0;H<x.length;++H){x[H].removeAttribute("onclick")}q();if(B()){e("[type=submit]").click(function(){w(this.value)});c.addEventListener("keydown",function(M){if(M.keyCode===13){w(this.value);J(event)}});e("#billingcheckbox:input").hide();e('label[for="billingcheckbox"]').hide()}function J(O){O.preventDefault();h("submit handler");if(e(c).valid()===false){h("Form not valid");e("div#card-errors").hide();document.querySelector("#billing-payment-block").scrollIntoView();window.scrollBy(0,-50);d("crmBillingFormNotValid");return false}if(typeof CRM.vars.stripe==="undefined"){h("Submitting - not a stripe processor");return true}if(c.dataset.submitted===true){h("form already submitted");return false}var Q=parseInt(CRM.vars.stripe.id);var N=null;if(B()){if(!e('input[name="submitted[civicrm_1_contribution_1_contribution_payment_processor_id]"]').length){N=Q}else{N=parseInt(c.querySelector('input[name="submitted[civicrm_1_contribution_1_contribution_payment_processor_id]"]:checked').value)}}else{if((c.querySelector(".crm-section.payment_processor-section")!==null)||(c.querySelector(".crm-section.credit_card_info-section")!==null)){Q=CRM.vars.stripe.id;if(c.querySelector('input[name="payment_processor_id"]:checked')!==null){N=parseInt(c.querySelector('input[name="payment_processor_id"]:checked').value)}}}if((N===0)||(Q===null)||((N===null)&&(Q===null))){h("Not a Stripe transaction, or pay-later");return s()}else{h("Stripe is the selected payprocessor")}if(typeof CRM.vars.stripe.publishableKey==="undefined"){h("submit missing stripe-pub-key element or value");return true}if(c.dataset.submitdontprocess===true){h("non-payment submit detected - not submitting payment");return true}if(B()){if(e("#billing-payment-block").is(":hidden")){h("no payment processor on webform");return true}var P=e('[name="submitted[civicrm_1_contribution_1_contribution_payment_processor_id]"]');if(P.length){if(P.filter(":checked").val()==="0"||P.filter(":checked").val()===0){h("no payment processor selected");return true}}}var M=u();if(M===0){h("Total amount is 0");return s()}if(c.dataset.submitted===true){alert("Form already submitted. Please wait.");return false}else{c.dataset.submitted=true}for(H=0;H<x.length;++H){x[H].setAttribute("disabled",true)}C();return true}}function B(){if(c!==null){return c.classList.contains("webform-client-form")||c.classList.contains("webform-submission-form")}return false}function m(){var E=e("div#card-element").closest("form").prop("id");if((typeof E==="undefined")||(!E.length)){E=e("input[name=hidden_processor]").closest("form").prop("id")}return document.getElementById(E)}function D(){var E=null;if(B()){E=c.querySelectorAll('[type="submit"].webform-submit');if(!E){E=c.querySelectorAll('[type="submit"].webform-button--submit')}}else{E=c.querySelectorAll('[type="submit"].validate')}return E}function u(){var E=0;if(a()){E=null}else{if(document.getElementById("totalTaxAmount")!==null){E=parseFloat(A());h("Calculated amount using internal calculateTaxAmount()")}else{if(typeof calculateTotalFee=="function"){E=parseFloat(calculateTotalFee())}else{if(B()){e(".line-item:visible","#wf-crm-billing-items").each(function(){E+=parseFloat(e(this).data("amount"))})}else{if(document.getElementById("total_amount")){E=parseFloat(document.getElementById("total_amount").value)}}}}}h("getTotalAmount: "+E);return E}function A(){var E=0;if(document.getElementById("totalTaxAmount")===null){return E}if(document.getElementById("totalTaxAmount").textContent.length===0){E=document.getElementById("total_amount").value}else{E=document.getElementById("totalTaxAmount").textContent.split(" ").pop()}return E}function j(){var E=false;if(B()){if(e('input[id$="contribution-installments"]').length!==0&&e('input[id$="contribution-installments"]').val()>1){E=true}}if(document.getElementById("is_recur")!==null){if(document.getElementById("is_recur").type=="hidden"){E=(document.getElementById("is_recur").value==1)}else{E=Boolean(document.getElementById("is_recur").checked)}}else{if(e('input[name="auto_renew"]').length!==0){if(e('input[name="auto_renew"]').prop("checked")){E=true}else{if(document.getElementById("auto_renew").type=="hidden"){E=(document.getElementById("auto_renew").value==1)}else{E=Boolean(document.getElementById("auto_renew").checked)}}}}h("isRecur is "+E);return E}function l(F){if(F.empty){e("div#card-errors").hide()}else{if(F.error){k(F.error)}else{if(F.complete){e("div#card-errors").hide();var E=document.getElementById("billing_postal_code-"+CRM.vars.stripe.billingAddressID);if(E){E.value=F.value.postalCode}}}}}function q(){cividiscountElements=c.querySelectorAll("input#discountcode");var E=function(F){if(F.keyCode===13){F.preventDefault();h("adding submitdontprocess");c.dataset.submitdontprocess=true}};for(i=0;i<cividiscountElements.length;++i){cividiscountElements[i].addEventListener("keydown",E)}}function f(){e("div.label span.crm-marker").each(function(){e(this).closest("div").next("div").find("input").addClass("required")});var E=e(c).validate();E.settings.errorClass="crm-inline-error alert alert-danger";E.settings.ignore=".select2-offscreen, [readonly], :hidden:not(.crm-select2)"}function a(){if((document.getElementById("additional_participants")!==null)&&(document.getElementById("additional_participants").value.length!==0)){h("We don't know the final price - registering additional participants");return true}return false}function h(E){if((typeof(CRM.vars.stripe)==="undefined")||(Boolean(CRM.vars.stripe.jsDebug)===true)){console.log(new Date().toISOString()+" civicrm_stripe.js: "+E)}}function d(E){h("Firing Event: "+E);e(c).trigger(E)}function w(F){var E=null;if(document.getElementById("action")!==null){E=document.getElementById("action")}else{E=document.createElement("input")}E.setAttribute("type","hidden");E.setAttribute("name","op");E.setAttribute("id","action");E.setAttribute("value",F);c.appendChild(E)}function n(){if((typeof c==="undefined")||(!c)){c=m();if(!c){return null}}var E=c.querySelector('input[name="payment_processor_id"]:checked');if(E!==null){return parseInt(E.value)}return null}});
\ No newline at end of file