From f074020670f471c5887d0473ecade353b3f92278 Mon Sep 17 00:00:00 2001
From: Kevin Cristiano <kcristiano@kcristiano.com>
Date: Thu, 7 May 2020 09:23:59 -0400
Subject: [PATCH] civicrm release

---
 civicrm.php                                   |   35 +-
 civicrm/CRM/ACL/BAO/ACL.php                   |   17 +-
 civicrm/CRM/ACL/DAO/ACLCache.php              |   10 +-
 civicrm/CRM/ACL/Page/ACL.php                  |   10 +-
 civicrm/CRM/ACL/Page/ACLBasic.php             |    2 +-
 civicrm/CRM/ACL/Page/EntityRole.php           |    2 +-
 civicrm/CRM/Activity/BAO/Activity.php         |   64 +-
 civicrm/CRM/Activity/BAO/ActivityType.php     |    4 +-
 civicrm/CRM/Activity/BAO/Query.php            |   43 +-
 civicrm/CRM/Activity/Form/Activity.php        |   72 +-
 civicrm/CRM/Activity/Form/ActivityView.php    |   10 +-
 civicrm/CRM/Activity/Form/Search.php          |    2 +-
 civicrm/CRM/Activity/Form/Task.php            |    2 +
 civicrm/CRM/Activity/Form/Task/Batch.php      |    2 +-
 civicrm/CRM/Activity/Form/Task/Email.php      |   45 +-
 civicrm/CRM/Activity/Import/Form/MapField.php |    2 +-
 .../CRM/Activity/Import/Parser/Activity.php   |    2 +-
 civicrm/CRM/Activity/Page/AJAX.php            |   26 +-
 civicrm/CRM/Activity/Selector/Search.php      |    6 +-
 civicrm/CRM/Activity/StateMachine/Search.php  |    2 +-
 civicrm/CRM/Admin/Form/MailSettings.php       |    2 +-
 civicrm/CRM/Admin/Form/MessageTemplates.php   |    4 +-
 civicrm/CRM/Admin/Form/Navigation.php         |    2 +-
 .../CRM/Admin/Form/ParticipantStatusType.php  |   16 +-
 .../CRM/Admin/Form/Preferences/Address.php    |    2 +-
 civicrm/CRM/Admin/Form/RelationshipType.php   |    6 +-
 civicrm/CRM/Admin/Form/ScheduleReminders.php  |   34 +-
 civicrm/CRM/Admin/Form/Setting/Smtp.php       |   21 +-
 civicrm/CRM/Admin/Form/SettingTrait.php       |    4 +-
 civicrm/CRM/Admin/Form/WordReplacements.php   |   10 +-
 civicrm/CRM/Admin/Page/AJAX.php               |    4 +-
 civicrm/CRM/Admin/Page/APIExplorer.php        |    4 +-
 civicrm/CRM/Admin/Page/EventTemplate.php      |    2 +-
 civicrm/CRM/Admin/Page/MailSettings.php       |    2 +-
 civicrm/CRM/Admin/Page/MessageTemplates.php   |    2 +-
 civicrm/CRM/Api4/Page/Api4Explorer.php        |   11 +-
 civicrm/CRM/Api4/Services.php                 |   11 +-
 civicrm/CRM/Badge/BAO/Badge.php               |    6 +-
 civicrm/CRM/Batch/BAO/Batch.php               |    8 +-
 civicrm/CRM/Batch/BAO/EntityBatch.php         |    4 +-
 civicrm/CRM/Batch/Form/Entry.php              |   22 +-
 civicrm/CRM/Campaign/BAO/Campaign.php         |   22 +-
 civicrm/CRM/Campaign/BAO/Query.php            |    6 +-
 civicrm/CRM/Campaign/BAO/Survey.php           |    2 +-
 civicrm/CRM/Campaign/Form/Gotv.php            |    2 +-
 .../CRM/Campaign/Form/Petition/Signature.php  |    4 +-
 civicrm/CRM/Campaign/Form/Search.php          |   10 +-
 civicrm/CRM/Campaign/Form/Search/Campaign.php |    4 +-
 civicrm/CRM/Campaign/Form/Search/Petition.php |    4 +-
 civicrm/CRM/Campaign/Form/Search/Survey.php   |    4 +-
 civicrm/CRM/Campaign/Form/Task.php            |    2 +-
 civicrm/CRM/Campaign/Form/Task/Interview.php  |   18 +-
 civicrm/CRM/Campaign/Form/Task/Reserve.php    |   14 +-
 civicrm/CRM/Campaign/Page/AJAX.php            |   24 +-
 civicrm/CRM/Campaign/Page/DashBoard.php       |   14 +-
 civicrm/CRM/Campaign/Selector/Search.php      |    4 +-
 civicrm/CRM/Campaign/StateMachine/Search.php  |    2 +-
 civicrm/CRM/Case/Audit/Audit.php              |   23 +-
 civicrm/CRM/Case/BAO/Case.php                 |   34 +-
 civicrm/CRM/Case/BAO/CaseType.php             |    2 +-
 civicrm/CRM/Case/BAO/Query.php                |    2 +-
 civicrm/CRM/Case/Form/Activity.php            |   24 +-
 .../Case/Form/Activity/ChangeCaseStatus.php   |    6 +-
 .../CRM/Case/Form/Activity/ChangeCaseType.php |   10 +-
 civicrm/CRM/Case/Form/Activity/LinkCases.php  |    6 +-
 civicrm/CRM/Case/Form/Activity/OpenCase.php   |    6 +-
 civicrm/CRM/Case/Form/CaseView.php            |    9 +-
 civicrm/CRM/Case/Form/Task/Batch.php          |    2 +-
 civicrm/CRM/Case/Page/AJAX.php                |    2 +-
 civicrm/CRM/Case/StateMachine/Search.php      |    2 +-
 civicrm/CRM/Case/XMLProcessor/Process.php     |   24 +-
 civicrm/CRM/Case/XMLProcessor/Report.php      |   29 +-
 civicrm/CRM/Case/XMLRepository.php            |    2 +-
 civicrm/CRM/Contact/BAO/Contact.php           |  198 +-
 civicrm/CRM/Contact/BAO/Contact/Location.php  |    2 +-
 civicrm/CRM/Contact/BAO/Contact/Utils.php     |   37 +-
 civicrm/CRM/Contact/BAO/ContactType.php       |    6 +-
 civicrm/CRM/Contact/BAO/Group.php             |   32 +-
 civicrm/CRM/Contact/BAO/GroupContactCache.php |   10 +-
 civicrm/CRM/Contact/BAO/Individual.php        |    2 +-
 civicrm/CRM/Contact/BAO/Query.php             |   84 +-
 civicrm/CRM/Contact/BAO/Relationship.php      |   29 +-
 civicrm/CRM/Contact/BAO/SavedSearch.php       |    8 +-
 civicrm/CRM/Contact/DAO/DashboardContact.php  |    6 +-
 civicrm/CRM/Contact/DAO/Factory.php           |    2 +-
 civicrm/CRM/Contact/Form/Contact.php          |  134 +-
 civicrm/CRM/Contact/Form/CustomData.php       |    2 +-
 civicrm/CRM/Contact/Form/DedupeRules.php      |    2 +-
 civicrm/CRM/Contact/Form/Edit/Address.php     |    8 +-
 civicrm/CRM/Contact/Form/Edit/CustomData.php  |    2 +-
 .../CRM/Contact/Form/Edit/TagsAndGroups.php   |    2 +-
 civicrm/CRM/Contact/Form/Merge.php            |    2 +-
 civicrm/CRM/Contact/Form/Relationship.php     |   14 +-
 civicrm/CRM/Contact/Form/Search.php           |   16 +-
 civicrm/CRM/Contact/Form/Search/Advanced.php  |    6 +-
 civicrm/CRM/Contact/Form/Search/Basic.php     |    2 +-
 civicrm/CRM/Contact/Form/Search/Builder.php   |    6 +-
 civicrm/CRM/Contact/Form/Search/Criteria.php  |    2 +-
 .../Form/Search/Custom/ContribSYBNT.php       |    6 +-
 .../Search/Custom/ContributionAggregate.php   |    4 +-
 .../Contact/Form/Search/Custom/FullText.php   |    6 +-
 .../CRM/Contact/Form/Search/Custom/Group.php  |    2 +-
 .../Form/Search/Custom/MultipleValues.php     |    6 +-
 .../Contact/Form/Search/Custom/PriceSet.php   |   41 +-
 .../Contact/Form/Search/Custom/Proximity.php  |    4 +-
 .../Form/Search/Custom/RandomSegment.php      |    6 +-
 .../Form/Search/Custom/TagContributions.php   |    2 +-
 civicrm/CRM/Contact/Form/Task.php             |    4 +-
 civicrm/CRM/Contact/Form/Task/AddToGroup.php  |    2 +-
 .../Contact/Form/Task/AlterPreferences.php    |    2 +-
 civicrm/CRM/Contact/Form/Task/Email.php       |   80 +-
 civicrm/CRM/Contact/Form/Task/EmailCommon.php |  185 +-
 civicrm/CRM/Contact/Form/Task/EmailTrait.php  |   95 +
 civicrm/CRM/Contact/Form/Task/Label.php       |    4 +-
 civicrm/CRM/Contact/Form/Task/LabelCommon.php |    2 +-
 civicrm/CRM/Contact/Form/Task/PDF.php         |    2 +-
 .../CRM/Contact/Form/Task/PDFLetterCommon.php |    4 +-
 civicrm/CRM/Contact/Form/Task/Print.php       |    2 +-
 .../CRM/Contact/Form/Task/ProximityCommon.php |    2 +-
 civicrm/CRM/Contact/Form/Task/SMSCommon.php   |    6 +-
 civicrm/CRM/Contact/Form/Task/SaveSearch.php  |    2 +-
 .../CRM/Contact/Import/Form/DataSource.php    |    2 +-
 civicrm/CRM/Contact/Import/Form/MapField.php  |   50 +-
 civicrm/CRM/Contact/Import/ImportJob.php      |   14 +-
 civicrm/CRM/Contact/Import/Parser.php         |   20 +-
 civicrm/CRM/Contact/Import/Parser/Contact.php |   10 +-
 civicrm/CRM/Contact/Page/AJAX.php             |   42 +-
 .../CRM/Contact/Page/Inline/CustomData.php    |    2 +-
 civicrm/CRM/Contact/Page/View.php             |    2 +-
 civicrm/CRM/Contact/Page/View/Vcard.php       |   10 +-
 civicrm/CRM/Contact/Selector.php              |   14 +-
 civicrm/CRM/Contact/Selector/Custom.php       |    2 +-
 civicrm/CRM/Contact/StateMachine/Search.php   |    2 +-
 civicrm/CRM/Contact/Task.php                  |    2 +-
 civicrm/CRM/Contribute/BAO/Contribution.php   |  184 +-
 .../CRM/Contribute/BAO/Contribution/Utils.php |    8 +-
 .../CRM/Contribute/BAO/ContributionPage.php   |   48 +-
 .../CRM/Contribute/BAO/ContributionRecur.php  |   18 +-
 .../CRM/Contribute/BAO/ContributionSoft.php   |   16 +-
 civicrm/CRM/Contribute/BAO/ManagePremiums.php |    2 +-
 civicrm/CRM/Contribute/BAO/Product.php        |    2 +-
 civicrm/CRM/Contribute/DAO/Widget.php         |   14 +-
 .../Contribute/Form/AbstractEditPayment.php   |   10 +-
 .../CRM/Contribute/Form/AdditionalInfo.php    |   14 +-
 .../CRM/Contribute/Form/AdditionalPayment.php |  113 +-
 .../Contribute/Form/CancelSubscription.php    |   81 +-
 civicrm/CRM/Contribute/Form/Contribution.php  |   60 +-
 .../Contribute/Form/Contribution/Confirm.php  |   92 +-
 .../CRM/Contribute/Form/Contribution/Main.php |   36 +-
 .../Contribute/Form/Contribution/ThankYou.php |    6 +-
 .../CRM/Contribute/Form/ContributionBase.php  |   39 +-
 .../Contribute/Form/ContributionCharts.php    |    4 +-
 .../CRM/Contribute/Form/ContributionPage.php  |    4 +-
 .../Form/ContributionPage/Amount.php          |   32 +-
 .../CRM/Contribute/Form/ContributionRecur.php |    2 +-
 civicrm/CRM/Contribute/Form/Search.php        |    4 +-
 civicrm/CRM/Contribute/Form/SoftCredit.php    |   10 +-
 civicrm/CRM/Contribute/Form/Task.php          |    2 +-
 civicrm/CRM/Contribute/Form/Task/Batch.php    |    2 +-
 civicrm/CRM/Contribute/Form/Task/Email.php    |   35 +-
 civicrm/CRM/Contribute/Form/Task/Invoice.php  |   57 +-
 civicrm/CRM/Contribute/Form/Task/PDF.php      |    8 +-
 .../CRM/Contribute/Form/Task/PDFLetter.php    |    2 +-
 .../Contribute/Form/Task/PDFLetterCommon.php  |   14 +-
 civicrm/CRM/Contribute/Form/Task/Status.php   |   11 +-
 civicrm/CRM/Contribute/Form/UpdateBilling.php |    4 +-
 .../Contribute/Form/UpdateSubscription.php    |    2 +-
 .../CRM/Contribute/Import/Form/MapField.php   |   16 +-
 .../CRM/Contribute/Import/Form/Preview.php    |    2 +-
 .../Contribute/Import/Parser/Contribution.php |   26 +-
 .../CRM/Contribute/Page/ContributionPage.php  |    6 +-
 civicrm/CRM/Contribute/Page/PaymentInfo.php   |    5 +-
 civicrm/CRM/Contribute/Page/Tab.php           |    4 +-
 civicrm/CRM/Contribute/PseudoConstant.php     |   16 +-
 civicrm/CRM/Contribute/Selector/Search.php    |    2 +-
 .../CRM/Contribute/StateMachine/Search.php    |    2 +-
 civicrm/CRM/Contribute/Task.php               |    3 +-
 civicrm/CRM/Contribute/Tokens.php             |    2 +-
 civicrm/CRM/Core/Action.php                   |    4 +-
 civicrm/CRM/Core/BAO/ActionLog.php            |    2 +-
 civicrm/CRM/Core/BAO/ActionSchedule.php       |    4 +-
 civicrm/CRM/Core/BAO/Address.php              |   26 +-
 civicrm/CRM/Core/BAO/Block.php                |   14 +-
 civicrm/CRM/Core/BAO/CMSUser.php              |    8 +-
 civicrm/CRM/Core/BAO/Cache.php                |    2 +-
 civicrm/CRM/Core/BAO/ConfigSetting.php        |    2 +-
 civicrm/CRM/Core/BAO/CustomField.php          |   21 +-
 civicrm/CRM/Core/BAO/CustomGroup.php          |   82 +-
 civicrm/CRM/Core/BAO/CustomValueTable.php     |   12 +-
 civicrm/CRM/Core/BAO/Dashboard.php            |   46 +-
 civicrm/CRM/Core/BAO/Domain.php               |   36 +-
 civicrm/CRM/Core/BAO/EntityTag.php            |   34 +
 civicrm/CRM/Core/BAO/File.php                 |    6 +-
 civicrm/CRM/Core/BAO/FinancialTrxn.php        |   18 +-
 civicrm/CRM/Core/BAO/Location.php             |   51 -
 civicrm/CRM/Core/BAO/Mapping.php              |   40 +-
 civicrm/CRM/Core/BAO/MessageTemplate.php      |   44 +-
 civicrm/CRM/Core/BAO/Navigation.php           |    4 +-
 civicrm/CRM/Core/BAO/Note.php                 |   20 +-
 civicrm/CRM/Core/BAO/OptionValue.php          |   16 +-
 civicrm/CRM/Core/BAO/PrevNextCache.php        |   13 +
 civicrm/CRM/Core/BAO/RecurringEntity.php      |    6 +-
 civicrm/CRM/Core/BAO/SchemaHandler.php        |    3 +-
 civicrm/CRM/Core/BAO/Setting.php              |    2 +-
 civicrm/CRM/Core/BAO/StatusPreference.php     |    2 +-
 civicrm/CRM/Core/BAO/Tag.php                  |   12 +-
 civicrm/CRM/Core/BAO/UFField.php              |   14 +-
 civicrm/CRM/Core/BAO/UFGroup.php              |   40 +-
 civicrm/CRM/Core/BAO/UFJoin.php               |   28 +-
 civicrm/CRM/Core/BAO/UFMatch.php              |   14 +-
 civicrm/CRM/Core/BAO/Website.php              |    2 +-
 civicrm/CRM/Core/BAO/WordReplacement.php      |    2 +-
 civicrm/CRM/Core/Block.php                    |    6 +-
 civicrm/CRM/Core/CodeGen/Util/Xml.php         |    2 +
 civicrm/CRM/Core/Component.php                |    2 +-
 civicrm/CRM/Core/Component/Info.php           |    2 +-
 civicrm/CRM/Core/Config.php                   |    2 +-
 civicrm/CRM/Core/Config/MagicMerge.php        |    4 +-
 civicrm/CRM/Core/Controller.php               |   10 +-
 civicrm/CRM/Core/DAO.php                      |  103 +-
 civicrm/CRM/Core/DAO/AllCoreTables.php        |   15 +-
 civicrm/CRM/Core/DAO/County.php               |    7 +-
 civicrm/CRM/Core/DAO/Dashboard.php            |    3 +-
 civicrm/CRM/Core/DAO/Discount.php             |    7 +-
 civicrm/CRM/Core/DAO/Factory.php              |    2 +-
 civicrm/CRM/Core/DAO/OpenID.php               |    7 +-
 civicrm/CRM/Core/DAO/PrintLabel.php           |    6 +-
 civicrm/CRM/Core/DAO/Tag.php                  |    7 +-
 civicrm/CRM/Core/DAO/permissions.php          |    2 +-
 civicrm/CRM/Core/Error.php                    |   10 +-
 civicrm/CRM/Core/Form.php                     |   66 +-
 civicrm/CRM/Core/Form/RecurringEntity.php     |    8 +-
 civicrm/CRM/Core/Form/Renderer.php            |    2 +-
 civicrm/CRM/Core/Form/ShortCode.php           |   10 +-
 civicrm/CRM/Core/Form/Task/Batch.php          |    2 +-
 .../CRM/Core/Form/Task/PDFLetterCommon.php    |    2 +-
 civicrm/CRM/Core/Invoke.php                   |    4 +-
 civicrm/CRM/Core/Key.php                      |    2 +-
 civicrm/CRM/Core/ManagedEntities.php          |   28 +-
 civicrm/CRM/Core/Menu.php                     |   18 +-
 civicrm/CRM/Core/OptionGroup.php              |   10 +-
 civicrm/CRM/Core/OptionValue.php              |    8 +-
 civicrm/CRM/Core/Page.php                     |    2 +-
 civicrm/CRM/Core/Page/AJAX/Location.php       |    6 +-
 civicrm/CRM/Core/Page/File.php                |    2 +-
 .../CRM/Core/Page/RecurringEntityPreview.php  |    6 +-
 civicrm/CRM/Core/Payment.php                  |   72 +-
 civicrm/CRM/Core/Payment/BaseIPN.php          |    4 +-
 civicrm/CRM/Core/Payment/Elavon.php           |    4 +-
 civicrm/CRM/Core/Payment/Form.php             |    6 +-
 civicrm/CRM/Core/Payment/PayPalImpl.php       |   34 +-
 civicrm/CRM/Core/Payment/PayPalProIPN.php     |    7 +-
 civicrm/CRM/Core/Payment/PaymentExpress.php   |    2 +-
 .../CRM/Core/Payment/PaymentExpressIPN.php    |    2 +-
 civicrm/CRM/Core/Payment/Realex.php           |    4 +-
 civicrm/CRM/Core/Permission.php               |    6 +-
 civicrm/CRM/Core/PrevNextCache/Redis.php      |    2 +-
 civicrm/CRM/Core/PseudoConstant.php           |  238 ++-
 civicrm/CRM/Core/Region.php                   |    2 +-
 civicrm/CRM/Core/Report/Excel.php             |   12 +-
 civicrm/CRM/Core/Selector/Controller.php      |    5 +-
 civicrm/CRM/Core/Session.php                  |    2 +-
 civicrm/CRM/Core/Smarty.php                   |    2 +-
 .../Core/Smarty/plugins/function.crmAPI.php   |    2 +-
 .../Smarty/plugins/function.crmAttributes.php |    2 +-
 .../Core/Smarty/plugins/function.crmKey.php   |    5 +-
 civicrm/CRM/Core/Task.php                     |    2 +-
 civicrm/CRM/Core/Transaction.php              |   20 +
 civicrm/CRM/Core/xml/Menu/Api4.xml            |    2 +-
 civicrm/CRM/Custom/Form/CustomData.php        |    2 +-
 civicrm/CRM/Custom/Form/DeleteField.php       |    2 +-
 civicrm/CRM/Custom/Form/Field.php             |    4 +-
 civicrm/CRM/Custom/Form/Group.php             |    4 +-
 civicrm/CRM/Custom/Import/Form/MapField.php   |   16 +-
 civicrm/CRM/Custom/Import/Parser/Api.php      |   16 +-
 civicrm/CRM/Custom/Page/Group.php             |   10 +-
 civicrm/CRM/Dedupe/BAO/Exception.php          |    6 +-
 .../BAO/QueryBuilder/IndividualGeneral.php    |    4 +-
 civicrm/CRM/Dedupe/BAO/Rule.php               |    2 +-
 civicrm/CRM/Dedupe/Finder.php                 |   16 +-
 civicrm/CRM/Dedupe/Merger.php                 |   36 +-
 civicrm/CRM/Event/BAO/Event.php               |   32 +-
 civicrm/CRM/Event/BAO/Participant.php         |   30 +-
 civicrm/CRM/Event/BAO/ParticipantPayment.php  |    2 +-
 .../CRM/Event/BAO/ParticipantStatusType.php   |    2 +-
 civicrm/CRM/Event/Cart/BAO/Cart.php           |    2 +-
 civicrm/CRM/Event/Cart/BAO/MerParticipant.php |   23 +-
 civicrm/CRM/Event/Cart/Form/Cart.php          |   33 +-
 .../Cart/Form/Checkout/ConferenceEvents.php   |    2 +-
 .../Form/Checkout/ParticipantsAndPrices.php   |    7 +-
 .../CRM/Event/Cart/Form/Checkout/Payment.php  |  170 +-
 .../CRM/Event/Cart/Form/MerParticipant.php    |   20 +-
 civicrm/CRM/Event/Cart/Page/AddToCart.php     |   21 +-
 civicrm/CRM/Event/Form/EventFees.php          |    8 +-
 civicrm/CRM/Event/Form/ManageEvent.php        |   12 +-
 .../CRM/Event/Form/ManageEvent/EventInfo.php  |    4 +-
 civicrm/CRM/Event/Form/ManageEvent/Fee.php    |   16 +-
 .../Event/Form/ManageEvent/Registration.php   |    6 +-
 civicrm/CRM/Event/Form/Participant.php        |   60 +-
 .../Event/Form/ParticipantFeeSelection.php    |    8 +-
 civicrm/CRM/Event/Form/ParticipantView.php    |    6 +-
 civicrm/CRM/Event/Form/Registration.php       |   44 +-
 .../Registration/AdditionalParticipant.php    |   10 +-
 .../CRM/Event/Form/Registration/Confirm.php   |   34 +-
 .../Form/Registration/ParticipantConfirm.php  |    6 +-
 .../CRM/Event/Form/Registration/Register.php  |   20 +-
 .../CRM/Event/Form/Registration/ThankYou.php  |    2 +-
 civicrm/CRM/Event/Form/Search.php             |    2 +-
 civicrm/CRM/Event/Form/SelfSvcTransfer.php    |   18 +-
 civicrm/CRM/Event/Form/SelfSvcUpdate.php      |    2 +-
 civicrm/CRM/Event/Form/Task/AddToGroup.php    |    2 +-
 civicrm/CRM/Event/Form/Task/Batch.php         |   18 +-
 civicrm/CRM/Event/Form/Task/Email.php         |   42 +-
 civicrm/CRM/Event/{Page => }/ICalendar.php    |   62 +-
 civicrm/CRM/Event/Import/Form/MapField.php    |   22 +-
 .../CRM/Event/Import/Parser/Participant.php   |   10 +-
 civicrm/CRM/Event/Page/EventInfo.php          |   20 +-
 civicrm/CRM/Event/Page/List.php               |   36 +
 civicrm/CRM/Event/Page/ManageEvent.php        |    6 +-
 .../ParticipantListing/NameStatusAndDate.php  |    2 +-
 civicrm/CRM/Event/PseudoConstant.php          |   16 +-
 civicrm/CRM/Event/Selector/Search.php         |    4 +-
 civicrm/CRM/Event/StateMachine/Search.php     |    2 +-
 civicrm/CRM/Event/Tokens.php                  |    4 +-
 civicrm/CRM/Event/xml/Menu/Event.xml          |   10 +-
 civicrm/CRM/Export/BAO/ExportProcessor.php    |   17 +-
 civicrm/CRM/Export/Form/Select.php            |    4 +-
 civicrm/CRM/Extension/Manager.php             |  134 +-
 civicrm/CRM/Extension/Manager/Report.php      |    3 +-
 civicrm/CRM/Extension/Manager/Search.php      |    3 +-
 .../CRM/Financial/BAO/FinancialAccount.php    |    6 +-
 civicrm/CRM/Financial/BAO/FinancialItem.php   |    4 +-
 civicrm/CRM/Financial/BAO/FinancialType.php   |    2 +-
 civicrm/CRM/Financial/BAO/Payment.php         |    8 +-
 .../CRM/Financial/BAO/PaymentProcessor.php    |   10 +-
 civicrm/CRM/Financial/Form/FinancialType.php  |   31 +-
 .../Financial/Form/FinancialTypeAccount.php   |    2 +-
 .../Form/FrontEndPaymentFormTrait.php         |   14 +-
 civicrm/CRM/Financial/Form/PaymentEdit.php    |    8 +-
 civicrm/CRM/Financial/Form/SalesTaxTrait.php  |    4 +-
 civicrm/CRM/Financial/Page/AJAX.php           |    8 +-
 civicrm/CRM/Financial/Page/FinancialType.php  |    3 +-
 .../Financial/Page/FinancialTypeAccount.php   |    4 +-
 civicrm/CRM/Friend/BAO/Friend.php             |    8 +-
 civicrm/CRM/Friend/Form.php                   |    6 +-
 civicrm/CRM/Friend/Form/Contribute.php        |   16 +-
 civicrm/CRM/Friend/Form/Event.php             |   16 +-
 civicrm/CRM/Grant/BAO/Grant.php               |    4 +-
 civicrm/CRM/Grant/StateMachine/Search.php     |    2 +-
 civicrm/CRM/Grant/Task.php                    |    2 +-
 civicrm/CRM/Group/Form/Edit.php               |    4 +-
 civicrm/CRM/Group/Page/AJAX.php               |    2 +-
 civicrm/CRM/Import/ImportProcessor.php        |    2 +-
 civicrm/CRM/Import/Parser.php                 |    2 +-
 civicrm/CRM/Invoicing/Utils.php               |    4 +-
 civicrm/CRM/Logging/Differ.php                |    8 +-
 civicrm/CRM/Logging/ReportDetail.php          |    4 +-
 civicrm/CRM/Logging/ReportSummary.php         |    4 +-
 civicrm/CRM/Mailing/BAO/Mailing.php           |   22 +-
 civicrm/CRM/Mailing/BAO/MailingComponent.php  |    2 +-
 civicrm/CRM/Mailing/BAO/Query.php             |    2 +-
 civicrm/CRM/Mailing/DAO/BouncePattern.php     |    7 +-
 civicrm/CRM/Mailing/DAO/Mailing.php           |    6 +-
 civicrm/CRM/Mailing/DAO/Spool.php             |    6 +-
 civicrm/CRM/Mailing/Form/Task.php             |    2 +-
 civicrm/CRM/Mailing/Info.php                  |    4 +-
 civicrm/CRM/Mailing/Page/Preview.php          |    2 +-
 civicrm/CRM/Mailing/Page/View.php             |    4 +-
 civicrm/CRM/Member/BAO/Membership.php         |  152 +-
 civicrm/CRM/Member/BAO/MembershipBlock.php    |    2 +-
 civicrm/CRM/Member/BAO/MembershipStatus.php   |    2 +-
 civicrm/CRM/Member/BAO/MembershipType.php     |   16 +-
 civicrm/CRM/Member/Form.php                   |    4 +-
 civicrm/CRM/Member/Form/Membership.php        |   75 +-
 civicrm/CRM/Member/Form/MembershipBlock.php   |   22 +-
 civicrm/CRM/Member/Form/MembershipRenewal.php |   10 +-
 civicrm/CRM/Member/Form/MembershipType.php    |    2 +-
 civicrm/CRM/Member/Form/MembershipView.php    |    4 +-
 civicrm/CRM/Member/Form/Task/Batch.php        |    2 +-
 civicrm/CRM/Member/Form/Task/Email.php        |   52 +-
 civicrm/CRM/Member/Form/Task/Label.php        |   10 +-
 civicrm/CRM/Member/Form/Task/PDFLetter.php    |    4 +-
 civicrm/CRM/Member/Import/Form/MapField.php   |   22 +-
 .../CRM/Member/Import/Parser/Membership.php   |    4 +-
 civicrm/CRM/Member/Page/AJAX.php              |    2 +-
 civicrm/CRM/Member/Page/DashBoard.php         |    2 +-
 civicrm/CRM/Member/Page/MembershipType.php    |    2 +-
 .../Member/Page/RecurringContributions.php    |    2 +-
 civicrm/CRM/Member/Page/Tab.php               |   12 +-
 civicrm/CRM/Member/Page/UserDashboard.php     |    2 +-
 civicrm/CRM/Member/PseudoConstant.php         |    2 +-
 civicrm/CRM/Member/Selector/Search.php        |    2 +-
 civicrm/CRM/Member/StateMachine/Search.php    |    2 +-
 civicrm/CRM/PCP/BAO/PCP.php                   |   36 +-
 civicrm/CRM/PCP/Form/Campaign.php             |   10 +-
 civicrm/CRM/PCP/Form/Contribute.php           |    2 +-
 civicrm/CRM/PCP/Form/Event.php                |    2 +-
 civicrm/CRM/PCP/Form/PCP.php                  |    4 +-
 civicrm/CRM/PCP/Form/PCPAccount.php           |    2 +-
 civicrm/CRM/PCP/Page/PCPInfo.php              |    2 +-
 civicrm/CRM/Pledge/BAO/Pledge.php             |   22 +-
 civicrm/CRM/Pledge/BAO/PledgeBlock.php        |   10 +-
 civicrm/CRM/Pledge/BAO/Query.php              |    2 +-
 civicrm/CRM/Pledge/Form/Pledge.php            |    6 +-
 civicrm/CRM/Pledge/Selector/Search.php        |    6 +-
 civicrm/CRM/Pledge/StateMachine/Search.php    |    2 +-
 civicrm/CRM/Pledge/Task.php                   |    2 +-
 civicrm/CRM/Price/BAO/LineItem.php            |   30 +-
 civicrm/CRM/Price/BAO/PriceField.php          |   22 +-
 civicrm/CRM/Price/BAO/PriceFieldValue.php     |    8 +-
 civicrm/CRM/Price/BAO/PriceSet.php            |   12 +-
 civicrm/CRM/Price/Form/Field.php              |    2 +-
 civicrm/CRM/Price/Form/Set.php                |    2 +-
 civicrm/CRM/Price/Page/Field.php              |    6 +-
 civicrm/CRM/Price/Page/Option.php             |    4 +-
 civicrm/CRM/Profile/Form.php                  |    8 +-
 civicrm/CRM/Profile/Form/Edit.php             |    6 +-
 civicrm/CRM/Profile/Page/Listings.php         |    4 +-
 .../Page/MultipleRecordFieldsListing.php      |   10 +-
 civicrm/CRM/Profile/Selector/Listings.php     |   18 +-
 civicrm/CRM/Queue/Runner.php                  |    6 +-
 civicrm/CRM/Report/BAO/ReportInstance.php     |   12 +-
 civicrm/CRM/Report/DAO/ReportInstance.php     |    6 +-
 civicrm/CRM/Report/Form.php                   |  170 +-
 civicrm/CRM/Report/Form/Activity.php          |   44 +-
 civicrm/CRM/Report/Form/ActivitySummary.php   |   22 +-
 .../Report/Form/Campaign/SurveyDetails.php    |   41 +-
 civicrm/CRM/Report/Form/Case/Demographics.php |   12 +-
 civicrm/CRM/Report/Form/Case/Detail.php       |   12 +-
 civicrm/CRM/Report/Form/Case/Summary.php      |    2 +-
 civicrm/CRM/Report/Form/Case/TimeSpent.php    |   20 +-
 .../Report/Form/Contact/CurrentEmployer.php   |   12 +-
 civicrm/CRM/Report/Form/Contact/Detail.php    |   22 +-
 civicrm/CRM/Report/Form/Contact/Log.php       |   10 +-
 .../Report/Form/Contact/LoggingSummary.php    |    4 +-
 .../CRM/Report/Form/Contact/Relationship.php  |   25 +-
 .../Report/Form/Contribute/Bookkeeping.php    |   12 +-
 civicrm/CRM/Report/Form/Contribute/Detail.php |   44 +-
 .../CRM/Report/Form/Contribute/History.php    |   12 +-
 .../Form/Contribute/HouseholdSummary.php      |   12 +-
 .../Form/Contribute/OrganizationSummary.php   |   12 +-
 civicrm/CRM/Report/Form/Contribute/PCP.php    |    8 +-
 civicrm/CRM/Report/Form/Contribute/Recur.php  |    6 +-
 .../Report/Form/Contribute/RecurSummary.php   |   12 +-
 civicrm/CRM/Report/Form/Contribute/Repeat.php |   18 +-
 .../CRM/Report/Form/Contribute/SoftCredit.php |    2 +-
 .../CRM/Report/Form/Contribute/Summary.php    |   63 +-
 civicrm/CRM/Report/Form/Contribute/Sybunt.php |   10 +-
 .../CRM/Report/Form/Contribute/TopDonor.php   |   14 +-
 .../Report/Form/Event/IncomeCountSummary.php  |   10 +-
 .../Form/Event/ParticipantListCount.php       |    2 +-
 .../Report/Form/Event/ParticipantListing.php  |   24 +-
 civicrm/CRM/Report/Form/Event/Summary.php     |   14 +-
 civicrm/CRM/Report/Form/Grant/Statistics.php  |   25 +-
 civicrm/CRM/Report/Form/Instance.php          |    4 +-
 civicrm/CRM/Report/Form/Mailing/Bounce.php    |   14 +-
 civicrm/CRM/Report/Form/Mailing/Clicks.php    |    6 +-
 civicrm/CRM/Report/Form/Mailing/Detail.php    |   12 +-
 civicrm/CRM/Report/Form/Mailing/Opened.php    |    6 +-
 civicrm/CRM/Report/Form/Mailing/Summary.php   |   10 +-
 .../Report/Form/Member/ContributionDetail.php |   32 +-
 civicrm/CRM/Report/Form/Member/Lapse.php      |   10 +-
 civicrm/CRM/Report/Form/Member/Summary.php    |   16 +-
 .../CRM/Report/Form/Membership/Summary.php    |    8 +-
 civicrm/CRM/Report/Form/Pledge/Detail.php     |    8 +-
 civicrm/CRM/Report/Form/Pledge/Pbnp.php       |    4 +-
 civicrm/CRM/Report/Form/Pledge/Summary.php    |    8 +-
 civicrm/CRM/Report/Form/Walklist/Walklist.php |    8 +-
 civicrm/CRM/Report/Utils/Get.php              |    4 +-
 civicrm/CRM/Report/Utils/Report.php           |   14 +-
 civicrm/CRM/SMS/BAO/Provider.php              |    2 +-
 civicrm/CRM/SMS/Form/Group.php                |    2 +-
 civicrm/CRM/SMS/Form/Upload.php               |    4 +-
 civicrm/CRM/SMS/Provider.php                  |    8 +-
 civicrm/CRM/UF/Form/Field.php                 |   12 +-
 civicrm/CRM/UF/Form/Group.php                 |    6 +-
 civicrm/CRM/UF/Page/Group.php                 |    2 +-
 civicrm/CRM/UF/Page/ProfileEditor.php         |    4 +-
 civicrm/CRM/Upgrade/Form.php                  |   15 +-
 civicrm/CRM/Upgrade/Incremental/General.php   |   15 +-
 .../Incremental/php/FiveTwentyFive.php        |  138 ++
 .../Incremental/php/FiveTwentyFour.php        |    5 -
 .../CRM/Upgrade/Incremental/php/FourFive.php  |    2 +-
 .../CRM/Upgrade/Incremental/php/FourFour.php  |    2 +-
 .../CRM/Upgrade/Incremental/php/FourSeven.php |    2 +-
 .../Upgrade/Incremental/sql/5.24.0.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.24.1.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.24.2.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.24.3.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.24.4.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.24.5.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.24.6.mysql.tpl  |    1 -
 .../Upgrade/Incremental/sql/5.25.0.mysql.tpl  |    1 +
 .../Incremental/sql/5.25.alpha1.mysql.tpl     |    4 +
 .../Incremental/sql/5.25.beta1.mysql.tpl      |    1 +
 .../Incremental/sql/5.25.beta2.mysql.tpl      |    1 +
 .../Incremental/sql/5.25.beta3.mysql.tpl      |    1 +
 civicrm/CRM/Utils/Address.php                 |  100 +-
 civicrm/CRM/Utils/Array.php                   |   16 +-
 civicrm/CRM/Utils/Cache.php                   |    2 +-
 civicrm/CRM/Utils/Cache/Redis.php             |    4 +-
 civicrm/CRM/Utils/Cache/SqlGroup.php          |    3 +-
 civicrm/CRM/Utils/Chart.php                   |    8 +-
 civicrm/CRM/Utils/Check/Component/Env.php     |   12 +-
 .../CRM/Utils/Check/Component/Security.php    |   10 -
 civicrm/CRM/Utils/Date.php                    |   20 +-
 civicrm/CRM/Utils/DeprecatedUtils.php         |   18 +-
 civicrm/CRM/Utils/File.php                    |   14 +-
 civicrm/CRM/Utils/Geocode/Google.php          |    2 +-
 civicrm/CRM/Utils/GlobalStack.php             |    4 +-
 civicrm/CRM/Utils/Hook.php                    |   74 +-
 civicrm/CRM/Utils/Mail.php                    |   16 +-
 civicrm/CRM/Utils/Migrate/Export.php          |    4 +-
 civicrm/CRM/Utils/Migrate/ExportJSON.php      |    2 +-
 civicrm/CRM/Utils/PDF/Label.php               |    2 +-
 civicrm/CRM/Utils/PDF/Utils.php               |    1 +
 civicrm/CRM/Utils/Pager.php                   |   10 +-
 civicrm/CRM/Utils/PagerAToZ.php               |    2 +-
 civicrm/CRM/Utils/REST.php                    |   22 +-
 civicrm/CRM/Utils/Recent.php                  |   10 +-
 civicrm/CRM/Utils/Request.php                 |    2 +-
 civicrm/CRM/Utils/Rule.php                    |   32 +-
 civicrm/CRM/Utils/SQL/Delete.php              |    2 +-
 civicrm/CRM/Utils/SQL/Select.php              |    2 +-
 civicrm/CRM/Utils/Sort.php                    |    2 +-
 civicrm/CRM/Utils/String.php                  |   18 +-
 civicrm/CRM/Utils/System.php                  |   16 +-
 civicrm/CRM/Utils/System/Backdrop.php         |    2 +-
 civicrm/CRM/Utils/System/Drupal.php           |    2 +-
 civicrm/CRM/Utils/System/Drupal6.php          |    8 +-
 civicrm/CRM/Utils/System/Drupal8.php          |    2 +-
 civicrm/CRM/Utils/System/DrupalBase.php       |    7 +-
 civicrm/CRM/Utils/System/Joomla.php           |    8 +-
 civicrm/CRM/Utils/System/WordPress.php        |   73 +-
 civicrm/CRM/Utils/Token.php                   |   10 +-
 civicrm/CRM/Utils/Verp.php                    |    4 +-
 civicrm/CRM/Utils/VersionCheck.php            |    2 +-
 civicrm/CRM/Utils/Wrapper.php                 |   10 +-
 civicrm/Civi/API/Kernel.php                   |    4 +-
 .../Civi/API/Provider/ReflectionProvider.php  |    2 +-
 civicrm/Civi/API/SelectQuery.php              |    6 +-
 .../Civi/API/Subscriber/ChainSubscriber.php   |    4 +-
 .../Civi/API/Subscriber/I18nSubscriber.php    |    4 +-
 civicrm/Civi/Angular/AngularLoader.php        |    2 +-
 civicrm/Civi/Angular/Page/Modules.php         |    6 +-
 civicrm/Civi/Api4/Dashboard.php               |   37 +
 ...nSpecProvider.php => DashboardContact.php} |   29 +-
 .../Subscriber/PostSelectQuerySubscriber.php  |    7 +-
 .../Api4/Generic/AbstractCreateAction.php     |    2 +-
 .../Civi/Api4/Generic/AbstractGetAction.php   |   13 +-
 .../Api4/Generic/AbstractUpdateAction.php     |    2 +-
 civicrm/Civi/Api4/Generic/DAODeleteAction.php |   19 +-
 civicrm/Civi/Api4/Generic/DAOGetAction.php    |   15 +
 civicrm/Civi/Api4/Generic/DAOUpdateAction.php |    2 +-
 civicrm/Civi/Api4/Generic/Result.php          |    9 +-
 .../Generic/Traits/ArrayQueryActionTrait.php  |    4 +-
 .../Api4/Generic/Traits/DAOActionTrait.php    |   45 +-
 civicrm/Civi/Api4/Query/Api4SelectQuery.php   |  301 ++-
 .../Schema/Joinable/CustomGroupJoinable.php   |    2 +-
 .../Api4/Service/Schema/SchemaMapBuilder.php  |   19 +-
 .../Api4/Service/Spec/CustomFieldSpec.php     |   23 -
 civicrm/Civi/Api4/Service/Spec/FieldSpec.php  |   24 +-
 ...ider.php => FieldDomainIdSpecProvider.php} |   11 +-
 .../Spec/Provider/NavigationSpecProvider.php  |    4 +
 .../PaymentProcessorCreationSpecProvider.php  |    1 -
 .../Civi/Api4/Service/Spec/SpecFormatter.php  |   37 +-
 .../Civi/Api4/Service/Spec/SpecGatherer.php   |    4 +-
 .../Civi/Api4/Utils/ArrayInsertionUtil.php    |    6 +-
 civicrm/Civi/Api4/Utils/SelectUtil.php        |   23 +-
 .../Civi/CiUtil/Command/CompareCommand.php    |    2 +-
 civicrm/Civi/Core/CiviEventInspector.php      |    2 +-
 civicrm/Civi/Core/Container.php               |    2 +
 civicrm/Civi/Core/Resolver.php                |    2 +-
 civicrm/Civi/Core/SettingsBag.php             |    8 +-
 civicrm/Civi/Core/SettingsManager.php         |    4 +-
 civicrm/Civi/Core/Themes.php                  |    2 +-
 civicrm/Civi/Core/Transaction/Manager.php     |    2 +-
 civicrm/Civi/Payment/PropertyBag.php          |   12 +-
 civicrm/Civi/Test/Api3TestTrait.php           |   38 +-
 civicrm/Civi/Test/ContactTestTrait.php        |    4 -
 civicrm/Civi/Test/GenericAssertionsTrait.php  |    4 +-
 civicrm/Civi/Test/Schema.php                  |    2 +-
 civicrm/Civi/Token/TokenCompatSubscriber.php  |    3 +-
 civicrm/ang/api4Explorer/Explorer.js          |    8 +-
 civicrm/api/api.php                           |    9 +-
 civicrm/api/v3/Activity.php                   |   22 +-
 civicrm/api/v3/Attachment.php                 |    4 +-
 civicrm/api/v3/Case.php                       |   20 +-
 civicrm/api/v3/CaseContact.php                |    2 +-
 civicrm/api/v3/Contact.php                    |   85 +-
 civicrm/api/v3/Contribution.php               |    6 +-
 civicrm/api/v3/ContributionPage.php           |    2 +-
 civicrm/api/v3/CustomValue.php                |    4 +-
 civicrm/api/v3/Dashboard.php                  |    8 +-
 civicrm/api/v3/DashboardContact.php           |   26 +-
 civicrm/api/v3/Domain.php                     |    6 +-
 civicrm/api/v3/EntityTag.php                  |    2 +-
 civicrm/api/v3/Generic.php                    |   12 +-
 civicrm/api/v3/Generic/Getlist.php            |    6 +-
 civicrm/api/v3/GroupContact.php               |    4 +-
 civicrm/api/v3/Job.php                        |    8 +-
 civicrm/api/v3/Mailing.php                    |   18 +-
 civicrm/api/v3/MailingEventSubscribe.php      |    2 +-
 civicrm/api/v3/Membership.php                 |    4 +-
 civicrm/api/v3/MembershipStatus.php           |    2 +-
 civicrm/api/v3/Order.php                      |    2 +-
 civicrm/api/v3/Payment.php                    |    2 +-
 civicrm/api/v3/Profile.php                    |   26 +-
 civicrm/api/v3/Setting.php                    |    4 +-
 civicrm/api/v3/System.php                     |    2 +-
 civicrm/api/v3/UFGroup.php                    |    2 +-
 civicrm/api/v3/utils.php                      |  106 +-
 civicrm/bin/cli.class.php                     |    2 +-
 ...tion-134dc18b66d427be700a9e1241688102.json |    4 +-
 .../jquery-validation/CONTRIBUTING.md         |   35 +-
 .../jquery-validation/Gruntfile.js            |   79 +-
 .../jquery-validation/LICENSE.md              |   22 +
 .../jquery-validation/README.md               |   66 +-
 .../jquery-validation/bower.json              |    8 +-
 .../jquery-validation/build/release.js        |   31 +-
 .../jquery-validation/changelog.md            |  254 +++
 .../dist/additional-methods.js                | 1288 ++++++++----
 .../dist/additional-methods.min.js            |    8 +-
 .../dist/jquery-validation-sri.json           | 1154 +++++++++++
 .../jquery-validation/dist/jquery.validate.js |  985 +++++----
 .../dist/jquery.validate.min.js               |    8 +-
 .../dist/localization/messages_ar.js          |   35 +
 .../dist/localization/messages_ar.min.js      |    4 +
 .../dist/localization/messages_az.js          |   35 +
 .../dist/localization/messages_az.min.js      |    4 +
 .../dist/localization/messages_bg.js          |   35 +
 .../dist/localization/messages_bg.min.js      |    4 +
 .../dist/localization/messages_bn_BD.js       |   35 +
 .../dist/localization/messages_bn_BD.min.js   |    4 +
 .../dist/localization/messages_ca.js          |   35 +
 .../dist/localization/messages_ca.min.js      |    4 +
 .../dist/localization/messages_cs.js          |   36 +
 .../dist/localization/messages_cs.min.js      |    4 +
 .../dist/localization/messages_da.js          |   46 +
 .../dist/localization/messages_da.min.js      |    4 +
 .../dist/localization/messages_de.js          |   82 +
 .../dist/localization/messages_de.min.js      |    4 +
 .../dist/localization/messages_el.js          |   35 +
 .../dist/localization/messages_el.min.js      |    4 +
 .../dist/localization/messages_es.js          |   38 +
 .../dist/localization/messages_es.min.js      |    4 +
 .../dist/localization/messages_es_AR.js       |   39 +
 .../dist/localization/messages_es_AR.min.js   |    4 +
 .../dist/localization/messages_es_PE.js       |   39 +
 .../dist/localization/messages_es_PE.min.js   |    4 +
 .../dist/localization/messages_et.js          |   33 +
 .../dist/localization/messages_et.min.js      |    4 +
 .../dist/localization/messages_eu.js          |   35 +
 .../dist/localization/messages_eu.min.js      |    4 +
 .../dist/localization/messages_fa.js          |   39 +
 .../dist/localization/messages_fa.min.js      |    4 +
 .../dist/localization/messages_fi.js          |   33 +
 .../dist/localization/messages_fi.min.js      |    4 +
 .../dist/localization/messages_fr.js          |   63 +
 .../dist/localization/messages_fr.min.js      |    4 +
 .../dist/localization/messages_ge.js          |   35 +
 .../dist/localization/messages_ge.min.js      |    4 +
 .../dist/localization/messages_gl.js          |   40 +
 .../dist/localization/messages_gl.min.js      |    4 +
 .../dist/localization/messages_he.js          |   35 +
 .../dist/localization/messages_he.min.js      |    4 +
 .../dist/localization/messages_hr.js          |   35 +
 .../dist/localization/messages_hr.min.js      |    4 +
 .../dist/localization/messages_hu.js          |   35 +
 .../dist/localization/messages_hu.min.js      |    4 +
 .../dist/localization/messages_hy_AM.js       |   35 +
 .../dist/localization/messages_hy_AM.min.js   |    4 +
 .../dist/localization/messages_id.js          |   34 +
 .../dist/localization/messages_id.min.js      |    4 +
 .../dist/localization/messages_is.js          |   33 +
 .../dist/localization/messages_is.min.js      |    4 +
 .../dist/localization/messages_it.js          |   39 +
 .../dist/localization/messages_it.min.js      |    4 +
 .../dist/localization/messages_ja.js          |   36 +
 .../dist/localization/messages_ja.min.js      |    4 +
 .../dist/localization/messages_ka.js          |   35 +
 .../dist/localization/messages_ka.min.js      |    4 +
 .../dist/localization/messages_kk.js          |   35 +
 .../dist/localization/messages_kk.min.js      |    4 +
 .../dist/localization/messages_ko.js          |   35 +
 .../dist/localization/messages_ko.min.js      |    4 +
 .../dist/localization/messages_lt.js          |   35 +
 .../dist/localization/messages_lt.min.js      |    4 +
 .../dist/localization/messages_lv.js          |   35 +
 .../dist/localization/messages_lv.min.js      |    4 +
 .../dist/localization/messages_mk.js          |   35 +
 .../dist/localization/messages_mk.min.js      |    4 +
 .../dist/localization/messages_my.js          |   35 +
 .../dist/localization/messages_my.min.js      |    4 +
 .../dist/localization/messages_nl.js          |   46 +
 .../dist/localization/messages_nl.min.js      |    4 +
 .../dist/localization/messages_no.js          |   35 +
 .../dist/localization/messages_no.min.js      |    4 +
 .../dist/localization/messages_pl.js          |   38 +
 .../dist/localization/messages_pl.min.js      |    4 +
 .../dist/localization/messages_pt_BR.js       |   91 +
 .../dist/localization/messages_pt_BR.min.js   |    4 +
 .../dist/localization/messages_pt_PT.js       |   39 +
 .../dist/localization/messages_pt_PT.min.js   |    4 +
 .../dist/localization/messages_ro.js          |   35 +
 .../dist/localization/messages_ro.min.js      |    4 +
 .../dist/localization/messages_ru.js          |   35 +
 .../dist/localization/messages_ru.min.js      |    4 +
 .../dist/localization/messages_sd.js          |   35 +
 .../dist/localization/messages_sd.min.js      |    4 +
 .../dist/localization/messages_si.js          |   35 +
 .../dist/localization/messages_si.min.js      |    4 +
 .../dist/localization/messages_sk.js          |   33 +
 .../dist/localization/messages_sk.min.js      |    4 +
 .../dist/localization/messages_sl.js          |   35 +
 .../dist/localization/messages_sl.min.js      |    4 +
 .../dist/localization/messages_sr.js          |   36 +
 .../dist/localization/messages_sr.min.js      |    4 +
 .../dist/localization/messages_sr_lat.js      |   36 +
 .../dist/localization/messages_sr_lat.min.js  |    4 +
 .../dist/localization/messages_sv.js          |   35 +
 .../dist/localization/messages_sv.min.js      |    4 +
 .../dist/localization/messages_th.js          |   35 +
 .../dist/localization/messages_th.min.js      |    4 +
 .../dist/localization/messages_tj.js          |   35 +
 .../dist/localization/messages_tj.min.js      |    4 +
 .../dist/localization/messages_tr.js          |   36 +
 .../dist/localization/messages_tr.min.js      |    4 +
 .../dist/localization/messages_uk.js          |   35 +
 .../dist/localization/messages_uk.min.js      |    4 +
 .../dist/localization/messages_ur.js          |   35 +
 .../dist/localization/messages_ur.min.js      |    4 +
 .../dist/localization/messages_vi.js          |   35 +
 .../dist/localization/messages_vi.min.js      |    4 +
 .../dist/localization/messages_zh.js          |   36 +
 .../dist/localization/messages_zh.min.js      |    4 +
 .../dist/localization/messages_zh_TW.js       |   37 +
 .../dist/localization/messages_zh_TW.min.js   |    4 +
 .../dist/localization/methods_de.js           |   24 +
 .../dist/localization/methods_de.min.js       |    4 +
 .../dist/localization/methods_es_CL.js        |   24 +
 .../dist/localization/methods_es_CL.min.js    |    4 +
 .../dist/localization/methods_fi.js           |   24 +
 .../dist/localization/methods_fi.min.js       |    4 +
 .../dist/localization/methods_it.js           |   24 +
 .../dist/localization/methods_it.min.js       |    4 +
 .../dist/localization/methods_nl.js           |   24 +
 .../dist/localization/methods_nl.min.js       |    4 +
 .../dist/localization/methods_pt.js           |   21 +
 .../dist/localization/methods_pt.min.js       |    4 +
 .../jquery-validation/package.json            |   54 +-
 .../src/additional/abaRoutingNumber.js        |   31 +
 .../src/additional/accept.js                  |   34 +-
 .../src/additional/additional.js              |   36 +-
 .../src/additional/alphanumeric.js            |    6 +-
 .../src/additional/bankaccountNL.js           |   15 +-
 .../src/additional/bankorgiroaccountNL.js     |   10 +-
 .../jquery-validation/src/additional/bic.js   |   10 +-
 .../jquery-validation/src/additional/cifES.js |  135 +-
 .../jquery-validation/src/additional/cnhBR.js |   49 +
 .../src/additional/cnpjBR.js                  |   74 +
 .../jquery-validation/src/additional/cpfBR.js |   65 +
 .../src/additional/creditcard.js              |   40 +
 .../src/additional/creditcardtypes.js         |   46 +-
 .../src/additional/currency.js                |   14 +-
 .../src/additional/dateFA.js                  |    6 +-
 .../src/additional/dateITA.js                 |   20 +-
 .../src/additional/dateNL.js                  |    6 +-
 .../src/additional/extension.js               |    8 +-
 .../src/additional/giroaccountNL.js           |    6 +-
 .../src/additional/greaterThan.js             |   11 +
 .../src/additional/greaterThanEqual.js        |   11 +
 .../jquery-validation/src/additional/iban.js  |   58 +-
 .../src/additional/integer.js                 |    6 +-
 .../jquery-validation/src/additional/ipv4.js  |    6 +-
 .../jquery-validation/src/additional/ipv6.js  |    6 +-
 .../src/additional/lessThan.js                |   11 +
 .../src/additional/lessThanEqual.js           |   11 +
 .../src/additional/lettersonly.js             |    6 +-
 .../src/additional/letterswithbasicpunc.js    |    6 +-
 .../src/additional/maxfiles.js                |   14 +
 .../src/additional/maxsize.js                 |   18 +
 .../src/additional/maxsizetotal.js            |   22 +
 .../src/additional/mobileNL.js                |    6 +-
 .../src/additional/mobileRU.js                |    4 +
 .../src/additional/mobileUK.js                |   10 +-
 .../src/additional/netmask.js                 |    3 +
 .../jquery-validation/src/additional/nieES.js |   49 +-
 .../jquery-validation/src/additional/nifES.js |   11 +-
 .../jquery-validation/src/additional/nipPL.js |   22 +
 .../jquery-validation/src/additional/nisBR.js |   57 +
 .../src/additional/notEqualTo.js              |    3 +
 .../src/additional/nowhitespace.js            |    6 +-
 .../src/additional/pattern.js                 |   12 +-
 .../src/additional/phoneNL.js                 |    6 +-
 .../src/additional/phonePL.js                 |   23 +
 .../src/additional/phoneUK.js                 |   10 +-
 .../src/additional/phoneUS.js                 |   12 +-
 .../src/additional/phonesUK.js                |   13 +-
 .../src/additional/postalCodeCA.js            |    2 +-
 .../src/additional/postalcodeBR.js            |    6 +-
 .../src/additional/postalcodeIT.js            |    6 +-
 .../src/additional/postalcodeNL.js            |    6 +-
 .../src/additional/postcodeUK.js              |    6 +-
 .../src/additional/require_from_group.js      |   30 +-
 .../src/additional/skip_or_fill_minimum.js    |   32 +-
 .../src/additional/statesUS.js                |   18 +-
 .../src/additional/strippedminlength.js       |    6 +-
 .../jquery-validation/src/additional/time.js  |    6 +-
 .../src/additional/time12h.js                 |    6 +-
 .../jquery-validation/src/additional/url2.js  |    8 +-
 .../jquery-validation/src/additional/vinUS.js |   30 +-
 .../src/additional/zipcodeUS.js               |    6 +-
 .../src/additional/ziprange.js                |    6 +-
 .../jquery-validation/src/ajax.js             |   24 +-
 .../jquery-validation/src/core.js             |  935 ++++++---
 .../jquery-validation/src/delegate.js         |   13 -
 .../src/localization/messages_ar.js           |   16 +-
 .../src/localization/messages_az.js           |   23 +
 .../src/localization/messages_bg.js           |   16 +-
 .../src/localization/messages_bn_BD.js        |   23 +
 .../src/localization/messages_ca.js           |   18 +-
 .../src/localization/messages_cs.js           |   17 +-
 .../src/localization/messages_da.js           |   32 +-
 .../src/localization/messages_de.js           |   74 +-
 .../src/localization/messages_el.js           |   16 +-
 .../src/localization/messages_es.js           |   16 +-
 .../src/localization/messages_es_AR.js        |   16 +-
 .../src/localization/messages_es_PE.js        |   27 +
 .../src/localization/messages_et.js           |   16 +-
 .../src/localization/messages_eu.js           |   16 +-
 .../src/localization/messages_fa.js           |   33 +-
 .../src/localization/messages_fi.js           |   24 +-
 .../src/localization/messages_fr.js           |   28 +-
 .../src/localization/messages_ge.js           |   23 +
 .../src/localization/messages_gl.js           |   20 +-
 .../src/localization/messages_he.js           |   16 +-
 .../src/localization/messages_hr.js           |   16 +-
 .../src/localization/messages_hu.js           |   19 +-
 .../src/localization/messages_hy_AM.js        |   23 +
 .../src/localization/messages_id.js           |   16 +-
 .../src/localization/messages_is.js           |   16 +-
 .../src/localization/messages_it.js           |   45 +-
 .../src/localization/messages_ja.js           |   17 +-
 .../src/localization/messages_ka.js           |   16 +-
 .../src/localization/messages_kk.js           |   16 +-
 .../src/localization/messages_ko.js           |   16 +-
 .../src/localization/messages_lt.js           |   16 +-
 .../src/localization/messages_lv.js           |   16 +-
 .../src/localization/messages_mk.js           |   23 +
 .../src/localization/messages_my.js           |   16 +-
 .../src/localization/messages_nl.js           |   19 +-
 .../src/localization/messages_no.js           |   26 +-
 .../src/localization/messages_pl.js           |   19 +-
 .../src/localization/messages_pt_BR.js        |   73 +-
 .../src/localization/messages_pt_PT.js        |   16 +-
 .../src/localization/messages_ro.js           |   16 +-
 .../src/localization/messages_ru.js           |   16 +-
 .../src/localization/messages_sd.js           |   23 +
 .../src/localization/messages_si.js           |   16 +-
 .../src/localization/messages_sk.js           |   23 +-
 .../src/localization/messages_sl.js           |   16 +-
 .../src/localization/messages_sr.js           |   17 +-
 .../src/localization/messages_sr_lat.js       |   21 +-
 .../src/localization/messages_sv.js           |   20 +-
 .../src/localization/messages_th.js           |   16 +-
 .../src/localization/messages_tj.js           |   16 +-
 .../src/localization/messages_tr.js           |   17 +-
 .../src/localization/messages_uk.js           |   16 +-
 .../src/localization/messages_ur.js           |   23 +
 .../src/localization/messages_vi.js           |   16 +-
 .../src/localization/messages_zh.js           |   27 +-
 .../src/localization/messages_zh_TW.js        |   17 +-
 .../src/localization/methods_de.js            |   12 +-
 .../src/localization/methods_es_CL.js         |   12 +-
 .../src/localization/methods_fi.js            |   12 +-
 .../src/localization/methods_it.js            |   12 +
 .../src/localization/methods_nl.js            |   11 +-
 .../src/localization/methods_pt.js            |    8 +-
 .../jquery-validation/validation.jquery.json  |   10 +-
 civicrm/civicrm-version.php                   |    2 +-
 civicrm/composer.json                         |   11 +-
 civicrm/composer.lock                         |  147 +-
 .../sequentialcreditnotes.civix.php           |    2 +-
 civicrm/extern/url.php                        |    6 +-
 civicrm/install/civicrm.php                   |    4 +-
 civicrm/install/index.php                     |   10 +-
 civicrm/release-notes.md                      |   11 +
 civicrm/release-notes/5.25.0.md               |  844 ++++++++
 .../setup/plugins/blocks/requirements.tpl.php |    2 +-
 civicrm/setup/src/Setup/DrupalUtil.php        |    2 +-
 civicrm/setup/src/Setup/Model.php             |    6 +-
 .../setup/src/Setup/UI/SetupController.php    |    2 +-
 civicrm/sql/civicrm.mysql                     |   10 +-
 civicrm/sql/civicrm_data.mysql                |    2 +-
 civicrm/sql/civicrm_generated.mysql           |    2 +-
 civicrm/templates/CRM/Case/Audit/Report.tpl   |   10 +-
 .../CRM/Case/XMLProcessor/Report.tpl          |    2 +
 .../templates/CRM/Contact/Form/Task/Email.tpl |    2 +-
 .../CRM/Contribute/Form/AdditionalPayment.tpl |    2 +-
 .../Contribute/Form/CancelSubscription.tpl    |   14 +-
 .../CRM/Contribute/Form/Task/Status.tpl       |    5 +
 .../CRM/Contribute/Page/PaymentInfo.tpl       |   15 -
 civicrm/templates/CRM/Core/BillingBlock.tpl   |   16 +-
 .../CRM/Core/DatePickerRangeWrapper.tpl       |    4 +-
 .../CRM/Custom/Page/CustomDataView.tpl        |    2 +-
 .../Form/Checkout/ParticipantsAndPrices.tpl   |  145 +-
 .../CRM/Event/Cart/Form/Checkout/Payment.tpl  |   40 +-
 .../CRM/Event/Cart/Page/ViewCart.tpl          |   57 +-
 .../templates/CRM/Event/Page/ICalendar.tpl    |   44 -
 civicrm/templates/CRM/Event/Page/List.tpl     |   51 +
 .../templates/CRM/Member/Form/Membership.tpl  |   39 +-
 civicrm/templates/CRM/Member/Page/Tab.hlp     |    7 +
 .../CRM/Report/Form/Tabs/Filters.tpl          |    2 +-
 civicrm/templates/CRM/common/batchCopy.tpl    |    2 +-
 .../vendor/adrienrn/php-mimetyper/.gitignore  |    7 +
 .../php-mimetyper}/LICENSE                    |    5 +-
 .../vendor/adrienrn/php-mimetyper/README.md   |  115 ++
 .../adrienrn/php-mimetyper/composer.json      |   19 +
 .../adrienrn/php-mimetyper/package.json       |   27 +
 .../php-mimetyper/resources/custom-types.json |   32 +
 .../src/Repository/AbstractRepository.php     |   99 +
 .../src/Repository/CompositeRepository.php    |   77 +
 .../src/Repository/ExtendedRepository.php     |   28 +
 .../src/Repository/MimeDbRepository.php       |   54 +
 .../src/Repository/RepositoryInterface.php    |   47 +
 .../Symfony/ExtraMimeTypeExtensionGuesser.php |   63 +
 .../Symfony/MimeContentMimeTypeGuesser.php    |   68 +
 civicrm/vendor/autoload.php                   |    2 +-
 .../vendor/composer/autoload_namespaces.php   |    1 +
 civicrm/vendor/composer/autoload_psr4.php     |    2 +-
 civicrm/vendor/composer/autoload_real.php     |   14 +-
 civicrm/vendor/composer/autoload_static.php   |   25 +-
 civicrm/vendor/composer/installed.json        |  147 +-
 .../dflydev/apache-mime-types/.gitignore      |    2 +
 .../dflydev/apache-mime-types/.travis.yml     |   11 +
 .../dflydev/apache-mime-types/README.md       |  184 ++
 .../bin/rebuild-apache-mime-types             |    4 +
 .../bin/rebuild-apache-mime-types.php         |   47 +
 .../dflydev/apache-mime-types/composer.json   |   34 +
 .../apache-mime-types/phpunit.xml.dist        |   14 +
 .../resources/PhpRepository.twig              |   82 +
 .../ApacheMimeTypes/AbstractRepository.php    |  118 ++
 .../ApacheMimeTypes/ArrayRepository.php       |   48 +
 .../ApacheMimeTypes/CompositeRepository.php   |   96 +
 .../ApacheMimeTypes/FlatRepository.php        |   45 +
 .../ApacheMimeTypes/JsonRepository.php        |   43 +
 .../src/Dflydev/ApacheMimeTypes/Parser.php    |   45 +
 .../Dflydev/ApacheMimeTypes/PhpRepository.php | 1812 +++++++++++++++++
 .../ApacheMimeTypes/RepositoryInterface.php   |   52 +
 .../ApacheMimeTypes/Resources/mime.types      | 1588 +++++++++++++++
 .../ApacheMimeTypes/Resources/mime.types.json |    1 +
 .../vendor/katzien/php-mime-type/.gitignore   |    4 -
 .../vendor/katzien/php-mime-type/.travis.yml  |   18 -
 .../vendor/katzien/php-mime-type/README.md    |   45 -
 .../katzien/php-mime-type/composer.json       |   28 -
 .../vendor/katzien/php-mime-type/phpunit.sh   |    3 -
 .../vendor/katzien/php-mime-type/phpunit.xml  |   18 -
 .../katzien/php-mime-type/src/Mapping.php     |  985 ---------
 .../katzien/php-mime-type/src/MimeType.php    |   51 -
 civicrm/vendor/pear/mail/PATCHES.txt          |    7 +
 civicrm/xml/schema/ACL/Cache.xml              |    8 +
 .../xml/schema/Contact/DashboardContact.xml   |    2 +-
 civicrm/xml/schema/Contribute/Widget.xml      |   12 +-
 civicrm/xml/schema/Core/County.xml            |    5 +
 civicrm/xml/schema/Core/Dashboard.xml         |    1 +
 civicrm/xml/schema/Core/Discount.xml          |    5 +
 civicrm/xml/schema/Core/OpenID.xml            |    5 +
 civicrm/xml/schema/Core/PrintLabel.xml        |    2 +-
 civicrm/xml/schema/Core/Tag.xml               |    5 +
 civicrm/xml/schema/Mailing/BouncePattern.xml  |    5 +
 civicrm/xml/schema/Mailing/Mailing.xml        |    2 +-
 civicrm/xml/schema/Mailing/Spool.xml          |    2 +-
 civicrm/xml/schema/Report/ReportInstance.xml  |    2 +-
 civicrm/xml/version.xml                       |    2 +-
 includes/civicrm.compat.php                   |  154 --
 includes/civicrm.shortcodes.php               |    9 +-
 tests/phpunit/CiviWP/PhpVersionTest.php       |    7 +-
 wp-cli/civicrm.php                            |    7 +-
 979 files changed, 19247 insertions(+), 8170 deletions(-)
 create mode 100644 civicrm/CRM/Contact/Form/Task/EmailTrait.php
 rename civicrm/CRM/Event/{Page => }/ICalendar.php (59%)
 create mode 100644 civicrm/CRM/Event/Page/List.php
 create mode 100644 civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFive.php
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.0.mysql.tpl
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.1.mysql.tpl
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.2.mysql.tpl
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.3.mysql.tpl
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.4.mysql.tpl
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.5.mysql.tpl
 delete mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.24.6.mysql.tpl
 create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.25.0.mysql.tpl
 create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.25.alpha1.mysql.tpl
 create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.25.beta1.mysql.tpl
 create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.25.beta2.mysql.tpl
 create mode 100644 civicrm/CRM/Upgrade/Incremental/sql/5.25.beta3.mysql.tpl
 create mode 100644 civicrm/Civi/Api4/Dashboard.php
 rename civicrm/Civi/Api4/{Service/Spec/Provider/UFMatchCreationSpecProvider.php => DashboardContact.php} (58%)
 rename civicrm/Civi/Api4/Service/Spec/Provider/{StatusPreferenceCreationSpecProvider.php => FieldDomainIdSpecProvider.php} (67%)
 create mode 100644 civicrm/bower_components/jquery-validation/LICENSE.md
 create mode 100644 civicrm/bower_components/jquery-validation/dist/jquery-validation-sri.json
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ar.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ar.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_az.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_az.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_bg.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_bg.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ca.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ca.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_cs.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_cs.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_da.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_da.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_de.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_de.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_el.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_el.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_es.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_es.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_et.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_et.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_eu.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_eu.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_fa.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_fa.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_fi.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_fi.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_fr.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_fr.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ge.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ge.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_gl.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_gl.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_he.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_he.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_hr.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_hr.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_hu.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_hu.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_id.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_id.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_is.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_is.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_it.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_it.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ja.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ja.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ka.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ka.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_kk.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_kk.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ko.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ko.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_lt.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_lt.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_lv.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_lv.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_mk.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_mk.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_my.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_my.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_nl.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_nl.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_no.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_no.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_pl.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_pl.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ro.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ro.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ru.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ru.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sd.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sd.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_si.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_si.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sk.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sk.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sl.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sl.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sr.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sr.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sv.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_sv.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_th.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_th.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_tj.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_tj.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_tr.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_tr.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_uk.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_uk.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ur.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_ur.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_vi.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_vi.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_zh.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_zh.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_de.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_de.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_fi.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_fi.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_it.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_it.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_nl.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_nl.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_pt.js
 create mode 100644 civicrm/bower_components/jquery-validation/dist/localization/methods_pt.min.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/abaRoutingNumber.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/cnhBR.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/cnpjBR.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/cpfBR.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/creditcard.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/greaterThan.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/greaterThanEqual.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/lessThan.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/lessThanEqual.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/maxfiles.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/maxsize.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/maxsizetotal.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/mobileRU.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/netmask.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/nipPL.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/nisBR.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/notEqualTo.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/additional/phonePL.js
 delete mode 100644 civicrm/bower_components/jquery-validation/src/delegate.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_az.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_bn_BD.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_es_PE.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_ge.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_hy_AM.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_mk.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_sd.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/messages_ur.js
 create mode 100644 civicrm/bower_components/jquery-validation/src/localization/methods_it.js
 create mode 100644 civicrm/release-notes/5.25.0.md
 delete mode 100644 civicrm/templates/CRM/Event/Page/ICalendar.tpl
 create mode 100644 civicrm/templates/CRM/Event/Page/List.tpl
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/.gitignore
 rename civicrm/vendor/{katzien/php-mime-type => adrienrn/php-mimetyper}/LICENSE (95%)
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/README.md
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/composer.json
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/package.json
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/resources/custom-types.json
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Repository/AbstractRepository.php
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Repository/CompositeRepository.php
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Repository/ExtendedRepository.php
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Repository/MimeDbRepository.php
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Repository/RepositoryInterface.php
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/ExtraMimeTypeExtensionGuesser.php
 create mode 100644 civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/MimeContentMimeTypeGuesser.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/.gitignore
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/.travis.yml
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/README.md
 create mode 100755 civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/composer.json
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/phpunit.xml.dist
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/resources/PhpRepository.twig
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/AbstractRepository.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/ArrayRepository.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/CompositeRepository.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/FlatRepository.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/JsonRepository.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Parser.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/PhpRepository.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/RepositoryInterface.php
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types
 create mode 100644 civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types.json
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/.gitignore
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/.travis.yml
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/README.md
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/composer.json
 delete mode 100755 civicrm/vendor/katzien/php-mime-type/phpunit.sh
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/phpunit.xml
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/src/Mapping.php
 delete mode 100644 civicrm/vendor/katzien/php-mime-type/src/MimeType.php
 create mode 100644 civicrm/vendor/pear/mail/PATCHES.txt
 delete mode 100644 includes/civicrm.compat.php

diff --git a/civicrm.php b/civicrm.php
index a983c29156..efe3a9e01e 100644
--- a/civicrm.php
+++ b/civicrm.php
@@ -2,7 +2,7 @@
 /*
 Plugin Name: CiviCRM
 Description: CiviCRM - Growing and Sustaining Relationships
-Version: 5.24.6
+Version: 5.25.0
 Author: CiviCRM LLC
 Author URI: https://civicrm.org/
 Plugin URI: https://docs.civicrm.org/sysadmin/en/latest/install/wordpress/
@@ -54,7 +54,7 @@ if ( ! defined( 'ABSPATH' ) ) exit;
 
 
 // Set version here: when it changes, will force JS to reload
-define( 'CIVICRM_PLUGIN_VERSION', '5.24.6' );
+define( 'CIVICRM_PLUGIN_VERSION', '5.25.0' );
 
 // Store reference to this file
 if (!defined('CIVICRM_PLUGIN_FILE')) {
@@ -75,15 +75,16 @@ if ( !defined( 'CIVICRM_WP_PHP_MINIMUM' ) ) {
   /**
    * Minimum required PHP
    *
-   * Note: This duplicates CRM_Upgrade_Form::MINIMUM_PHP_VERSION. The
-   * duplication helps avoid dependency issues. (Reading `Form::MINIMUM_PHP_VERSION`
-   * requires loading `civicrm.settings.php`, but that triggers a parse-error
+   * Note: This duplicates CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER.
+   * The duplication helps avoid dependency issues. (Reading
+   * `CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER` requires loading
+   * `civicrm.settings.php`, but that triggers a parse-error
    * on PHP 5.x.)
    *
-   * @see CRM_Upgrade_Form::MINIMUM_PHP_VERSION
+   * @see CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER
    * @see CiviWP\PhpVersionTest::testConstantMatch()
    */
-  define( 'CIVICRM_WP_PHP_MINIMUM', '7.0.0' );
+  define( 'CIVICRM_WP_PHP_MINIMUM', '7.1.0' );
 }
 
 /*
@@ -203,15 +204,6 @@ class CiviCRM_For_WordPress {
    */
   public $users;
 
-  /**
-   * Compatibility object.
-   *
-   * @since 5.24
-   * @access public
-   * @var object CiviCRM_For_WordPress_Compat The plugin compatibility object.
-   */
-  public $compat;
-
 
   // ---------------------------------------------------------------------------
   // Setup
@@ -376,6 +368,9 @@ class CiviCRM_For_WordPress {
     if (empty($civicrm_paths['cms.root']['path'])) {
       $civicrm_paths['cms.root']['path'] = untrailingslashit(ABSPATH);
     }
+    if (empty($civicrm_paths['cms.root']['url'])) {
+      $civicrm_paths['cms.root']['url'] = home_url();
+    }
 
     // Get classes and instantiate
     $this->include_files();
@@ -532,10 +527,6 @@ class CiviCRM_For_WordPress {
     include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.basepage.php';
     $this->basepage = new CiviCRM_For_WordPress_Basepage;
 
-    // Include compatibility class
-    include_once CIVICRM_PLUGIN_DIR . 'includes/civicrm.compat.php';
-    $this->compat = new CiviCRM_For_WordPress_Compat;
-
     if ( ! class_exists( 'CiviCRM_WP_REST\Autoloader' ) ) {
       // Include REST API autoloader class
       require_once( CIVICRM_PLUGIN_DIR . 'wp-rest/Autoloader.php' );
@@ -822,12 +813,10 @@ class CiviCRM_For_WordPress {
      * Broadcast the rewrite rules event.
      *
      * @since 5.7
-     * @since 5.24 Added $basepage parameter.
      *
      * @param bool $flush_rewrite_rules True if rules flushed, false otherwise.
-     * @param WP_Post $basepage The Basepage post object.
      */
-    do_action( 'civicrm_after_rewrite_rules', $flush_rewrite_rules, $basepage );
+    do_action( 'civicrm_after_rewrite_rules', $flush_rewrite_rules );
 
   }
 
diff --git a/civicrm/CRM/ACL/BAO/ACL.php b/civicrm/CRM/ACL/BAO/ACL.php
index 9c7f99f128..3f86531474 100644
--- a/civicrm/CRM/ACL/BAO/ACL.php
+++ b/civicrm/CRM/ACL/BAO/ACL.php
@@ -30,7 +30,7 @@ class CRM_ACL_BAO_ACL extends CRM_ACL_DAO_ACL {
 
   /**
    * Get ACL entity table.
-   *
+   * @deprecated
    * @return array|null
    */
   public static function entityTable() {
@@ -46,6 +46,7 @@ class CRM_ACL_BAO_ACL extends CRM_ACL_DAO_ACL {
 
   /**
    * @return array|null
+   * @deprecated
    */
   public static function objectTable() {
     CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
@@ -88,6 +89,7 @@ class CRM_ACL_BAO_ACL extends CRM_ACL_DAO_ACL {
    *   The ID of the object.
    * @param array $tables
    *   Tables that will be needed in the FROM.
+   * @deprecated
    *
    * @return string|null
    *   WHERE-style clause to filter results,
@@ -160,11 +162,10 @@ class CRM_ACL_BAO_ACL extends CRM_ACL_DAO_ACL {
 
     $rule = new CRM_ACL_BAO_ACL();
 
-    $acl = self::getTableName();
     $contact = CRM_Contact_BAO_Contact::getTableName();
 
     $query = " SELECT acl.*
-      FROM $acl acl
+      FROM civicrm_acl acl
       WHERE   acl.entity_table   = '$contact'
       AND acl.entity_id      = $contact_id";
 
@@ -232,7 +233,6 @@ class CRM_ACL_BAO_ACL extends CRM_ACL_DAO_ACL {
 
     $rule = new CRM_ACL_BAO_ACL();
 
-    $acl = self::getTableName();
     $c2g = CRM_Contact_BAO_GroupContact::getTableName();
     $group = CRM_Contact_BAO_Group::getTableName();
     $results = [];
@@ -240,7 +240,7 @@ class CRM_ACL_BAO_ACL extends CRM_ACL_DAO_ACL {
     if ($contact_id) {
       $query = "
 SELECT      acl.*
-  FROM      $acl acl
+  FROM      civicrm_acl acl
  INNER JOIN  $c2g group_contact
         ON  acl.entity_id      = group_contact.group_id
      WHERE  acl.entity_table   = '$group'
@@ -277,14 +277,13 @@ SELECT      acl.*
 
     $rule = new CRM_ACL_BAO_ACL();
 
-    $acl = self::getTableName();
     $aclRole = 'civicrm_acl_role';
 
     $aclER = CRM_ACL_DAO_EntityRole::getTableName();
     $c2g = CRM_Contact_BAO_GroupContact::getTableName();
 
     $query = "   SELECT          acl.*
-                        FROM            $acl acl
+                        FROM            civicrm_acl acl
                         INNER JOIN      civicrm_option_group og
                                 ON      og.name = 'acl_role'
                         INNER JOIN      civicrm_option_value ov
@@ -321,7 +320,7 @@ SELECT      acl.*
 
     $query = "
 SELECT acl.*
-  FROM $acl acl
+  FROM civicrm_acl acl
  WHERE acl.entity_id      IN ( $roles )
    AND acl.entity_table   = 'civicrm_acl_role'
 ";
@@ -426,7 +425,7 @@ SELECT count( a.id )
     $params = [1 => [$str, 'String']];
 
     $count = CRM_Core_DAO::singleValueQuery($query, $params);
-    return ($count) ? TRUE : FALSE;
+    return (bool) $count;
   }
 
   /**
diff --git a/civicrm/CRM/ACL/DAO/ACLCache.php b/civicrm/CRM/ACL/DAO/ACLCache.php
index 49daef0619..958223b878 100644
--- a/civicrm/CRM/ACL/DAO/ACLCache.php
+++ b/civicrm/CRM/ACL/DAO/ACLCache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/ACL/ACLCache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6c22da308c28e1b6766087c3073112a0)
+ * (GenCodeChecksum:976ef3393c10c32cacd6c6405b892533)
  */
 
 /**
@@ -111,6 +111,9 @@ class CRM_ACL_DAO_ACLCache extends CRM_Core_DAO {
           'bao' => 'CRM_ACL_DAO_ACLCache',
           'localizable' => 0,
           'FKClassName' => 'CRM_Contact_DAO_Contact',
+          'html' => [
+            'type' => 'EntityRef',
+          ],
         ],
         'acl_id' => [
           'name' => 'acl_id',
@@ -124,6 +127,11 @@ class CRM_ACL_DAO_ACLCache extends CRM_Core_DAO {
           'bao' => 'CRM_ACL_DAO_ACLCache',
           'localizable' => 0,
           'FKClassName' => 'CRM_ACL_DAO_ACL',
+          'pseudoconstant' => [
+            'table' => 'civicrm_acl',
+            'keyColumn' => 'id',
+            'labelColumn' => 'name',
+          ],
         ],
         'modified_date' => [
           'name' => 'modified_date',
diff --git a/civicrm/CRM/ACL/Page/ACL.php b/civicrm/CRM/ACL/Page/ACL.php
index fabb7de425..7816abcfe0 100644
--- a/civicrm/CRM/ACL/Page/ACL.php
+++ b/civicrm/CRM/ACL/Page/ACL.php
@@ -135,7 +135,7 @@ ORDER BY entity_id
       $acl[$dao->id]['is_active'] = $dao->is_active;
 
       if ($acl[$dao->id]['entity_id']) {
-        $acl[$dao->id]['entity'] = CRM_Utils_Array::value($acl[$dao->id]['entity_id'], $roles);
+        $acl[$dao->id]['entity'] = $roles[$acl[$dao->id]['entity_id']] ?? NULL;
       }
       else {
         $acl[$dao->id]['entity'] = ts('Everyone');
@@ -143,22 +143,22 @@ ORDER BY entity_id
 
       switch ($acl[$dao->id]['object_table']) {
         case 'civicrm_saved_search':
-          $acl[$dao->id]['object'] = CRM_Utils_Array::value($acl[$dao->id]['object_id'], $group);
+          $acl[$dao->id]['object'] = $group[$acl[$dao->id]['object_id']] ?? NULL;
           $acl[$dao->id]['object_name'] = ts('Group');
           break;
 
         case 'civicrm_uf_group':
-          $acl[$dao->id]['object'] = CRM_Utils_Array::value($acl[$dao->id]['object_id'], $ufGroup);
+          $acl[$dao->id]['object'] = $ufGroup[$acl[$dao->id]['object_id']] ?? NULL;
           $acl[$dao->id]['object_name'] = ts('Profile');
           break;
 
         case 'civicrm_custom_group':
-          $acl[$dao->id]['object'] = CRM_Utils_Array::value($acl[$dao->id]['object_id'], $customGroup);
+          $acl[$dao->id]['object'] = $customGroup[$acl[$dao->id]['object_id']] ?? NULL;
           $acl[$dao->id]['object_name'] = ts('Custom Group');
           break;
 
         case 'civicrm_event':
-          $acl[$dao->id]['object'] = CRM_Utils_Array::value($acl[$dao->id]['object_id'], $event);
+          $acl[$dao->id]['object'] = $event[$acl[$dao->id]['object_id']] ?? NULL;
           $acl[$dao->id]['object_name'] = ts('Event');
           break;
       }
diff --git a/civicrm/CRM/ACL/Page/ACLBasic.php b/civicrm/CRM/ACL/Page/ACLBasic.php
index 0129f03906..ff643d0890 100644
--- a/civicrm/CRM/ACL/Page/ACLBasic.php
+++ b/civicrm/CRM/ACL/Page/ACLBasic.php
@@ -114,7 +114,7 @@ ORDER BY entity_id
         $acl[$dao->entity_id]['name'] = $dao->name;
         $acl[$dao->entity_id]['entity_id'] = $dao->entity_id;
         $acl[$dao->entity_id]['entity_table'] = $dao->entity_table;
-        $acl[$dao->entity_id]['object_table'] = CRM_Utils_Array::value($dao->object_table, $permissions);
+        $acl[$dao->entity_id]['object_table'] = $permissions[$dao->object_table] ?? NULL;
         $acl[$dao->entity_id]['is_active'] = 1;
 
         if ($acl[$dao->entity_id]['entity_id']) {
diff --git a/civicrm/CRM/ACL/Page/EntityRole.php b/civicrm/CRM/ACL/Page/EntityRole.php
index 3b2ca6d762..0e7b5b8097 100644
--- a/civicrm/CRM/ACL/Page/EntityRole.php
+++ b/civicrm/CRM/ACL/Page/EntityRole.php
@@ -127,7 +127,7 @@ class CRM_ACL_Page_EntityRole extends CRM_Core_Page_Basic {
       $entityRoles[$dao->id] = [];
       CRM_Core_DAO::storeValues($dao, $entityRoles[$dao->id]);
 
-      $entityRoles[$dao->id]['acl_role'] = CRM_Utils_Array::value($dao->acl_role_id, $aclRoles);
+      $entityRoles[$dao->id]['acl_role'] = $aclRoles[$dao->acl_role_id] ?? NULL;
       $entityRoles[$dao->id]['entity'] = $groups[$dao->entity_id];
 
       // form all action links
diff --git a/civicrm/CRM/Activity/BAO/Activity.php b/civicrm/CRM/Activity/BAO/Activity.php
index 88a5216204..fb2b1c0d80 100644
--- a/civicrm/CRM/Activity/BAO/Activity.php
+++ b/civicrm/CRM/Activity/BAO/Activity.php
@@ -150,11 +150,11 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
 
     $transaction = new CRM_Core_Transaction();
     $sqlWhereParams = $where = [];
-    if (is_array(CRM_Utils_Array::value('source_record_id', $params))) {
+    if (isset($params['source_record_id']) && is_array($params['source_record_id'])) {
       $sourceRecordIds = implode(',', $params['source_record_id']);
     }
     else {
-      $sourceRecordIds = CRM_Utils_Array::value('source_record_id', $params);
+      $sourceRecordIds = $params['source_record_id'] ?? NULL;
     }
 
     if ($sourceRecordIds) {
@@ -492,7 +492,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
     }
     else {
       // at worst, take source for recently viewed display
-      $recentContactId = CRM_Utils_Array::value('source_contact_id', $params);
+      $recentContactId = $params['source_contact_id'] ?? NULL;
     }
 
     if (isset($params['assignee_contact_id'])) {
@@ -584,7 +584,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
 
     // if the subject contains a ‘[case #…]’ string, file that activity on the related case (CRM-5916)
     $matches = [];
-    $subjectToMatch = CRM_Utils_Array::value('subject', $params);
+    $subjectToMatch = $params['subject'] ?? NULL;
     if (preg_match('/\[case #([0-9a-h]{7})\]/', $subjectToMatch, $matches)) {
       $key = CRM_Core_DAO::escapeString(CIVICRM_SITE_KEY);
       $hash = $matches[1];
@@ -620,7 +620,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
    *
    * @todo elaborate on what this does.
    *
-   * @param CRM_Core_DAO_Activity $activity
+   * @param CRM_Activity_DAO_Activity $activity
    * @param string $logMessage
    *
    * @return bool
@@ -751,15 +751,15 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
     foreach ($result as $id => $activity) {
       $activities[$id] = [
         'activity_id' => $activity['id'],
-        'activity_date_time' => CRM_Utils_Array::value('activity_date_time', $activity),
-        'subject' => CRM_Utils_Array::value('subject', $activity),
-        'assignee_contact_name' => CRM_Utils_Array::value('assignee_contact_sort_name', $activity, []),
-        'source_contact_id' => CRM_Utils_Array::value('source_contact_id', $activity),
-        'source_contact_name' => CRM_Utils_Array::value('source_contact_sort_name', $activity),
+        'activity_date_time' => $activity['activity_date_time'] ?? NULL,
+        'subject' => $activity['subject'] ?? NULL,
+        'assignee_contact_name' => $activity['assignee_contact_sort_name'] ?? [],
+        'source_contact_id' => $activity['source_contact_id'] ?? NULL,
+        'source_contact_name' => $activity['source_contact_sort_name'] ?? NULL,
       ];
       $activities[$id]['activity_type_name'] = CRM_Core_PseudoConstant::getName('CRM_Activity_BAO_Activity', 'activity_type_id', $activity['activity_type_id']);
       $activities[$id]['activity_type'] = CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $activity['activity_type_id']);
-      $activities[$id]['target_contact_count'] = CRM_Utils_Array::value('target_contact_count', $activity, 0);
+      $activities[$id]['target_contact_count'] = $activity['target_contact_count'] ?? 0;
       if (!empty($activity['target_contact_count'])) {
         $displayedTarget = civicrm_api3('ActivityContact', 'get', [
           'activity_id' => $id,
@@ -806,7 +806,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
         }
         // case related fields
         elseif ($apiKey == 'case_id' && !$isBulkActivity) {
-          $activities[$id][$expectedName] = CRM_Utils_Array::value($apiKey, $activity);
+          $activities[$id][$expectedName] = $activity[$apiKey] ?? NULL;
 
           // fetch case subject for case ID found
           if (!empty($activity['case_id'])) {
@@ -817,9 +817,9 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
         }
         else {
           // @todo this generic assign could just be handled in array declaration earlier.
-          $activities[$id][$expectedName] = CRM_Utils_Array::value($apiKey, $activity);
+          $activities[$id][$expectedName] = $activity[$apiKey] ?? NULL;
           if ($apiKey == 'campaign_id') {
-            $activities[$id]['campaign'] = CRM_Utils_Array::value($activities[$id][$expectedName], $allCampaigns);
+            $activities[$id]['campaign'] = $allCampaigns[$activities[$id][$expectedName]] ?? NULL;
           }
         }
       }
@@ -1358,7 +1358,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
         $smsProviderParams['To'] = '';
       }
 
-      $doNotSms = CRM_Utils_Array::value('do_not_sms', $contact, 0);
+      $doNotSms = $contact['do_not_sms'] ?? 0;
 
       if ($doNotSms) {
         $errMsgs[] = PEAR::raiseError('Contact Does not accept SMS', NULL, PEAR_ERROR_RETURN);
@@ -1429,7 +1429,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       // To get primary mobile phonenumber, if not get the first mobile phonenumber
       if (!empty($toPhoneNumbers)) {
         $toPhoneNumberDetails = reset($toPhoneNumbers);
-        $toPhoneNumber = CRM_Utils_Array::value('phone', $toPhoneNumberDetails);
+        $toPhoneNumber = $toPhoneNumberDetails['phone'] ?? NULL;
         // Contact allows to send sms
       }
     }
@@ -1831,6 +1831,7 @@ WHERE      activity.id IN ($activityIds)";
    *
    * @return int
    *   Id of parent activity otherwise false.
+   * @throws \CRM_Core_Exception
    */
   public static function getParentActivity($activityId) {
     static $parentActivities = [];
@@ -1856,11 +1857,13 @@ WHERE      activity.id IN ($activityIds)";
    *
    * @param $activityID
    *   Current activity id.
-   *
+   * @deprecated
    * @return int
    *   $params  count of prior activities otherwise false.
+   * @throws \CRM_Core_Exception
    */
   public static function getPriorCount($activityID) {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
     static $priorCounts = [];
 
     $activityID = CRM_Utils_Type::escape($activityID, 'Integer');
@@ -1898,6 +1901,7 @@ AND id < {$activityID}
    *
    * @return array
    *   prior activities info.
+   * @throws \CRM_Core_Exception
    */
   public static function getPriorAcitivities($activityID, $onlyPriorRevisions = FALSE) {
     static $priorActivities = [];
@@ -1950,6 +1954,8 @@ AND cl.modified_id  = c.id
    *
    * @return int
    *   current activity id.
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function getLatestActivityId($activityID) {
     static $latestActivityIds = [];
@@ -1967,7 +1973,7 @@ AND cl.modified_id  = c.id
         $activityID = $originalID;
       }
       $params = [1 => [$activityID, 'Integer']];
-      $query = "SELECT id from civicrm_activity where original_id = %1 and is_current_revision = 1";
+      $query = 'SELECT id from civicrm_activity where original_id = %1 and is_current_revision = 1';
 
       $latestActivityIds[$activityID] = CRM_Core_DAO::singleValueQuery($query, $params);
     }
@@ -1983,6 +1989,8 @@ AND cl.modified_id  = c.id
    * @param array $params
    *
    * @return CRM_Activity_BAO_Activity|null|object
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function createFollowupActivity($activityId, $params) {
     if (!$activityId) {
@@ -1996,8 +2004,8 @@ AND cl.modified_id  = c.id
 
     $followupParams['activity_type_id'] = $params['followup_activity_type_id'];
     // Get Subject of Follow-up Activiity, CRM-4491
-    $followupParams['subject'] = CRM_Utils_Array::value('followup_activity_subject', $params);
-    $followupParams['assignee_contact_id'] = CRM_Utils_Array::value('followup_assignee_contact_id', $params);
+    $followupParams['subject'] = $params['followup_activity_subject'] ?? NULL;
+    $followupParams['assignee_contact_id'] = $params['followup_assignee_contact_id'] ?? NULL;
 
     // Create target contact for followup.
     if (!empty($params['target_contact_id'])) {
@@ -2070,6 +2078,7 @@ AND cl.modified_id  = c.id
    * @param int $type
    *
    * @return array
+   * @throws \CiviCRM_API3_Exception
    */
   public static function getStatusesByType($type) {
     if (!isset(Civi::$statics[__CLASS__][__FUNCTION__])) {
@@ -2095,6 +2104,7 @@ AND cl.modified_id  = c.id
    * @param array $activity
    *
    * @return bool
+   * @throws \CiviCRM_API3_Exception
    */
   public static function isOverdue($activity) {
     return array_key_exists($activity['status_id'], self::getStatusesByType(self::INCOMPLETE)) && CRM_Utils_Date::overdue($activity['activity_date_time']);
@@ -2450,11 +2460,11 @@ INNER JOIN  civicrm_option_group grp ON (grp.id = option_group_id AND grp.name =
       'is_deleted' => 0,
       'is_current_revision' => 1,
       'is_test' => 0,
-      'contact_id' => CRM_Utils_Array::value('contact_id', $params),
-      'activity_date_time' => CRM_Utils_Array::value('activity_date_time', $params),
+      'contact_id' => $params['contact_id'] ?? NULL,
+      'activity_date_time' => $params['activity_date_time'] ?? NULL,
       'check_permissions' => 1,
       'options' => [
-        'offset' => CRM_Utils_Array::value('offset', $params, 0),
+        'offset' => $params['offset'] ?? 0,
       ],
     ];
 
@@ -2515,9 +2525,9 @@ INNER JOIN  civicrm_option_group grp ON (grp.id = option_group_id AND grp.name =
     // Format the params.
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['rowCount'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
     $params['caseId'] = NULL;
-    $context = CRM_Utils_Array::value('context', $params);
+    $context = $params['context'] ?? NULL;
     $showContactOverlay = !CRM_Utils_String::startsWith($context, "dashlet");
     $activityTypeInfo = civicrm_api3('OptionValue', 'get', [
       'option_group_id' => "activity_type",
@@ -2889,8 +2899,8 @@ INNER JOIN  civicrm_option_group grp ON (grp.id = option_group_id AND grp.name =
    */
   public static function sendToAssignee($activity, $mailToContacts, $params = []) {
     if (!CRM_Utils_Array::crmIsEmptyArray($mailToContacts)) {
-      $clientID = CRM_Utils_Array::value('client_id', $params);
-      $caseID = CRM_Utils_Array::value('case_id', $params);
+      $clientID = $params['client_id'] ?? NULL;
+      $caseID = $params['case_id'] ?? NULL;
 
       $ics = new CRM_Activity_BAO_ICalendar($activity);
       $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_activity', $activity->id);
diff --git a/civicrm/CRM/Activity/BAO/ActivityType.php b/civicrm/CRM/Activity/BAO/ActivityType.php
index c971500511..3a27f8275a 100644
--- a/civicrm/CRM/Activity/BAO/ActivityType.php
+++ b/civicrm/CRM/Activity/BAO/ActivityType.php
@@ -74,8 +74,8 @@ class CRM_Activity_BAO_ActivityType {
       $displayLabels = CRM_Core_OptionGroup::values('activity_type', FALSE, FALSE, FALSE, 'AND v.value = ' . $activity_type_id, 'label');
 
       $this->_activityType = [
-        'machineName' => CRM_Utils_Array::value($activity_type_id, $machineNames),
-        'displayLabel' => CRM_Utils_Array::value($activity_type_id, $displayLabels),
+        'machineName' => $machineNames[$activity_type_id] ?? NULL,
+        'displayLabel' => $displayLabels[$activity_type_id] ?? NULL,
         'id' => $activity_type_id,
       ];
     }
diff --git a/civicrm/CRM/Activity/BAO/Query.php b/civicrm/CRM/Activity/BAO/Query.php
index 15b6c407af..808b672e45 100644
--- a/civicrm/CRM/Activity/BAO/Query.php
+++ b/civicrm/CRM/Activity/BAO/Query.php
@@ -132,7 +132,7 @@ class CRM_Activity_BAO_Query {
       $query->_tables['civicrm_activity'] = $query->_whereTables['civicrm_activity'] = 1;
     }
 
-    if (CRM_Utils_Array::value('parent_id', $query->_returnProperties)) {
+    if (!empty($query->_returnProperties['parent_id'])) {
       $query->_tables['parent_id'] = 1;
       $query->_whereTables['parent_id'] = 1;
       $query->_element['parent_id'] = 1;
@@ -180,19 +180,16 @@ class CRM_Activity_BAO_Query {
 
     $fields = CRM_Activity_BAO_Activity::exportableFields();
     $fieldSpec = $query->getFieldSpec($name);
+
     $query->_tables['civicrm_activity'] = $query->_whereTables['civicrm_activity'] = 1;
     if ($query->_mode & CRM_Contact_BAO_Query::MODE_ACTIVITY) {
       $query->_skipDeleteClause = TRUE;
     }
-    // @todo we want to do this in a more metadata driven way, and also in contribute.
-    // But for the rc...
-    $namesToConvert = [
-      'activity_status' => 'activity_status_id',
-    ];
-    $name = $namesToConvert[$name] ?? $name;
 
     switch ($name) {
+      case 'activity_type':
       case 'activity_type_id':
+      case 'activity_status':
       case 'activity_status_id':
       case 'activity_engagement_level':
       case 'activity_id':
@@ -201,42 +198,14 @@ class CRM_Activity_BAO_Query {
         // We no longer expect "subject" as a specific criteria (as of CRM-19447),
         // but we still use activity_subject in Activity.Get API
       case 'activity_subject':
-
-        $qillName = $name;
-        if (in_array($name, ['activity_engagement_level', 'activity_id'])) {
-          $name = $qillName = str_replace('activity_', '', $name);
-        }
-        if (in_array($name, [
-          'activity_subject',
-          'activity_priority_id',
-        ])) {
-          $name = str_replace('activity_', '', $name);
-          $qillName = str_replace('_id', '', $qillName);
-        }
-        if ($name == 'activity_campaign_id') {
-          $name = 'campaign_id';
-        }
-
-        $dataType = !empty($fields[$qillName]['type']) ? CRM_Utils_Type::typeToString($fields[$qillName]['type']) : 'String';
-
-        $where = $fieldSpec['where'];
-        if (!$where) {
-          $where = 'civicrm_activity.' . $name;
-        }
-        $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($where, $op, $value, $dataType);
-        list($op, $value) = CRM_Contact_BAO_Query::buildQillForFieldValue('CRM_Activity_DAO_Activity', $name, $value, $op);
-        $query->_qill[$grouping][] = ts('%1 %2 %3', [
-          1 => $fields[$qillName]['title'],
-          2 => $op,
-          3 => $value,
-        ]);
+        $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($fieldSpec['where'], $op, $value, CRM_Utils_Type::typeToString($fieldSpec['type']));
+        $query->_qill[$grouping][]  = $query->getQillForField($fieldSpec['is_pseudofield_for'] ?? $fieldSpec['name'], $value, $op, $fieldSpec);
         break;
 
       case 'activity_text':
         self::whereClauseSingleActivityText($values, $query);
         break;
 
-      case 'activity_type':
       case 'activity_priority':
         $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("$name.label", $op, $value, 'String');
         list($op, $value) = CRM_Contact_BAO_Query::buildQillForFieldValue('CRM_Activity_DAO_Activity', $name, $value, $op);
diff --git a/civicrm/CRM/Activity/Form/Activity.php b/civicrm/CRM/Activity/Form/Activity.php
index 84880f2c02..f208f8ff6c 100644
--- a/civicrm/CRM/Activity/Form/Activity.php
+++ b/civicrm/CRM/Activity/Form/Activity.php
@@ -227,14 +227,11 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
 
   /**
    * Build the form object.
+   *
+   * @throws \CRM_Core_Exception
    */
   public function preProcess() {
     CRM_Core_Form_RecurringEntity::preProcess('civicrm_activity');
-    $this->_atypefile = CRM_Utils_Array::value('atypefile', $_GET);
-    $this->assign('atypefile', FALSE);
-    if ($this->_atypefile) {
-      $this->assign('atypefile', TRUE);
-    }
 
     $session = CRM_Core_Session::singleton();
     $this->_currentUserId = CRM_Core_Session::getLoggedInContactID();
@@ -276,7 +273,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     // if we're not adding new one, there must be an id to
     // an activity we're trying to work on.
     if ($this->_action != CRM_Core_Action::ADD &&
-      get_class($this->controller) != 'CRM_Contact_Controller_Search'
+      get_class($this->controller) !== 'CRM_Contact_Controller_Search'
     ) {
       $this->_activityId = CRM_Utils_Request::retrieve('id', 'Positive', $this);
     }
@@ -315,7 +312,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     // Check the mode when this form is called either single or as
     // search task action.
     if ($this->_activityTypeId ||
-      $this->_context == 'standalone' ||
+      $this->_context === 'standalone' ||
       $this->_currentlyViewedContactId
     ) {
       $this->_single = TRUE;
@@ -386,7 +383,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       $qfKey = NULL;
     }
 
-    if ($this->_context == 'fulltext') {
+    if ($this->_context === 'fulltext') {
       $keyName = '&qfKey';
       $urlParams = 'force=1';
       $urlString = 'civicrm/contact/search/custom';
@@ -410,21 +407,21 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       $urlParams = 'reset=1';
       $urlString = 'civicrm/dashboard';
     }
-    elseif ($this->_context == 'search') {
+    elseif ($this->_context === 'search') {
       $urlParams = 'force=1';
       if ($qfKey) {
         $urlParams .= "&qfKey=$qfKey";
       }
       $path = CRM_Utils_System::currentPath();
-      if ($this->_compContext == 'advanced') {
+      if ($this->_compContext === 'advanced') {
         $urlString = 'civicrm/contact/search/advanced';
       }
-      elseif ($path == 'civicrm/group/search'
-        || $path == 'civicrm/contact/search'
-        || $path == 'civicrm/contact/search/advanced'
-        || $path == 'civicrm/contact/search/custom'
-        || $path == 'civicrm/group/search'
-        || $path == 'civicrm/contact/search/builder'
+      elseif ($path === 'civicrm/group/search'
+        || $path === 'civicrm/contact/search'
+        || $path === 'civicrm/contact/search/advanced'
+        || $path === 'civicrm/contact/search/custom'
+        || $path === 'civicrm/group/search'
+        || $path === 'civicrm/contact/search/builder'
       ) {
         $urlString = $path;
       }
@@ -433,7 +430,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       }
       $this->assign('searchKey', $qfKey);
     }
-    elseif ($this->_context != 'caseActivity') {
+    elseif ($this->_context !== 'caseActivity') {
       $urlParams = "action=browse&reset=1&cid={$this->_currentlyViewedContactId}&selectedChild=activity";
       $urlString = 'civicrm/contact/view';
     }
@@ -444,7 +441,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
 
     // hack to retrieve activity type id from post variables
     if (!$this->_activityTypeId) {
-      $this->_activityTypeId = CRM_Utils_Array::value('activity_type_id', $_POST);
+      $this->_activityTypeId = $_POST['activity_type_id'] ?? NULL;
     }
 
     // when custom data is included in this page
@@ -530,7 +527,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     // if we're editing...
     if (isset($this->_activityId)) {
 
-      if ($this->_context != 'standalone') {
+      if ($this->_context !== 'standalone') {
         $this->assign('target_contact_value',
           CRM_Utils_Array::value('target_contact_value', $defaults)
         );
@@ -540,8 +537,8 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       }
 
       // Fixme: why are we getting the wrong keys from upstream?
-      $defaults['target_contact_id'] = CRM_Utils_Array::value('target_contact', $defaults);
-      $defaults['assignee_contact_id'] = CRM_Utils_Array::value('assignee_contact', $defaults);
+      $defaults['target_contact_id'] = $defaults['target_contact'] ?? NULL;
+      $defaults['assignee_contact_id'] = $defaults['assignee_contact'] ?? NULL;
 
       // set default tags if exists
       $defaults['tag'] = implode(',', CRM_Core_BAO_EntityTag::getTag($this->_activityId, 'civicrm_activity'));
@@ -629,7 +626,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     // Enable form element (ActivityLinks sets this true).
     $this->assign('suppressForm', FALSE);
 
-    $element = &$this->add('select', 'activity_type_id', ts('Activity Type'),
+    $element = $this->add('select', 'activity_type_id', ts('Activity Type'),
       ['' => '- ' . ts('select') . ' -'] + $this->_fields['followup_activity_type_id']['attributes'],
       FALSE, [
         'onchange' => "CRM.buildCustomData( 'Activity', this.value, false, false, false, false, false, false, {$this->_currentlyViewedContactId});",
@@ -649,13 +646,13 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
 
     foreach ($this->_fields as $field => $values) {
       if (!empty($this->_fields[$field])) {
-        $attribute = CRM_Utils_Array::value('attributes', $values);
+        $attribute = $values['attributes'] ?? NULL;
         $required = !empty($values['required']);
 
-        if ($values['type'] == 'select' && empty($attribute)) {
+        if ($values['type'] === 'select' && empty($attribute)) {
           $this->addSelect($field, ['entity' => 'activity'], $required);
         }
-        elseif ($values['type'] == 'entityRef') {
+        elseif ($values['type'] === 'entityRef') {
           $this->addEntityRef($field, $values['label'], $attribute, $required);
         }
         else {
@@ -731,7 +728,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     $this->add('datepicker', 'followup_date', ts('in'));
 
     // Only admins and case-workers can change the activity source
-    if (!CRM_Core_Permission::check('administer CiviCRM') && $this->_context != 'caseActivity') {
+    if (!CRM_Core_Permission::check('administer CiviCRM') && $this->_context !== 'caseActivity') {
       $this->getElement('source_contact_id')->freeze();
     }
 
@@ -823,7 +820,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
    */
   public static function formRule($fields, $files, $self) {
     // skip form rule if deleting
-    if (CRM_Utils_Array::value('_qf_Activity_next_', $fields) == 'Delete') {
+    if (($fields['_qf_Activity_next_'] ?? NULL) === 'Delete') {
       return TRUE;
     }
     $errors = [];
@@ -831,8 +828,8 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       $errors['activity_type_id'] = ts('Activity Type is a required field');
     }
 
-    $activity_type_id = CRM_Utils_Array::value('activity_type_id', $fields);
-    $activity_status_id = CRM_Utils_Array::value('status_id', $fields);
+    $activity_type_id = $fields['activity_type_id'] ?? NULL;
+    $activity_status_id = $fields['status_id'] ?? NULL;
     $scheduled_status_id = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'status_id', 'Scheduled');
 
     if ($activity_type_id && $activity_status_id == $scheduled_status_id) {
@@ -958,7 +955,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       $this->_activityId
     );
 
-    $params['is_multi_activity'] = CRM_Utils_Array::value('separation', $params) == 'separate';
+    $params['is_multi_activity'] = ($params['separation'] ?? NULL) === 'separate';
 
     $activity = [];
     if (!empty($params['is_multi_activity']) &&
@@ -977,7 +974,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     }
 
     // Redirect to contact page or activity view in standalone mode
-    if ($this->_context == 'standalone') {
+    if ($this->_context === 'standalone') {
       if (count($params['target_contact_id']) == 1) {
         $url = CRM_Utils_System::url('civicrm/contact/view', ['cid' => CRM_Utils_Array::first($params['target_contact_id']), 'selectedChild' => 'activity']);
       }
@@ -1038,6 +1035,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
    *   Associated array of submitted values.
    *
    * @return self|null|object
+   * @throws \CRM_Core_Exception
    */
   protected function processActivity(&$params) {
     $activityAssigned = [];
@@ -1161,8 +1159,11 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
 
   /**
    * Shorthand for getting id by display name (makes code more readable)
-   * @param $displayName
+   *
+   * @param string $displayName
+   *
    * @return null|string
+   * @throws \CRM_Core_Exception
    */
   protected function _getIdByDisplayName($displayName) {
     return CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
@@ -1174,8 +1175,11 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
 
   /**
    * Shorthand for getting display name by id (makes code more readable)
-   * @param $id
+   *
+   * @param int $id
+   *
    * @return null|string
+   * @throws \CRM_Core_Exception
    */
   protected function _getDisplayNameById($id) {
     return CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
@@ -1237,7 +1241,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
       // Set title.
       if (isset($activityTypeDisplayLabels)) {
         // FIXME - it's not clear why the if line just above is needed here and why we can't just set this once above and re-use. What is interesting, but can't possibly be the reason, is that the first if block will fail if the label is the string '0', whereas this one won't. But who would have an activity type called '0'?
-        $activityTypeDisplayLabel = CRM_Utils_Array::value($this->_activityTypeId, $activityTypeDisplayLabels);
+        $activityTypeDisplayLabel = $activityTypeDisplayLabels[$this->_activityTypeId] ?? NULL;
 
         if ($this->_currentlyViewedContactId) {
           $displayName = CRM_Contact_BAO_Contact::displayName($this->_currentlyViewedContactId);
diff --git a/civicrm/CRM/Activity/Form/ActivityView.php b/civicrm/CRM/Activity/Form/ActivityView.php
index 3ef07b7aa1..172ff26c39 100644
--- a/civicrm/CRM/Activity/Form/ActivityView.php
+++ b/civicrm/CRM/Activity/Form/ActivityView.php
@@ -54,16 +54,12 @@ class CRM_Activity_Form_ActivityView extends CRM_Core_Form {
     $params = ['id' => $activityId];
     CRM_Activity_BAO_Activity::retrieve($params, $defaults);
 
-    // Set activity type name and description to template.
-    list($activityTypeName, $activityTypeDescription) = CRM_Core_BAO_OptionValue::getActivityTypeDetails($defaults['activity_type_id']);
-
-    // activityTypeName - dev/core#1116-unknown-if-ok
-    // It seems like activityTypeName is no longer used? Description is still used though. See PR notes for more details.
-    $this->assign('activityTypeName', $activityTypeName);
+    // Send activity type description to template.
+    list(, $activityTypeDescription) = CRM_Core_BAO_OptionValue::getActivityTypeDetails($defaults['activity_type_id']);
     $this->assign('activityTypeDescription', $activityTypeDescription);
 
     if (!empty($defaults['mailingId'])) {
-      $this->_mailing_id = CRM_Utils_Array::value('source_record_id', $defaults);
+      $this->_mailing_id = $defaults['source_record_id'] ?? NULL;
       $mailingReport = CRM_Mailing_BAO_Mailing::report($this->_mailing_id, TRUE);
       CRM_Mailing_BAO_Mailing::getMailingContent($mailingReport, $this);
       $this->assign('mailingReport', $mailingReport);
diff --git a/civicrm/CRM/Activity/Form/Search.php b/civicrm/CRM/Activity/Form/Search.php
index 06dab35143..56035b42a1 100644
--- a/civicrm/CRM/Activity/Form/Search.php
+++ b/civicrm/CRM/Activity/Form/Search.php
@@ -251,7 +251,7 @@ class CRM_Activity_Form_Search extends CRM_Core_Form_Search {
 
     if ($survey) {
       $this->_formValues['activity_survey_id'] = $this->_defaults['activity_survey_id'] = $survey;
-      $sid = CRM_Utils_Array::value('activity_survey_id', $this->_formValues);
+      $sid = $this->_formValues['activity_survey_id'] ?? NULL;
       $activity_type_id = CRM_Core_DAO::getFieldValue('CRM_Campaign_DAO_Survey', $sid, 'activity_type_id');
 
       // since checkbox are replaced by multiple select option
diff --git a/civicrm/CRM/Activity/Form/Task.php b/civicrm/CRM/Activity/Form/Task.php
index 1ee135bd7f..c169648768 100644
--- a/civicrm/CRM/Activity/Form/Task.php
+++ b/civicrm/CRM/Activity/Form/Task.php
@@ -39,6 +39,8 @@ class CRM_Activity_Form_Task extends CRM_Core_Form_Task {
    * Common pre-process function.
    *
    * @param CRM_Core_Form $form
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function preProcessCommon(&$form) {
     $form->_activityHolderIds = [];
diff --git a/civicrm/CRM/Activity/Form/Task/Batch.php b/civicrm/CRM/Activity/Form/Task/Batch.php
index ce68c080d9..b061e86ec4 100644
--- a/civicrm/CRM/Activity/Form/Task/Batch.php
+++ b/civicrm/CRM/Activity/Form/Task/Batch.php
@@ -146,7 +146,7 @@ class CRM_Activity_Form_Task_Batch extends CRM_Activity_Form_Task {
       $typeId = CRM_Core_DAO::getFieldValue("CRM_Activity_DAO_Activity", $activityId, 'activity_type_id');
       foreach ($this->_fields as $name => $field) {
         if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($name)) {
-          $customValue = CRM_Utils_Array::value($customFieldID, $customFields);
+          $customValue = $customFields[$customFieldID] ?? NULL;
           if (!empty($customValue['extends_entity_column_value'])) {
             $entityColumnValue = explode(CRM_Core_DAO::VALUE_SEPARATOR,
               $customValue['extends_entity_column_value']
diff --git a/civicrm/CRM/Activity/Form/Task/Email.php b/civicrm/CRM/Activity/Form/Task/Email.php
index dcb050f056..67a247ccd6 100644
--- a/civicrm/CRM/Activity/Form/Task/Email.php
+++ b/civicrm/CRM/Activity/Form/Task/Email.php
@@ -19,62 +19,27 @@
  * This class provides the functionality to email a group of contacts.
  */
 class CRM_Activity_Form_Task_Email extends CRM_Activity_Form_Task {
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_single = FALSE;
-
-  public $_noEmails = FALSE;
-
-  /**
-   * All the existing templates in the system.
-   *
-   * @var array
-   */
-  public $_templates = NULL;
+  use CRM_Contact_Form_Task_EmailTrait;
 
   /**
    * Build all the data structures needed to build the form.
+   *
+   * @throws \CiviCRM_API3_Exception
    */
   public function preProcess() {
     CRM_Contact_Form_Task_EmailCommon::preProcessFromAddress($this);
     parent::preProcess();
-
-    // we have all the contribution ids, so now we get the contact ids
-    parent::setContactIDs();
-
+    $this->setContactIDs();
     $this->assign('single', $this->_single);
   }
 
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    // Enable form element.
-    $this->assign('emailTask', TRUE);
-
-    CRM_Contact_Form_Task_EmailCommon::buildQuickForm($this);
-  }
-
-  /**
-   * Process the form after the input has been submitted and validated.
-   */
-  public function postProcess() {
-    CRM_Contact_Form_Task_EmailCommon::postProcess($this);
-  }
-
   /**
    * List available tokens for this form.
    *
    * @return array
    */
   public function listTokens() {
-    $tokens = CRM_Core_SelectValues::contactTokens();
-    return $tokens;
+    return CRM_Core_SelectValues::contactTokens();
   }
 
 }
diff --git a/civicrm/CRM/Activity/Import/Form/MapField.php b/civicrm/CRM/Activity/Import/Form/MapField.php
index 7d68f31b0a..51cb5aa42b 100644
--- a/civicrm/CRM/Activity/Import/Form/MapField.php
+++ b/civicrm/CRM/Activity/Import/Form/MapField.php
@@ -309,7 +309,7 @@ class CRM_Activity_Import_Form_MapField extends CRM_Import_Form_MapField {
     }
 
     if (!empty($fields['saveMapping'])) {
-      $nameField = CRM_Utils_Array::value('saveMappingName', $fields);
+      $nameField = $fields['saveMappingName'] ?? NULL;
       if (empty($nameField)) {
         $errors['saveMappingName'] = ts('Name is required to save Import Mapping');
       }
diff --git a/civicrm/CRM/Activity/Import/Parser/Activity.php b/civicrm/CRM/Activity/Import/Parser/Activity.php
index 7ac076ec95..9764b4c670 100644
--- a/civicrm/CRM/Activity/Import/Parser/Activity.php
+++ b/civicrm/CRM/Activity/Import/Parser/Activity.php
@@ -207,7 +207,7 @@ class CRM_Activity_Import_Parser_Activity extends CRM_Activity_Import_Parser {
     // Date-Format part ends.
 
     // Checking error in custom data.
-    $params['contact_type'] = isset($this->_contactType) ? $this->_contactType : 'Activity';
+    $params['contact_type'] = $this->_contactType ?? 'Activity';
 
     CRM_Contact_Import_Parser_Contact::isErrorInCustomData($params, $errorMessage);
 
diff --git a/civicrm/CRM/Activity/Page/AJAX.php b/civicrm/CRM/Activity/Page/AJAX.php
index 26da6433d5..e652726a60 100644
--- a/civicrm/CRM/Activity/Page/AJAX.php
+++ b/civicrm/CRM/Activity/Page/AJAX.php
@@ -56,7 +56,7 @@ class CRM_Activity_Page_AJAX {
     // get the total row count
     CRM_Case_BAO_Case::getGlobalContacts($globalGroupInfo, NULL, FALSE, TRUE, NULL, NULL);
     // limit the rows
-    $relGlobal = CRM_Case_BAO_Case::getGlobalContacts($globalGroupInfo, $params['sortBy'], $showLinks = TRUE, FALSE, $params['offset'], $params['rp']);
+    $relGlobal = CRM_Case_BAO_Case::getGlobalContacts($globalGroupInfo, $params['sortBy'] ?? NULL, $showLinks = TRUE, FALSE, $params['offset'], $params['rp']);
 
     $relationships = [];
     // after sort we can update username fields to be a url
@@ -101,11 +101,14 @@ class CRM_Activity_Page_AJAX {
     }
 
     // sort clientRelationships array using jquery call params
-    foreach ($clientRelationships as $key => $row) {
-      $sortArray[$key] = $row[$params['_raw_values']['sort'][0]];
+    $sortArray = [];
+    if (!empty($params['_raw_values']['sort'])) {
+      foreach ($clientRelationships as $key => $row) {
+        $sortArray[$key] = $row[$params['_raw_values']['sort'][0]];
+      }
+      $sort_type = "SORT_" . strtoupper($params['_raw_values']['order'][0]);
+      array_multisort($sortArray, constant($sort_type), $clientRelationships);
     }
-    $sort_type = "SORT_" . strtoupper($params['_raw_values']['order'][0]);
-    array_multisort($sortArray, constant($sort_type), $clientRelationships);
 
     $relationships = [];
     // after sort we can update username fields to be a url
@@ -181,11 +184,14 @@ class CRM_Activity_Page_AJAX {
     }
 
     // sort clientRelationships array using jquery call params
-    foreach ($caseRelationships as $key => $row) {
-      $sortArray[$key] = $row[$params['_raw_values']['sort'][0]];
+    $sortArray = [];
+    if (!empty($params['_raw_values']['sort'])) {
+      foreach ($caseRelationships as $key => $row) {
+        $sortArray[$key] = $row[$params['_raw_values']['sort'][0]];
+      }
+      $sort_type = "SORT_" . strtoupper($params['_raw_values']['order'][0]);
+      array_multisort($sortArray, constant($sort_type), $caseRelationships);
     }
-    $sort_type = "SORT_" . strtoupper($params['_raw_values']['order'][0]);
-    array_multisort($sortArray, constant($sort_type), $caseRelationships);
 
     $relationships = [];
 
@@ -249,7 +255,7 @@ class CRM_Activity_Page_AJAX {
     $params = ['caseID', 'activityID', 'contactID', 'newSubject', 'targetContactIds', 'mode'];
     $vals = [];
     foreach ($params as $param) {
-      $vals[$param] = CRM_Utils_Array::value($param, $_POST);
+      $vals[$param] = $_POST[$param] ?? NULL;
     }
 
     CRM_Utils_JSON::output(self::_convertToCaseActivity($vals));
diff --git a/civicrm/CRM/Activity/Selector/Search.php b/civicrm/CRM/Activity/Selector/Search.php
index e2d38c551d..d0367750cb 100644
--- a/civicrm/CRM/Activity/Selector/Search.php
+++ b/civicrm/CRM/Activity/Selector/Search.php
@@ -282,9 +282,9 @@ class CRM_Activity_Selector_Search extends CRM_Core_Selector_Base implements CRM
         }
       }
 
-      $contactId = CRM_Utils_Array::value('contact_id', $row);
+      $contactId = $row['contact_id'] ?? NULL;
       if (!$contactId) {
-        $contactId = CRM_Utils_Array::value('source_contact_id', $row);
+        $contactId = $row['source_contact_id'] ?? NULL;
       }
 
       $row['target_contact_name'] = CRM_Activity_BAO_ActivityContact::getNames($row['activity_id'], $targetID);
@@ -339,7 +339,7 @@ class CRM_Activity_Selector_Search extends CRM_Core_Selector_Base implements CRM
       );
 
       // Carry campaign to selector.
-      $row['campaign'] = CRM_Utils_Array::value($result->activity_campaign_id, $allCampaigns);
+      $row['campaign'] = $allCampaigns[$result->activity_campaign_id] ?? NULL;
       $row['campaign_id'] = $result->activity_campaign_id;
 
       if ($engagementLevel = CRM_Utils_Array::value('activity_engagement_level', $row)) {
diff --git a/civicrm/CRM/Activity/StateMachine/Search.php b/civicrm/CRM/Activity/StateMachine/Search.php
index 7249d8c454..56c408af12 100644
--- a/civicrm/CRM/Activity/StateMachine/Search.php
+++ b/civicrm/CRM/Activity/StateMachine/Search.php
@@ -65,7 +65,7 @@ class CRM_Activity_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Admin/Form/MailSettings.php b/civicrm/CRM/Admin/Form/MailSettings.php
index 034228b8a5..4de49fe413 100644
--- a/civicrm/CRM/Admin/Form/MailSettings.php
+++ b/civicrm/CRM/Admin/Form/MailSettings.php
@@ -157,7 +157,7 @@ class CRM_Admin_Form_MailSettings extends CRM_Admin_Form {
         $params[$f] = CRM_Utils_Array::value($f, $formValues, FALSE);
       }
       else {
-        $params[$f] = CRM_Utils_Array::value($f, $formValues);
+        $params[$f] = $formValues[$f] ?? NULL;
       }
     }
 
diff --git a/civicrm/CRM/Admin/Form/MessageTemplates.php b/civicrm/CRM/Admin/Form/MessageTemplates.php
index 47aa143ccb..b1bb341972 100644
--- a/civicrm/CRM/Admin/Form/MessageTemplates.php
+++ b/civicrm/CRM/Admin/Form/MessageTemplates.php
@@ -94,7 +94,7 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
       ]);
     }
     else {
-      $this->_workflow_id = CRM_Utils_Array::value('workflow_id', $this->_values);
+      $this->_workflow_id = $this->_values['workflow_id'] ?? NULL;
       $this->checkUserPermission($this->_workflow_id);
       $this->assign('workflow_id', $this->_workflow_id);
 
@@ -289,7 +289,7 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Admin_Form {
         }
       }
 
-      $this->_workflow_id = CRM_Utils_Array::value('workflow_id', $this->_values);
+      $this->_workflow_id = $this->_values['workflow_id'] ?? NULL;
       if ($this->_workflow_id) {
         $params['workflow_id'] = $this->_workflow_id;
         $params['is_active'] = TRUE;
diff --git a/civicrm/CRM/Admin/Form/Navigation.php b/civicrm/CRM/Admin/Form/Navigation.php
index ffd148fc48..510d039c13 100644
--- a/civicrm/CRM/Admin/Form/Navigation.php
+++ b/civicrm/CRM/Admin/Form/Navigation.php
@@ -98,7 +98,7 @@ class CRM_Admin_Form_Navigation extends CRM_Admin_Form {
     if (isset($this->_id)) {
       //Take parent id in object variable to calculate the menu
       //weight if menu parent id changed
-      $this->_currentParentID = CRM_Utils_Array::value('parent_id', $this->_defaults);
+      $this->_currentParentID = $this->_defaults['parent_id'] ?? NULL;
     }
     else {
       $defaults['permission'] = "access CiviCRM";
diff --git a/civicrm/CRM/Admin/Form/ParticipantStatusType.php b/civicrm/CRM/Admin/Form/ParticipantStatusType.php
index c193d251d8..d25661c40b 100644
--- a/civicrm/CRM/Admin/Form/ParticipantStatusType.php
+++ b/civicrm/CRM/Admin/Form/ParticipantStatusType.php
@@ -65,7 +65,7 @@ class CRM_Admin_Form_ParticipantStatusType extends CRM_Admin_Form {
     if (empty($defaults['weight'])) {
       $defaults['weight'] = CRM_Utils_Weight::getDefaultWeight('CRM_Event_DAO_ParticipantStatusType');
     }
-    $this->_isReserved = CRM_Utils_Array::value('is_reserved', $defaults);
+    $this->_isReserved = $defaults['is_reserved'] ?? NULL;
     if ($this->_isReserved) {
       $this->freeze(['name', 'class', 'is_active']);
     }
@@ -86,13 +86,13 @@ class CRM_Admin_Form_ParticipantStatusType extends CRM_Admin_Form {
     $formValues = $this->controller->exportValues($this->_name);
 
     $params = [
-      'name' => CRM_Utils_Array::value('name', $formValues),
-      'label' => CRM_Utils_Array::value('label', $formValues),
-      'class' => CRM_Utils_Array::value('class', $formValues),
-      'is_active' => CRM_Utils_Array::value('is_active', $formValues, FALSE),
-      'is_counted' => CRM_Utils_Array::value('is_counted', $formValues, FALSE),
-      'weight' => CRM_Utils_Array::value('weight', $formValues),
-      'visibility_id' => CRM_Utils_Array::value('visibility_id', $formValues),
+      'name' => $formValues['name'] ?? NULL,
+      'label' => $formValues['label'] ?? NULL,
+      'class' => $formValues['class'] ?? NULL,
+      'is_active' => $formValues['is_active'] ?? FALSE,
+      'is_counted' => $formValues['is_counted'] ?? FALSE,
+      'weight' => $formValues['weight'] ?? NULL,
+      'visibility_id' => $formValues['visibility_id'] ?? NULL,
     ];
 
     // make sure a malicious POST does not change these on reserved statuses
diff --git a/civicrm/CRM/Admin/Form/Preferences/Address.php b/civicrm/CRM/Admin/Form/Preferences/Address.php
index 21e467d9f6..31f96b338a 100644
--- a/civicrm/CRM/Admin/Form/Preferences/Address.php
+++ b/civicrm/CRM/Admin/Form/Preferences/Address.php
@@ -80,7 +80,7 @@ class CRM_Admin_Form_Preferences_Address extends CRM_Admin_Form_Preferences {
     $addressOptions = CRM_Core_OptionGroup::values('address_options', TRUE);
 
     // check if county option has been set
-    if (CRM_Utils_Array::value($addressOptions['County'], $this->_params['address_options'])) {
+    if (!empty($this->_params['address_options'][$addressOptions['County']])) {
       $countyCount = CRM_Core_DAO::singleValueQuery("SELECT count(*) FROM civicrm_county");
       if ($countyCount < 10) {
         CRM_Core_Session::setStatus(ts('You have enabled the County option. Please ensure you populate the county table in your CiviCRM Database. You can find extensions to populate counties in the <a %1>CiviCRM Extensions Directory</a>.', [1 => 'href="' . CRM_Utils_System::url('civicrm/admin/extensions', ['reset' => 1], TRUE, 'extensions-addnew') . '"']),
diff --git a/civicrm/CRM/Admin/Form/RelationshipType.php b/civicrm/CRM/Admin/Form/RelationshipType.php
index 5fc015bd8e..ea8bf12135 100644
--- a/civicrm/CRM/Admin/Form/RelationshipType.php
+++ b/civicrm/CRM/Admin/Form/RelationshipType.php
@@ -138,12 +138,12 @@ class CRM_Admin_Form_RelationshipType extends CRM_Admin_Form {
       $params = ['id' => $this->_id];
       $baoName = $this->_BAOName;
       $baoName::retrieve($params, $defaults);
-      $defaults['contact_types_a'] = CRM_Utils_Array::value('contact_type_a', $defaults);
+      $defaults['contact_types_a'] = $defaults['contact_type_a'] ?? NULL;
       if (!empty($defaults['contact_sub_type_a'])) {
         $defaults['contact_types_a'] .= '__' . $defaults['contact_sub_type_a'];
       }
 
-      $defaults['contact_types_b'] = CRM_Utils_Array::value('contact_type_b', $defaults);
+      $defaults['contact_types_b'] = $defaults['contact_type_b'] ?? NULL;
       if (!empty($defaults['contact_sub_type_b'])) {
         $defaults['contact_types_b'] .= '__' . $defaults['contact_sub_type_b'];
       }
@@ -187,7 +187,7 @@ class CRM_Admin_Form_RelationshipType extends CRM_Admin_Form {
       $params['contact_sub_type_b'] = $cTypeB[1] ? $cTypeB[1] : 'null';
 
       if (!strlen(trim(CRM_Utils_Array::value('label_b_a', $params)))) {
-        $params['label_b_a'] = CRM_Utils_Array::value('label_a_b', $params);
+        $params['label_b_a'] = $params['label_a_b'] ?? NULL;
       }
 
       if (empty($params['id'])) {
diff --git a/civicrm/CRM/Admin/Form/ScheduleReminders.php b/civicrm/CRM/Admin/Form/ScheduleReminders.php
index e0fd77de3c..a7b94e70f4 100644
--- a/civicrm/CRM/Admin/Form/ScheduleReminders.php
+++ b/civicrm/CRM/Admin/Form/ScheduleReminders.php
@@ -387,7 +387,7 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
       $entityValue = explode(CRM_Core_DAO::VALUE_SEPARATOR, CRM_Utils_Array::value('entity_value', $defaults));
       $entityStatus = explode(CRM_Core_DAO::VALUE_SEPARATOR, CRM_Utils_Array::value('entity_status', $defaults));
       if (empty($this->getContext())) {
-        $defaults['entity'][0] = CRM_Utils_Array::value('mapping_id', $defaults);
+        $defaults['entity'][0] = $defaults['mapping_id'] ?? NULL;
         $defaults['entity'][1] = $entityValue;
         $defaults['entity'][2] = $entityStatus;
       }
@@ -400,11 +400,11 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
           $recipientListing
         );
       }
-      $defaults['text_message'] = CRM_Utils_Array::value('body_text', $defaults);
-      $defaults['html_message'] = CRM_Utils_Array::value('body_html', $defaults);
-      $defaults['sms_text_message'] = CRM_Utils_Array::value('sms_body_text', $defaults);
-      $defaults['template'] = CRM_Utils_Array::value('msg_template_id', $defaults);
-      $defaults['SMStemplate'] = CRM_Utils_Array::value('sms_template_id', $defaults);
+      $defaults['text_message'] = $defaults['body_text'] ?? NULL;
+      $defaults['html_message'] = $defaults['body_html'] ?? NULL;
+      $defaults['sms_text_message'] = $defaults['sms_body_text'] ?? NULL;
+      $defaults['template'] = $defaults['msg_template_id'] ?? NULL;
+      $defaults['SMStemplate'] = $defaults['sms_template_id'] ?? NULL;
       if (!empty($defaults['group_id'])) {
         $defaults['recipient'] = 'group';
       }
@@ -489,7 +489,7 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
       'from_email',
     ];
     foreach ($keys as $key) {
-      $params[$key] = CRM_Utils_Array::value($key, $values);
+      $params[$key] = $values[$key] ?? NULL;
     }
 
     $params['is_repeat'] = CRM_Utils_Array::value('is_repeat', $values, 0);
@@ -515,15 +515,15 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
         $params[$mkey] = 'null';
         continue;
       }
-      $params[$mkey] = CRM_Utils_Array::value($mkey, $values);
+      $params[$mkey] = $values[$mkey] ?? NULL;
     }
 
-    $params['body_text'] = CRM_Utils_Array::value('text_message', $values);
-    $params['sms_body_text'] = CRM_Utils_Array::value('sms_text_message', $values);
-    $params['body_html'] = CRM_Utils_Array::value('html_message', $values);
+    $params['body_text'] = $values['text_message'] ?? NULL;
+    $params['sms_body_text'] = $values['sms_text_message'] ?? NULL;
+    $params['body_html'] = $values['html_message'] ?? NULL;
 
     if (CRM_Utils_Array::value('recipient', $values) == 'manual') {
-      $params['recipient_manual'] = CRM_Utils_Array::value('recipient_manual_id', $values);
+      $params['recipient_manual'] = $values['recipient_manual_id'] ?? NULL;
       $params['group_id'] = $params['recipient'] = $params['recipient_listing'] = 'null';
     }
     elseif (CRM_Utils_Array::value('recipient', $values) == 'group') {
@@ -531,14 +531,14 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
       $params['recipient_manual'] = $params['recipient'] = $params['recipient_listing'] = 'null';
     }
     elseif (isset($values['recipient_listing']) && isset($values['limit_to']) && !CRM_Utils_System::isNull($values['recipient_listing']) && !CRM_Utils_System::isNull($values['limit_to'])) {
-      $params['recipient'] = CRM_Utils_Array::value('recipient', $values);
+      $params['recipient'] = $values['recipient'] ?? NULL;
       $params['recipient_listing'] = implode(CRM_Core_DAO::VALUE_SEPARATOR,
         CRM_Utils_Array::value('recipient_listing', $values)
       );
       $params['group_id'] = $params['recipient_manual'] = 'null';
     }
     else {
-      $params['recipient'] = CRM_Utils_Array::value('recipient', $values);
+      $params['recipient'] = $values['recipient'] ?? NULL;
       $params['group_id'] = $params['recipient_manual'] = $params['recipient_listing'] = 'null';
     }
 
@@ -573,7 +573,7 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
     // multilingual options
     $params['filter_contact_language'] = CRM_Utils_Array::value('filter_contact_language', $values, []);
     $params['filter_contact_language'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, $params['filter_contact_language']);
-    $params['communication_language'] = CRM_Utils_Array::value('communication_language', $values, NULL);
+    $params['communication_language'] = $values['communication_language'] ?? NULL;
 
     if ($this->_action & CRM_Core_Action::UPDATE) {
       $params['id'] = $this->_id;
@@ -657,7 +657,7 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
           $params['sms_template_id'] = $msgTemplate->id;
         }
         else {
-          $params['sms_template_id'] = CRM_Utils_Array::value('SMStemplate', $values);
+          $params['sms_template_id'] = $values['SMStemplate'] ?? NULL;
         }
       }
       else {
@@ -665,7 +665,7 @@ class CRM_Admin_Form_ScheduleReminders extends CRM_Admin_Form {
           $params['msg_template_id'] = $msgTemplate->id;
         }
         else {
-          $params['msg_template_id'] = CRM_Utils_Array::value('template', $values);
+          $params['msg_template_id'] = $values['template'] ?? NULL;
         }
       }
     }
diff --git a/civicrm/CRM/Admin/Form/Setting/Smtp.php b/civicrm/CRM/Admin/Form/Setting/Smtp.php
index a3590b3ca2..da909c7f08 100644
--- a/civicrm/CRM/Admin/Form/Setting/Smtp.php
+++ b/civicrm/CRM/Admin/Form/Setting/Smtp.php
@@ -28,17 +28,7 @@ class CRM_Admin_Form_Setting_Smtp extends CRM_Admin_Form_Setting {
    * Build the form object.
    */
   public function buildQuickForm() {
-
-    $outBoundOption = [
-      CRM_Mailing_Config::OUTBOUND_OPTION_MAIL => ts('mail()'),
-      CRM_Mailing_Config::OUTBOUND_OPTION_SMTP => ts('SMTP'),
-      CRM_Mailing_Config::OUTBOUND_OPTION_SENDMAIL => ts('Sendmail'),
-      CRM_Mailing_Config::OUTBOUND_OPTION_DISABLED => ts('Disable Outbound Email'),
-      CRM_Mailing_Config::OUTBOUND_OPTION_REDIRECT_TO_DB => ts('Redirect to Database'),
-    ];
-    $this->addRadio('outBound_option', ts('Select Mailer'), $outBoundOption);
-
-    $props = array();
+    $props = [];
     $settings = Civi::settings()->getMandatory('mailing_backend') ?? [];
     //Load input as readonly whose values are overridden in civicrm.settings.php.
     foreach ($settings as $setting => $value) {
@@ -48,6 +38,15 @@ class CRM_Admin_Form_Setting_Smtp extends CRM_Admin_Form_Setting {
       }
     }
 
+    $outBoundOption = [
+      CRM_Mailing_Config::OUTBOUND_OPTION_MAIL => ts('mail()'),
+      CRM_Mailing_Config::OUTBOUND_OPTION_SMTP => ts('SMTP'),
+      CRM_Mailing_Config::OUTBOUND_OPTION_SENDMAIL => ts('Sendmail'),
+      CRM_Mailing_Config::OUTBOUND_OPTION_DISABLED => ts('Disable Outbound Email'),
+      CRM_Mailing_Config::OUTBOUND_OPTION_REDIRECT_TO_DB => ts('Redirect to Database'),
+    ];
+    $this->addRadio('outBound_option', ts('Select Mailer'), $outBoundOption, $props['outBound_option'] ?? []);
+
     CRM_Utils_System::setTitle(ts('Settings - Outbound Mail'));
     $this->add('text', 'sendmail_path', ts('Sendmail Path'));
     $this->add('text', 'sendmail_args', ts('Sendmail Argument'));
diff --git a/civicrm/CRM/Admin/Form/SettingTrait.php b/civicrm/CRM/Admin/Form/SettingTrait.php
index 416409979a..f1d0e91893 100644
--- a/civicrm/CRM/Admin/Form/SettingTrait.php
+++ b/civicrm/CRM/Admin/Form/SettingTrait.php
@@ -162,7 +162,7 @@ trait CRM_Admin_Form_SettingTrait {
     foreach ($settingMetaData as $setting => $props) {
       $quickFormType = $this->getQuickFormType($props);
       if (isset($quickFormType)) {
-        $options = CRM_Utils_Array::value('options', $props);
+        $options = $props['options'] ?? NULL;
         if ($options) {
           if ($props['html_type'] === 'Select' && isset($props['is_required']) && $props['is_required'] === FALSE && !isset($options[''])) {
             // If the spec specifies the field is not required add a null option.
@@ -233,7 +233,7 @@ trait CRM_Admin_Form_SettingTrait {
           $this->$add($setting, $props['title'], $options);
         }
         // Migrate to using an array as easier in smart...
-        $description = CRM_Utils_Array::value('description', $props);
+        $description = $props['description'] ?? NULL;
         $descriptions[$setting] = $description;
         $this->assign("{$setting}_description", $description);
         if ($setting === 'max_attachments') {
diff --git a/civicrm/CRM/Admin/Form/WordReplacements.php b/civicrm/CRM/Admin/Form/WordReplacements.php
index 820b3c9aea..646379a507 100644
--- a/civicrm/CRM/Admin/Form/WordReplacements.php
+++ b/civicrm/CRM/Admin/Form/WordReplacements.php
@@ -31,7 +31,7 @@ class CRM_Admin_Form_WordReplacements extends CRM_Core_Form {
     // should rewrite this UI.
     CRM_Core_BAO_WordReplacement::rebuild(FALSE);
 
-    $this->_soInstance = CRM_Utils_Array::value('instance', $_GET);
+    $this->_soInstance = $_GET['instance'] ?? NULL;
     $this->assign('soInstance', $this->_soInstance);
   }
 
@@ -148,10 +148,10 @@ class CRM_Admin_Form_WordReplacements extends CRM_Core_Form {
   public static function formRule($values) {
     $errors = [];
 
-    $oldValues = CRM_Utils_Array::value('old', $values);
-    $newValues = CRM_Utils_Array::value('new', $values);
-    $enabled = CRM_Utils_Array::value('enabled', $values);
-    $exactMatch = CRM_Utils_Array::value('cb', $values);
+    $oldValues = $values['old'] ?? NULL;
+    $newValues = $values['new'] ?? NULL;
+    $enabled = $values['enabled'] ?? NULL;
+    $exactMatch = $values['cb'] ?? NULL;
 
     foreach ($oldValues as $k => $v) {
       if ($v && !$newValues[$k]) {
diff --git a/civicrm/CRM/Admin/Page/AJAX.php b/civicrm/CRM/Admin/Page/AJAX.php
index 79e2ec3b8b..d47b9caf05 100644
--- a/civicrm/CRM/Admin/Page/AJAX.php
+++ b/civicrm/CRM/Admin/Page/AJAX.php
@@ -341,7 +341,7 @@ class CRM_Admin_Page_AJAX {
    * Used by jstree to incrementally load tags
    */
   public static function getTagTree() {
-    $parent = CRM_Utils_Type::escape(CRM_Utils_Array::value('parent_id', $_GET, 0), 'Integer');
+    $parent = CRM_Utils_Type::escape(($_GET['parent_id'] ?? 0), 'Integer');
     $substring = CRM_Utils_Type::escape(CRM_Utils_Array::value('str', $_GET), 'String');
     $result = [];
 
@@ -380,7 +380,7 @@ class CRM_Admin_Page_AJAX {
         }
       }
       else {
-        $hasChildTags = empty($childTagIDs[$dao->id]) ? FALSE : TRUE;
+        $hasChildTags = !empty($childTagIDs[$dao->id]);
         $usedFor = (array) explode(',', $dao->used_for);
         $tag = [
           'id' => $dao->id,
diff --git a/civicrm/CRM/Admin/Page/APIExplorer.php b/civicrm/CRM/Admin/Page/APIExplorer.php
index c3669134ed..13363ee231 100644
--- a/civicrm/CRM/Admin/Page/APIExplorer.php
+++ b/civicrm/CRM/Admin/Page/APIExplorer.php
@@ -131,9 +131,9 @@ class CRM_Admin_Page_APIExplorer extends CRM_Core_Page {
   public static function getDoc() {
     // Verify the API handler we're talking to is valid.
     $entities = civicrm_api3('Entity', 'get');
-    $entity = CRM_Utils_Array::value('entity', $_GET);
+    $entity = $_GET['entity'] ?? NULL;
     if (!empty($entity) && in_array($entity, $entities['values']) && strpos($entity, '.') === FALSE) {
-      $action = CRM_Utils_Array::value('action', $_GET);
+      $action = $_GET['action'] ?? NULL;
       $doc = self::getDocblock($entity, $action);
       $result = [
         'doc' => $doc ? self::formatDocBlock($doc[0]) : 'Not found.',
diff --git a/civicrm/CRM/Admin/Page/EventTemplate.php b/civicrm/CRM/Admin/Page/EventTemplate.php
index 98b5d9b8d0..bee768e086 100644
--- a/civicrm/CRM/Admin/Page/EventTemplate.php
+++ b/civicrm/CRM/Admin/Page/EventTemplate.php
@@ -76,7 +76,7 @@ class CRM_Admin_Page_EventTemplate extends CRM_Core_Page_Basic {
 
     $eventTypes = CRM_Event_PseudoConstant::eventType();
     $participantRoles = CRM_Event_PseudoConstant::participantRole();
-    $participantListings = CRM_Event_PseudoConstant::participantListing();
+    $participantListings = CRM_Event_BAO_Event::buildOptions('participant_listing_id');
 
     //find all event templates.
     $eventTemplate->is_template = TRUE;
diff --git a/civicrm/CRM/Admin/Page/MailSettings.php b/civicrm/CRM/Admin/Page/MailSettings.php
index 475f8c5a7d..6ede83649e 100644
--- a/civicrm/CRM/Admin/Page/MailSettings.php
+++ b/civicrm/CRM/Admin/Page/MailSettings.php
@@ -84,7 +84,7 @@ class CRM_Admin_Page_MailSettings extends CRM_Core_Page_Basic {
     $mailSetting->find();
     while ($mailSetting->fetch()) {
       //replace protocol value with name
-      $mailSetting->protocol = CRM_Utils_Array::value($mailSetting->protocol, $allProtocols);
+      $mailSetting->protocol = $allProtocols[$mailSetting->protocol] ?? NULL;
       CRM_Core_DAO::storeValues($mailSetting, $allMailSettings[$mailSetting->id]);
 
       //form all action links
diff --git a/civicrm/CRM/Admin/Page/MessageTemplates.php b/civicrm/CRM/Admin/Page/MessageTemplates.php
index 03b2a1ed47..4eb05bb687 100644
--- a/civicrm/CRM/Admin/Page/MessageTemplates.php
+++ b/civicrm/CRM/Admin/Page/MessageTemplates.php
@@ -154,7 +154,7 @@ class CRM_Admin_Page_MessageTemplates extends CRM_Core_Page_Basic {
       $values['action'] = CRM_Core_Action::formLink($links, $action,
         [
           'id' => $object->id,
-          'orig_id' => CRM_Utils_Array::value($object->id, $this->_revertible),
+          'orig_id' => $this->_revertible[$object->id] ?? NULL,
         ],
         ts('more'),
         FALSE,
diff --git a/civicrm/CRM/Api4/Page/Api4Explorer.php b/civicrm/CRM/Api4/Page/Api4Explorer.php
index 77eb0d1e53..e0d03bc8fb 100644
--- a/civicrm/CRM/Api4/Page/Api4Explorer.php
+++ b/civicrm/CRM/Api4/Page/Api4Explorer.php
@@ -10,6 +10,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\Service\Schema\Joinable\Joinable;
+
 /**
  *
  * @package CRM
@@ -22,11 +24,18 @@ class CRM_Api4_Page_Api4Explorer extends CRM_Core_Page {
   public function run() {
     $apiDoc = new ReflectionFunction('civicrm_api4');
     $groupOptions = civicrm_api4('Group', 'getFields', ['loadOptions' => TRUE, 'select' => ['options', 'name'], 'where' => [['name', 'IN', ['visibility', 'group_type']]]]);
+    // Don't show n-to-many joins in Explorer
+    $entityLinks = (array) civicrm_api4('Entity', 'getLinks', [], ['entity' => 'links']);
+    foreach ($entityLinks as $entity => $links) {
+      $entityLinks[$entity] = array_filter($links, function($link) {
+        return $link['joinType'] != Joinable::JOIN_TYPE_ONE_TO_MANY;
+      });
+    }
     $vars = [
       'operators' => \CRM_Core_DAO::acceptedSQLOperators(),
       'basePath' => Civi::resources()->getUrl('civicrm'),
       'schema' => (array) \Civi\Api4\Entity::get()->setChain(['fields' => ['$name', 'getFields']])->execute(),
-      'links' => (array) \Civi\Api4\Entity::getLinks()->execute(),
+      'links' => $entityLinks,
       'docs' => \Civi\Api4\Utils\ReflectionUtils::parseDocBlock($apiDoc->getDocComment()),
       'groupOptions' => array_column((array) $groupOptions, 'options', 'name'),
     ];
diff --git a/civicrm/CRM/Api4/Services.php b/civicrm/CRM/Api4/Services.php
index ec8190348c..35c24449e0 100644
--- a/civicrm/CRM/Api4/Services.php
+++ b/civicrm/CRM/Api4/Services.php
@@ -81,9 +81,12 @@ class CRM_Api4_Services {
     );
     foreach ($locations as $location) {
       $path = \CRM_Utils_File::addTrailingSlash(dirname($location)) . str_replace('\\', DIRECTORY_SEPARATOR, $namespace);
-      try {
-        $resource = new \Symfony\Component\Config\Resource\DirectoryResource($path, ';\.php$;');
+      if (!file_exists($path) || !is_dir($path)) {
+        $resource = new \Symfony\Component\Config\Resource\FileExistenceResource($path);
         $container->addResource($resource);
+      }
+      else {
+        $resource = new \Symfony\Component\Config\Resource\DirectoryResource($path, ';\.php$;');
         foreach (glob("$path*.php") as $file) {
           $matches = [];
           preg_match('/(\w*)\.php$/', $file, $matches);
@@ -94,9 +97,7 @@ class CRM_Api4_Services {
             $definition->addTag($tag);
           }
         }
-      }
-      catch (\InvalidArgumentException $e) {
-        //Directory is not found so lets not do anything i suppose.
+        $container->addResource($resource);
       }
     }
   }
diff --git a/civicrm/CRM/Badge/BAO/Badge.php b/civicrm/CRM/Badge/BAO/Badge.php
index 892c719e31..5dc49c849d 100644
--- a/civicrm/CRM/Badge/BAO/Badge.php
+++ b/civicrm/CRM/Badge/BAO/Badge.php
@@ -204,10 +204,10 @@ class CRM_Badge_BAO_Badge {
     if ((CRM_Utils_Array::value('height_image_1', $formattedRow) >
         CRM_Utils_Array::value('height_image_2', $formattedRow)) && !empty($formattedRow['height_image_1'])
     ) {
-      $startOffset = CRM_Utils_Array::value('height_image_1', $formattedRow);
+      $startOffset = $formattedRow['height_image_1'] ?? NULL;
     }
     elseif (!empty($formattedRow['height_image_2'])) {
-      $startOffset = CRM_Utils_Array::value('height_image_2', $formattedRow);
+      $startOffset = $formattedRow['height_image_2'] ?? NULL;
     }
 
     if (!empty($formattedRow['participant_image'])) {
@@ -484,7 +484,7 @@ class CRM_Badge_BAO_Badge {
       $query->convertToPseudoNames($dao);
       $rows[$dao->participant_id] = [];
       foreach ($returnProperties as $key => $dontCare) {
-        $value = isset($dao->$key) ? $dao->$key : NULL;
+        $value = $dao->$key ?? NULL;
         // Format custom fields
         if (strstr($key, 'custom_') && isset($value)) {
           $value = CRM_Core_BAO_CustomField::displayValue($value, substr($key, 7), $dao->contact_id);
diff --git a/civicrm/CRM/Batch/BAO/Batch.php b/civicrm/CRM/Batch/BAO/Batch.php
index 782c6697ab..c777fa4acb 100644
--- a/civicrm/CRM/Batch/BAO/Batch.php
+++ b/civicrm/CRM/Batch/BAO/Batch.php
@@ -43,7 +43,7 @@ class CRM_Batch_BAO_Batch extends CRM_Batch_DAO_Batch {
    */
   public static function create(&$params) {
     $op = 'edit';
-    $batchId = CRM_Utils_Array::value('id', $params);
+    $batchId = $params['id'] ?? NULL;
     if (!$batchId) {
       $op = 'create';
       $params['name'] = CRM_Utils_String::titleToVar($params['title']);
@@ -150,7 +150,7 @@ class CRM_Batch_BAO_Batch extends CRM_Batch_DAO_Batch {
     // format the params
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['rowCount'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
 
     // get batches
     $batches = self::getBatchList($params);
@@ -185,8 +185,8 @@ class CRM_Batch_BAO_Batch extends CRM_Batch_DAO_Batch {
       $batch['batch_name'] = $value['title'];
       $batch['total'] = '';
       $batch['payment_instrument'] = $value['payment_instrument'];
-      $batch['item_count'] = CRM_Utils_Array::value('item_count', $value);
-      $batch['type'] = CRM_Utils_Array::value('batch_type', $value);
+      $batch['item_count'] = $value['item_count'] ?? NULL;
+      $batch['type'] = $value['batch_type'] ?? NULL;
       if (!empty($value['total'])) {
         // CRM-21205
         $batch['total'] = CRM_Utils_Money::format($value['total'], $value['currency']);
diff --git a/civicrm/CRM/Batch/BAO/EntityBatch.php b/civicrm/CRM/Batch/BAO/EntityBatch.php
index 581f6db0b1..caebb1a870 100644
--- a/civicrm/CRM/Batch/BAO/EntityBatch.php
+++ b/civicrm/CRM/Batch/BAO/EntityBatch.php
@@ -24,7 +24,7 @@ class CRM_Batch_BAO_EntityBatch extends CRM_Batch_DAO_EntityBatch {
    */
   public static function create(&$params) {
     $op = 'edit';
-    $entityId = CRM_Utils_Array::value('id', $params);
+    $entityId = $params['id'] ?? NULL;
     if (!$entityId) {
       $op = 'create';
     }
@@ -46,7 +46,7 @@ class CRM_Batch_BAO_EntityBatch extends CRM_Batch_DAO_EntityBatch {
       $params = ['id' => $params];
     }
     $entityBatch = new CRM_Batch_DAO_EntityBatch();
-    $entityId = CRM_Utils_Array::value('id', $params);
+    $entityId = $params['id'] ?? NULL;
     CRM_Utils_Hook::pre('delete', 'EntityBatch', $entityId, $params);
     $entityBatch->copyValues($params);
     $entityBatch->delete();
diff --git a/civicrm/CRM/Batch/Form/Entry.php b/civicrm/CRM/Batch/Form/Entry.php
index 96d10fd4d6..687c4282e0 100644
--- a/civicrm/CRM/Batch/Form/Entry.php
+++ b/civicrm/CRM/Batch/Form/Entry.php
@@ -463,7 +463,7 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
           continue;
         }
 
-        $value['contact_id'] = CRM_Utils_Array::value($key, $params['primary_contact_id']);
+        $value['contact_id'] = $params['primary_contact_id'][$key] ?? NULL;
 
         // update contact information
         $this->updateContactInfo($value);
@@ -647,7 +647,7 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
           continue;
         }
 
-        $value['contact_id'] = CRM_Utils_Array::value($key, $params['primary_contact_id']);
+        $value['contact_id'] = $params['primary_contact_id'][$key] ?? NULL;
 
         // update contact information
         $this->updateContactInfo($value);
@@ -779,20 +779,20 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
           // The following parameter setting may be obsolete.
           $this->_params = $params;
           $value['is_renew'] = TRUE;
-          $isPayLater = CRM_Utils_Array::value('is_pay_later', $params);
+          $isPayLater = $params['is_pay_later'] ?? NULL;
           $campaignId = NULL;
           if (isset($this->_values) && is_array($this->_values) && !empty($this->_values)) {
-            $campaignId = CRM_Utils_Array::value('campaign_id', $this->_params);
+            $campaignId = $this->_params['campaign_id'] ?? NULL;
             if (!array_key_exists('campaign_id', $this->_params)) {
-              $campaignId = CRM_Utils_Array::value('campaign_id', $this->_values);
+              $campaignId = $this->_values['campaign_id'] ?? NULL;
             }
           }
 
           $formDates = [
-            'end_date' => CRM_Utils_Array::value('membership_end_date', $value),
-            'start_date' => CRM_Utils_Array::value('membership_start_date', $value),
+            'end_date' => $value['membership_end_date'] ?? NULL,
+            'start_date' => $value['membership_start_date'] ?? NULL,
           ];
-          $membershipSource = CRM_Utils_Array::value('source', $value);
+          $membershipSource = $value['source'] ?? NULL;
           list($membership) = CRM_Member_BAO_Membership::processMembership(
             $value['contact_id'], $value['membership_type_id'], FALSE,
             //$numTerms should be default to 1.
@@ -822,7 +822,7 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
           ];
           foreach ($dateTypes as $dateField => $dateVariable) {
             $$dateVariable = CRM_Utils_Date::processDate($value[$dateField]);
-            $fDate[$dateField] = CRM_Utils_Array::value($dateField, $value);
+            $fDate[$dateField] = $value[$dateField] ?? NULL;
           }
 
           $calcDates = [];
@@ -833,9 +833,9 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
           foreach ($calcDates as $memType => $calcDate) {
             foreach ($dates as $d) {
               //first give priority to form values then calDates.
-              $date = CRM_Utils_Array::value($d, $value);
+              $date = $value[$d] ?? NULL;
               if (!$date) {
-                $date = CRM_Utils_Array::value($d, $calcDate);
+                $date = $calcDate[$d] ?? NULL;
               }
 
               $value[$d] = CRM_Utils_Date::processDate($date);
diff --git a/civicrm/CRM/Campaign/BAO/Campaign.php b/civicrm/CRM/Campaign/BAO/Campaign.php
index 50b63b0d7f..4ceeec2ea8 100644
--- a/civicrm/CRM/Campaign/BAO/Campaign.php
+++ b/civicrm/CRM/Campaign/BAO/Campaign.php
@@ -569,10 +569,10 @@ INNER JOIN  civicrm_group grp ON ( grp.id = campgrp.entity_id )
     }
 
     $campaignDetails = self::getPermissionedCampaigns($connectedCampaignId, NULL, TRUE, TRUE, $appendDates);
-    $fields = ['campaigns', 'hasAccessCampaign', 'isCampaignEnabled'];
-    foreach ($fields as $fld) {
-      $$fld = CRM_Utils_Array::value($fld, $campaignDetails);
-    }
+
+    $campaigns = $campaignDetails['campaigns'] ?? NULL;
+    $hasAccessCampaign = $campaignDetails['hasAccessCampaign'] ?? NULL;
+    $isCampaignEnabled = $campaignDetails['isCampaignEnabled'] ?? NULL;
 
     $showAddCampaign = FALSE;
     if ($connectedCampaignId || ($isCampaignEnabled && $hasAccessCampaign)) {
@@ -589,14 +589,12 @@ INNER JOIN  civicrm_group grp ON ( grp.id = campgrp.entity_id )
     }
 
     //carry this info to templates.
-    $infoFields = [
-      'showAddCampaign',
-      'hasAccessCampaign',
-      'isCampaignEnabled',
+    $campaignInfo = [
+      'showAddCampaign' => $showAddCampaign,
+      'hasAccessCampaign' => $hasAccessCampaign,
+      'isCampaignEnabled' => $isCampaignEnabled,
     ];
-    foreach ($infoFields as $fld) {
-      $campaignInfo[$fld] = $$fld;
-    }
+
     $form->assign('campaignInfo', $campaignInfo);
   }
 
@@ -612,7 +610,7 @@ INNER JOIN  civicrm_group grp ON ( grp.id = campgrp.entity_id )
     $campaignDetails = self::getPermissionedCampaigns(NULL, NULL, FALSE, FALSE, FALSE, TRUE);
     $fields = ['campaigns', 'hasAccessCampaign', 'isCampaignEnabled'];
     foreach ($fields as $fld) {
-      $$fld = CRM_Utils_Array::value($fld, $campaignDetails);
+      $$fld = $campaignDetails[$fld] ?? NULL;
     }
     $showCampaignInSearch = FALSE;
     if ($isCampaignEnabled && $hasAccessCampaign && !empty($campaigns)) {
diff --git a/civicrm/CRM/Campaign/BAO/Query.php b/civicrm/CRM/Campaign/BAO/Query.php
index 8e3191cbcc..e70340cffb 100644
--- a/civicrm/CRM/Campaign/BAO/Query.php
+++ b/civicrm/CRM/Campaign/BAO/Query.php
@@ -440,8 +440,8 @@ INNER JOIN  civicrm_custom_group grp on fld.custom_group_id = grp.id
     if (!is_array($params) || empty($params)) {
       return $voterClause;
     }
-    $surveyId = CRM_Utils_Array::value('campaign_survey_id', $params);
-    $searchVoterFor = CRM_Utils_Array::value('campaign_search_voter_for', $params);
+    $surveyId = $params['campaign_survey_id'] ?? NULL;
+    $searchVoterFor = $params['campaign_search_voter_for'] ?? NULL;
 
     //get the survey activities.
     $activityStatus = CRM_Core_PseudoConstant::activityStatus('name');
@@ -478,7 +478,7 @@ INNER JOIN  civicrm_custom_group grp on fld.custom_group_id = grp.id
         ) {
           $voterIds = [];
           foreach ($voterActValues as $values) {
-            $numOfDays = CRM_Utils_Array::value($values['result'], $recontactInterval);
+            $numOfDays = $recontactInterval[$values['result']] ?? NULL;
             if ($numOfDays &&
               $values['status_id'] == $completedStatusId
             ) {
diff --git a/civicrm/CRM/Campaign/BAO/Survey.php b/civicrm/CRM/Campaign/BAO/Survey.php
index 810cec0d4a..9277e4f040 100644
--- a/civicrm/CRM/Campaign/BAO/Survey.php
+++ b/civicrm/CRM/Campaign/BAO/Survey.php
@@ -886,7 +886,7 @@ INNER JOIN  civicrm_contact contact_a ON ( activityTarget.contact_id = contact_a
       }
     }
 
-    return CRM_Utils_Array::value($surveyId, $ufIds);
+    return $ufIds[$surveyId] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Campaign/Form/Gotv.php b/civicrm/CRM/Campaign/Form/Gotv.php
index bab464051f..cea96a40ba 100644
--- a/civicrm/CRM/Campaign/Form/Gotv.php
+++ b/civicrm/CRM/Campaign/Form/Gotv.php
@@ -35,7 +35,7 @@ class CRM_Campaign_Form_Gotv extends CRM_Core_Form {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
-    $this->_search = CRM_Utils_Array::value('search', $_GET);
+    $this->_search = $_GET['search'] ?? NULL;
     $this->_force = CRM_Utils_Request::retrieve('force', 'Boolean', $this, FALSE);
     $this->_surveyId = CRM_Utils_Request::retrieve('sid', 'Positive', $this);
     $this->_interviewerId = CRM_Utils_Request::retrieve('cid', 'Positive', $this);
diff --git a/civicrm/CRM/Campaign/Form/Petition/Signature.php b/civicrm/CRM/Campaign/Form/Petition/Signature.php
index 4e72b62cf9..1ac26d3755 100644
--- a/civicrm/CRM/Campaign/Form/Petition/Signature.php
+++ b/civicrm/CRM/Campaign/Form/Petition/Signature.php
@@ -461,7 +461,7 @@ class CRM_Campaign_Form_Petition_Signature extends CRM_Core_Form {
     // array_values($this->_contactProfileFields)[0] but it's PHP 5.4+ only.
     $slice = array_slice($this->_contactProfileFields, 0, 1);
     $firstField = array_shift($slice);
-    $addToGroupID = isset($firstField['add_to_group_id']) ? $firstField['add_to_group_id'] : NULL;
+    $addToGroupID = $firstField['add_to_group_id'] ?? NULL;
     $this->_contactId = CRM_Contact_BAO_Contact::createProfileContact($params, $this->_contactProfileFields,
       $this->_contactId, $addToGroupID,
       $this->_contactProfileId, $this->_ctype,
@@ -487,7 +487,7 @@ class CRM_Campaign_Form_Petition_Signature extends CRM_Core_Form {
 
     // create the signature activity record
     $params['contactId'] = $this->_contactId;
-    $params['activity_campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->petition);
+    $params['activity_campaign_id'] = $this->petition['campaign_id'] ?? NULL;
     $result = $this->bao->createSignature($params);
 
     // send thank you or email verification emails
diff --git a/civicrm/CRM/Campaign/Form/Search.php b/civicrm/CRM/Campaign/Form/Search.php
index ca86ffd86b..66d744995c 100644
--- a/civicrm/CRM/Campaign/Form/Search.php
+++ b/civicrm/CRM/Campaign/Form/Search.php
@@ -186,7 +186,7 @@ class CRM_Campaign_Form_Search extends CRM_Core_Form_Search {
         'release' => CRM_Campaign_Task::RELEASE,
       );
 
-      $currentTaskValue = CRM_Utils_Array::value($this->_operation, $taskMapping);
+      $currentTaskValue = $taskMapping[$this->_operation] ?? NULL;
       $taskValue = array($currentTaskValue => $allTasks[$currentTaskValue]);
       if ($this->_operation == 'interview' && !empty($this->_formValues['campaign_survey_id'])) {
         $activityTypes = CRM_Core_PseudoConstant::activityType(FALSE, TRUE, FALSE, 'label', TRUE);
@@ -288,7 +288,7 @@ class CRM_Campaign_Form_Search extends CRM_Core_Form_Search {
   }
 
   public function formatParams() {
-    $interviewerId = CRM_Utils_Array::value('survey_interviewer_id', $this->_formValues);
+    $interviewerId = $this->_formValues['survey_interviewer_id'] ?? NULL;
     if ($interviewerId) {
       $this->set('interviewerId', $interviewerId);
     }
@@ -298,7 +298,7 @@ class CRM_Campaign_Form_Search extends CRM_Core_Form_Search {
       if ($this->_force) {
         continue;
       }
-      $paramValue = CRM_Utils_Array::value($param, $this->_formValues);
+      $paramValue = $this->_formValues[$param] ?? NULL;
       if ($paramValue && is_array($paramValue)) {
         unset($this->_formValues[$param]);
         foreach ($paramValue as $key => $value) {
@@ -323,7 +323,7 @@ class CRM_Campaign_Form_Search extends CRM_Core_Form_Search {
         //allow voter search in sub-part of given constituents,
         //but make sure in case user does not select any group.
         //get all associated campaign groups in where filter, CRM-7406
-        $groups = CRM_Utils_Array::value('group', $this->_formValues);
+        $groups = $this->_formValues['group'] ?? NULL;
         if ($campaignId && CRM_Utils_System::isNull($groups)) {
           $campGroups = CRM_Campaign_BAO_Campaign::getCampaignGroups($campaignId);
           foreach ($campGroups as $id => $title) {
@@ -410,7 +410,7 @@ class CRM_Campaign_Form_Search extends CRM_Core_Form_Search {
     );
 
     foreach ($clauseFields as $param => $key) {
-      $params[$key] = CRM_Utils_Array::value($key, $this->_formValues);
+      $params[$key] = $this->_formValues[$key] ?? NULL;
       if (!$params[$key]) {
         $params[$key] = $this->get($param);
       }
diff --git a/civicrm/CRM/Campaign/Form/Search/Campaign.php b/civicrm/CRM/Campaign/Form/Search/Campaign.php
index 1471311c59..a6cc366820 100644
--- a/civicrm/CRM/Campaign/Form/Search/Campaign.php
+++ b/civicrm/CRM/Campaign/Form/Search/Campaign.php
@@ -40,12 +40,12 @@ class CRM_Campaign_Form_Search_Campaign extends CRM_Core_Form {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
-    $this->_search = CRM_Utils_Array::value('search', $_GET);
+    $this->_search = $_GET['search'] ?? NULL;
     $this->_force = CRM_Utils_Request::retrieve('force', 'Boolean', $this, FALSE, FALSE);
     $this->_searchTab = CRM_Utils_Request::retrieve('type', 'String', $this, FALSE, 'campaign');
 
     //when we do load tab, lets load the default objects.
-    $this->assign('force', ($this->_force || $this->_searchTab) ? TRUE : FALSE);
+    $this->assign('force', $this->_force || $this->_searchTab);
     $this->assign('searchParams', json_encode($this->get('searchParams')));
     $this->assign('buildSelector', $this->_search);
     $this->assign('searchFor', $this->_searchTab);
diff --git a/civicrm/CRM/Campaign/Form/Search/Petition.php b/civicrm/CRM/Campaign/Form/Search/Petition.php
index ac75328073..438b885dbf 100644
--- a/civicrm/CRM/Campaign/Form/Search/Petition.php
+++ b/civicrm/CRM/Campaign/Form/Search/Petition.php
@@ -31,12 +31,12 @@ class CRM_Campaign_Form_Search_Petition extends CRM_Core_Form {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
-    $this->_search = CRM_Utils_Array::value('search', $_GET);
+    $this->_search = $_GET['search'] ?? NULL;
     $this->_force = CRM_Utils_Request::retrieve('force', 'Boolean', $this, FALSE, FALSE);
     $this->_searchTab = CRM_Utils_Request::retrieve('type', 'String', $this, FALSE, 'petition');
 
     //when we do load tab, lets load the default objects.
-    $this->assign('force', ($this->_force || $this->_searchTab) ? TRUE : FALSE);
+    $this->assign('force', $this->_force || $this->_searchTab);
     $this->assign('searchParams', json_encode($this->get('searchParams')));
     $this->assign('buildSelector', $this->_search);
     $this->assign('searchFor', $this->_searchTab);
diff --git a/civicrm/CRM/Campaign/Form/Search/Survey.php b/civicrm/CRM/Campaign/Form/Search/Survey.php
index be1664a1ea..968b99eafa 100644
--- a/civicrm/CRM/Campaign/Form/Search/Survey.php
+++ b/civicrm/CRM/Campaign/Form/Search/Survey.php
@@ -31,12 +31,12 @@ class CRM_Campaign_Form_Search_Survey extends CRM_Core_Form {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
-    $this->_search = CRM_Utils_Array::value('search', $_GET);
+    $this->_search = $_GET['search'] ?? NULL;
     $this->_force = CRM_Utils_Request::retrieve('force', 'Boolean', $this, FALSE, FALSE);
     $this->_searchTab = CRM_Utils_Request::retrieve('type', 'String', $this, FALSE, 'survey');
 
     //when we do load tab, lets load the default objects.
-    $this->assign('force', ($this->_force || $this->_searchTab) ? TRUE : FALSE);
+    $this->assign('force', $this->_force || $this->_searchTab);
     $this->assign('searchParams', json_encode($this->get('searchParams')));
     $this->assign('buildSelector', $this->_search);
     $this->assign('searchFor', $this->_searchTab);
diff --git a/civicrm/CRM/Campaign/Form/Task.php b/civicrm/CRM/Campaign/Form/Task.php
index 4e93fc577e..f59cc30ea6 100644
--- a/civicrm/CRM/Campaign/Form/Task.php
+++ b/civicrm/CRM/Campaign/Form/Task.php
@@ -35,7 +35,7 @@ class CRM_Campaign_Form_Task extends CRM_Core_Form_Task {
 
     $this->_task = $values['task'];
     $campaignTasks = CRM_Campaign_Task::tasks();
-    $taskName = CRM_Utils_Array::value($this->_task, $campaignTasks);
+    $taskName = $campaignTasks[$this->_task] ?? NULL;
     $this->assign('taskName', $taskName);
 
     $ids = [];
diff --git a/civicrm/CRM/Campaign/Form/Task/Interview.php b/civicrm/CRM/Campaign/Form/Task/Interview.php
index fb178f3636..19df2380e9 100644
--- a/civicrm/CRM/Campaign/Form/Task/Interview.php
+++ b/civicrm/CRM/Campaign/Form/Task/Interview.php
@@ -87,7 +87,7 @@ class CRM_Campaign_Form_Task_Interview extends CRM_Campaign_Form_Task {
     $buttonName = $this->controller->getButtonName();
     $walkListActivityId = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'WalkList');
     if ($buttonName == '_qf_Interview_submit_orderBy' && !empty($_POST['order_bys'])) {
-      $orderByParams = CRM_Utils_Array::value('order_bys', $_POST);
+      $orderByParams = $_POST['order_bys'] ?? NULL;
     }
     elseif ($walkListActivityId == $this->_surveyDetails['activity_type_id']) {
       $orderByParams
@@ -160,9 +160,9 @@ WHERE {$clause}
 
     $activityIds = [];
     foreach ($this->_contactIds as $key => $voterId) {
-      $actVals = CRM_Utils_Array::value($voterId, $this->_surveyActivityIds);
-      $statusId = CRM_Utils_Array::value('status_id', $actVals);
-      $activityId = CRM_Utils_Array::value('activity_id', $actVals);
+      $actVals = $this->_surveyActivityIds[$voterId] ?? NULL;
+      $statusId = $actVals['status_id'] ?? NULL;
+      $activityId = $actVals['activity_id'] ?? NULL;
       if ($activityId &&
         $statusId &&
         $scheduledStatusId == $statusId
@@ -233,7 +233,7 @@ WHERE {$clause}
     }
 
     //set the title.
-    $this->_surveyTypeId = CRM_Utils_Array::value('activity_type_id', $this->_surveyValues);
+    $this->_surveyTypeId = $this->_surveyValues['activity_type_id'] ?? NULL;
     $surveyTypeLabel = CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_type_id', $this->_surveyTypeId);
     CRM_Utils_System::setTitle(ts('Record %1 Responses', [1 => $surveyTypeLabel]));
   }
@@ -446,8 +446,8 @@ WHERE {$clause}
    * @return mixed
    */
   public static function registerInterview($params) {
-    $activityId = CRM_Utils_Array::value('activity_id', $params);
-    $surveyTypeId = CRM_Utils_Array::value('activity_type_id', $params);
+    $activityId = $params['activity_id'] ?? NULL;
+    $surveyTypeId = $params['activity_type_id'] ?? NULL;
     if (!is_array($params) || !$surveyTypeId || !$activityId) {
       return FALSE;
     }
@@ -496,7 +496,7 @@ WHERE {$clause}
       }
     }
 
-    $contactId = CRM_Utils_Array::value('voter_id', $params);
+    $contactId = $params['voter_id'] ?? NULL;
     if ($contactId && !empty($contactParams)) {
       CRM_Contact_BAO_Contact::createProfileContact($contactParams, $fields, $contactId);
     }
@@ -516,7 +516,7 @@ WHERE {$clause}
     }
 
     $subject = '';
-    $surveyTitle = CRM_Utils_Array::value('surveyTitle', $params);
+    $surveyTitle = $params['surveyTitle'] ?? NULL;
     if ($surveyTitle) {
       $subject = $surveyTitle . ' - ';
     }
diff --git a/civicrm/CRM/Campaign/Form/Task/Reserve.php b/civicrm/CRM/Campaign/Form/Task/Reserve.php
index b6a39ddb78..b0b814b690 100644
--- a/civicrm/CRM/Campaign/Form/Task/Reserve.php
+++ b/civicrm/CRM/Campaign/Form/Task/Reserve.php
@@ -104,7 +104,7 @@ class CRM_Campaign_Form_Task_Reserve extends CRM_Campaign_Form_Task {
 
   public function validateSurvey() {
     $errorMsg = NULL;
-    $maxVoters = CRM_Utils_Array::value('max_number_of_contacts', $this->_surveyDetails);
+    $maxVoters = $this->_surveyDetails['max_number_of_contacts'] ?? NULL;
     if ($maxVoters) {
       if ($maxVoters <= $this->_numVoters) {
         $errorMsg = ts('The maximum number of contacts is already reserved for this interviewer.');
@@ -119,7 +119,7 @@ class CRM_Campaign_Form_Task_Reserve extends CRM_Campaign_Form_Task {
       }
     }
 
-    $defaultNum = CRM_Utils_Array::value('default_number_of_contacts', $this->_surveyDetails);
+    $defaultNum = $this->_surveyDetails['default_number_of_contacts'] ?? NULL;
     if (!$errorMsg && $defaultNum && (count($this->_contactIds) > $defaultNum)) {
       $errorMsg = ts('You can reserve a maximum of %count contact at a time for this survey.',
         [
@@ -219,7 +219,7 @@ class CRM_Campaign_Form_Task_Reserve extends CRM_Campaign_Form_Task {
   public function postProcess() {
     //add reservation.
     $countVoters = 0;
-    $maxVoters = CRM_Utils_Array::value('max_number_of_contacts', $this->_surveyDetails);
+    $maxVoters = $this->_surveyDetails['max_number_of_contacts'] ?? NULL;
     $activityStatus = CRM_Core_PseudoConstant::activityStatus('name');
     $statusHeld = array_search('Scheduled', $activityStatus);
 
@@ -237,7 +237,7 @@ class CRM_Campaign_Form_Task_Reserve extends CRM_Campaign_Form_Task {
         'activity_date_time' => date('YmdHis'),
         'status_id' => $statusHeld,
         'skipRecentView' => 1,
-        'campaign_id' => CRM_Utils_Array::value('campaign_id', $this->_surveyDetails),
+        'campaign_id' => $this->_surveyDetails['campaign_id'] ?? NULL,
       ];
       $activity = CRM_Activity_BAO_Activity::create($activityParams);
       if ($activity->id) {
@@ -297,8 +297,8 @@ class CRM_Campaign_Form_Task_Reserve extends CRM_Campaign_Form_Task {
 
     $params = $this->controller->exportValues($this->_name);
     $groups = CRM_Utils_Array::value('groups', $params, []);
-    $newGroupName = CRM_Utils_Array::value('newGroupName', $params);
-    $newGroupDesc = CRM_Utils_Array::value('newGroupDesc', $params);
+    $newGroupName = $params['newGroupName'] ?? NULL;
+    $newGroupDesc = $params['newGroupDesc'] ?? NULL;
 
     $newGroupId = NULL;
     //create new group.
@@ -317,7 +317,7 @@ class CRM_Campaign_Form_Task_Reserve extends CRM_Campaign_Form_Task {
       $existingGroups = CRM_Core_PseudoConstant::group();
       foreach ($groups as $groupId) {
         $addCount = CRM_Contact_BAO_GroupContact::addContactsToGroup($contactIds, $groupId);
-        $totalCount = CRM_Utils_Array::value(1, $addCount);
+        $totalCount = $addCount[1] ?? NULL;
         if ($groupId == $newGroupId) {
           $name = $newGroupName;
           $new = TRUE;
diff --git a/civicrm/CRM/Campaign/Page/AJAX.php b/civicrm/CRM/Campaign/Page/AJAX.php
index 45005703b5..8a29ee97b6 100644
--- a/civicrm/CRM/Campaign/Page/AJAX.php
+++ b/civicrm/CRM/Campaign/Page/AJAX.php
@@ -34,9 +34,9 @@ class CRM_Campaign_Page_AJAX {
 
     $params = [];
     foreach ($fields as $fld) {
-      $params[$fld] = CRM_Utils_Array::value($fld, $_POST);
+      $params[$fld] = $_POST[$fld] ?? NULL;
     }
-    $params['details'] = CRM_Utils_Array::value('note', $_POST);
+    $params['details'] = $_POST['note'] ?? NULL;
     $voterId = $params['voter_id'];
     $activityId = $params['activity_id'];
 
@@ -145,7 +145,7 @@ class CRM_Campaign_Page_AJAX {
       'group',
       'contact_type',
     ] as $param) {
-      $paramValue = CRM_Utils_Array::value($param, $params);
+      $paramValue = $params[$param] ?? NULL;
       if ($paramValue) {
         unset($params[$param]);
         $paramValue = explode(',', $paramValue);
@@ -161,7 +161,7 @@ class CRM_Campaign_Page_AJAX {
       'survey_interviewer_id',
       'campaign_search_voter_for',
     ] as $fld) {
-      $voterClauseParams[$fld] = CRM_Utils_Array::value($fld, $params);
+      $voterClauseParams[$fld] = $params[$fld] ?? NULL;
     }
 
     $interviewerId = $surveyTypeId = $surveyId = NULL;
@@ -178,7 +178,7 @@ class CRM_Campaign_Page_AJAX {
         //allow voter search in sub-part of given constituents,
         //but make sure in case user does not select any group.
         //get all associated campaign groups in where filter, CRM-7406
-        $groups = CRM_Utils_Array::value('group', $params);
+        $groups = $params['group'] ?? NULL;
         if ($campaignId && CRM_Utils_System::isNull($groups)) {
           $campaignGroups = CRM_Campaign_BAO_Campaign::getCampaignGroups($campaignId);
           foreach ($campaignGroups as $id => $group) {
@@ -392,7 +392,7 @@ class CRM_Campaign_Page_AJAX {
         ];
         $activityParams = [];
         foreach ($ids as $id) {
-          $val = CRM_Utils_Array::value($id, $_POST);
+          $val = $_POST[$id] ?? NULL;
           if (!$val) {
             $createActivity = FALSE;
             break;
@@ -415,7 +415,7 @@ class CRM_Campaign_Page_AJAX {
 
           $activityTypeId = $surveyValues['activity_type_id'];
 
-          $surveytitle = CRM_Utils_Array::value('surveyTitle', $_POST);
+          $surveytitle = $_POST['surveyTitle'] ?? NULL;
           if (!$surveytitle) {
             $surveytitle = $surveyValues['title'];
           }
@@ -426,7 +426,7 @@ class CRM_Campaign_Page_AJAX {
           $activityParams['skipRecentView'] = 1;
           $activityParams['activity_date_time'] = date('YmdHis');
           $activityParams['activity_type_id'] = $activityTypeId;
-          $activityParams['campaign_id'] = isset($surveyValues['campaign_id']) ? $surveyValues['campaign_id'] : NULL;
+          $activityParams['campaign_id'] = $surveyValues['campaign_id'] ?? NULL;
 
           $activity = CRM_Activity_BAO_Activity::create($activityParams);
           if ($activity->id) {
@@ -442,7 +442,7 @@ class CRM_Campaign_Page_AJAX {
             [$scheduledStatusId]
           );
           foreach ($activities as $voterId => $values) {
-            $activityId = CRM_Utils_Array::value('activity_id', $values);
+            $activityId = $values['activity_id'] ?? NULL;
             if ($activityId && ($values['status_id'] == $scheduledStatusId)) {
               CRM_Core_DAO::setFieldValue('CRM_Activity_DAO_Activity',
                 $activityId,
@@ -604,7 +604,7 @@ class CRM_Campaign_Page_AJAX {
       }
       foreach ($campaigns as $campaignID => $values) {
         foreach ($selectorCols as $col) {
-          $searchRows[$campaignID][$col] = CRM_Utils_Array::value($col, $values);
+          $searchRows[$campaignID][$col] = $values[$col] ?? NULL;
         }
       }
     }
@@ -709,7 +709,7 @@ class CRM_Campaign_Page_AJAX {
       }
       foreach ($surveys as $surveyID => $values) {
         foreach ($selectorCols as $col) {
-          $searchRows[$surveyID][$col] = CRM_Utils_Array::value($col, $values);
+          $searchRows[$surveyID][$col] = $values[$col] ?? NULL;
         }
       }
     }
@@ -809,7 +809,7 @@ class CRM_Campaign_Page_AJAX {
       }
       foreach ($petitions as $petitionID => $values) {
         foreach ($selectorCols as $col) {
-          $searchRows[$petitionID][$col] = CRM_Utils_Array::value($col, $values);
+          $searchRows[$petitionID][$col] = $values[$col] ?? NULL;
         }
       }
     }
diff --git a/civicrm/CRM/Campaign/Page/DashBoard.php b/civicrm/CRM/Campaign/Page/DashBoard.php
index 9af9324cc5..1318dd1c57 100644
--- a/civicrm/CRM/Campaign/Page/DashBoard.php
+++ b/civicrm/CRM/Campaign/Page/DashBoard.php
@@ -202,10 +202,10 @@ class CRM_Campaign_Page_DashBoard extends CRM_Core_Page {
       ];
       foreach ($campaigns as $cmpid => $campaign) {
         foreach ($properties as $prop) {
-          $campaignsData[$cmpid][$prop] = CRM_Utils_Array::value($prop, $campaign);
+          $campaignsData[$cmpid][$prop] = $campaign[$prop] ?? NULL;
         }
-        $statusId = CRM_Utils_Array::value('status_id', $campaign);
-        $campaignsData[$cmpid]['status'] = CRM_Utils_Array::value($statusId, $campaignStatus);
+        $statusId = $campaign['status_id'] ?? NULL;
+        $campaignsData[$cmpid]['status'] = $campaignStatus[$statusId] ?? NULL;
         $campaignsData[$cmpid]['campaign_id'] = $campaign['id'];
         $campaignsData[$cmpid]['campaign_type'] = $campaignType[$campaign['campaign_type_id']];
 
@@ -291,8 +291,8 @@ class CRM_Campaign_Page_DashBoard extends CRM_Core_Page {
       $surveyType = CRM_Campaign_BAO_Survey::getSurveyActivityType();
       foreach ($surveys as $sid => $survey) {
         $surveysData[$sid] = $survey;
-        $campaignId = CRM_Utils_Array::value('campaign_id', $survey);
-        $surveysData[$sid]['campaign'] = CRM_Utils_Array::value($campaignId, $campaigns);
+        $campaignId = $survey['campaign_id'] ?? NULL;
+        $surveysData[$sid]['campaign'] = $campaigns[$campaignId] ?? NULL;
         $surveysData[$sid]['activity_type'] = $surveyType[$survey['activity_type_id']];
         if (!empty($survey['release_frequency'])) {
           $surveysData[$sid]['release_frequency'] = ts('1 Day', ['plural' => '%count Days', 'count' => $survey['release_frequency']]);
@@ -397,8 +397,8 @@ class CRM_Campaign_Page_DashBoard extends CRM_Core_Page {
       $petitionType = CRM_Campaign_BAO_Survey::getSurveyActivityType('label', TRUE);
       foreach ($petitions as $pid => $petition) {
         $petitionsData[$pid] = $petition;
-        $camapignId = CRM_Utils_Array::value('campaign_id', $petition);
-        $petitionsData[$pid]['campaign'] = CRM_Utils_Array::value($camapignId, $campaigns);
+        $camapignId = $petition['campaign_id'] ?? NULL;
+        $petitionsData[$pid]['campaign'] = $campaigns[$camapignId] ?? NULL;
         $petitionsData[$pid]['activity_type'] = $petitionType[$petition['activity_type_id']];
 
         $action = array_sum(array_keys(self::petitionActionLinks()));
diff --git a/civicrm/CRM/Campaign/Selector/Search.php b/civicrm/CRM/Campaign/Selector/Search.php
index a0d3c096e8..73ae1cb41d 100644
--- a/civicrm/CRM/Campaign/Selector/Search.php
+++ b/civicrm/CRM/Campaign/Selector/Search.php
@@ -140,8 +140,8 @@ class CRM_Campaign_Selector_Search extends CRM_Core_Selector_Base implements CRM
     $this->_context = $context;
 
     $this->_campaignClause = $surveyClause;
-    $this->_campaignFromClause = CRM_Utils_Array::value('fromClause', $surveyClause);
-    $this->_campaignWhereClause = CRM_Utils_Array::value('whereClause', $surveyClause);
+    $this->_campaignFromClause = $surveyClause['fromClause'] ?? NULL;
+    $this->_campaignWhereClause = $surveyClause['whereClause'] ?? NULL;
 
     // type of selector
     $this->_action = $action;
diff --git a/civicrm/CRM/Campaign/StateMachine/Search.php b/civicrm/CRM/Campaign/StateMachine/Search.php
index 4b69cbc036..f69e472968 100644
--- a/civicrm/CRM/Campaign/StateMachine/Search.php
+++ b/civicrm/CRM/Campaign/StateMachine/Search.php
@@ -67,7 +67,7 @@ class CRM_Campaign_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Case/Audit/Audit.php b/civicrm/CRM/Case/Audit/Audit.php
index be04913b84..620ef00941 100644
--- a/civicrm/CRM/Case/Audit/Audit.php
+++ b/civicrm/CRM/Case/Audit/Audit.php
@@ -58,6 +58,9 @@ class CRM_Case_Audit_Audit {
           $datatype_elements = $field->getElementsByTagName("Type");
           $datatype = $datatype_elements->item(0)->nodeValue;
 
+          $name_elements = $field->getElementsByTagName("Name");
+          $name = $name_elements->item(0)->nodeValue;
+
           $label_elements = $field->getElementsByTagName("Label");
           $label = $label_elements->item(0)->nodeValue;
 
@@ -89,6 +92,7 @@ class CRM_Case_Audit_Audit {
 
             if ($this->auditConfig->includeInRegion($label, $region)) {
               $retval[$activityindex][$region][$fieldindex] = [];
+              $retval[$activityindex][$region][$fieldindex]['name'] = $name;
               $retval[$activityindex][$region][$fieldindex]['label'] = $label;
               $retval[$activityindex][$region][$fieldindex]['datatype'] = $datatype;
               $retval[$activityindex][$region][$fieldindex]['value'] = $value;
@@ -104,12 +108,14 @@ class CRM_Case_Audit_Audit {
                 ])
                 ) {
                   $caseActivities[$activityindex][$fieldindex] = [];
+                  $caseActivities[$activityindex][$fieldindex]['name'] = $name;
                   $caseActivities[$activityindex][$fieldindex]['label'] = $label;
                   $caseActivities[$activityindex][$fieldindex]['datatype'] = $datatype;
                   $caseActivities[$activityindex][$fieldindex]['value'] = $value;
                 }
                 else {
                   $activityStatusType[$activityindex][$fieldindex] = [];
+                  $activityStatusType[$activityindex][$fieldindex]['name'] = $name;
                   $activityStatusType[$activityindex][$fieldindex]['label'] = $label;
                   $activityStatusType[$activityindex][$fieldindex]['datatype'] = $datatype;
                   $activityStatusType[$activityindex][$fieldindex]['value'] = $value;
@@ -215,25 +221,20 @@ class CRM_Case_Audit_Audit {
    * @param string $xmlString
    * @param int $clientID
    * @param int $caseID
-   * @param bool $printReport
    *
    * @return mixed
    */
-  public static function run($xmlString, $clientID, $caseID, $printReport = FALSE) {
+  public static function run($xmlString, $clientID, $caseID) {
     $audit = new CRM_Case_Audit_Audit($xmlString, 'audit.conf.xml');
-    $activities = $audit->getActivities($printReport);
+    $activities = $audit->getActivities(TRUE);
 
     $template = CRM_Core_Smarty::singleton();
     $template->assign_by_ref('activities', $activities);
 
-    if ($printReport) {
-      $reportDate = CRM_Utils_Date::customFormat(date('Y-m-d H:i'));
-      $template->assign('reportDate', $reportDate);
-      $contents = $template->fetch('CRM/Case/Audit/Report.tpl');
-    }
-    else {
-      $contents = $template->fetch('CRM/Case/Audit/Audit.tpl');
-    }
+    $reportDate = CRM_Utils_Date::customFormat(date('Y-m-d H:i'));
+    $template->assign('reportDate', $reportDate);
+    $contents = $template->fetch('CRM/Case/Audit/Report.tpl');
+
     return $contents;
   }
 
diff --git a/civicrm/CRM/Case/BAO/Case.php b/civicrm/CRM/Case/BAO/Case.php
index bda424a9ef..7df858bf6c 100644
--- a/civicrm/CRM/Case/BAO/Case.php
+++ b/civicrm/CRM/Case/BAO/Case.php
@@ -602,15 +602,15 @@ HERESQL;
         $case['case_id']
       );
       $casesList[$key]['subject'] = $case['case_subject'];
-      $casesList[$key]['case_status'] = CRM_Utils_Array::value($case['case_status_id'], $caseStatuses);
+      $casesList[$key]['case_status'] = $caseStatuses[$case['case_status_id']] ?? NULL;
       if ($case['case_status_id'] == CRM_Case_PseudoConstant::getKey('CRM_Case_BAO_Case', 'case_status_id', 'Urgent')) {
         $casesList[$key]['case_status'] = sprintf('<strong>%s</strong>', strtoupper($casesList[$key]['case_status']));
       }
-      $casesList[$key]['case_type'] = CRM_Utils_Array::value($case['case_type_id'], $caseTypeTitles);
+      $casesList[$key]['case_type'] = $caseTypeTitles[$case['case_type_id']] ?? NULL;
       $casesList[$key]['case_role'] = CRM_Utils_Array::value('case_role', $case, '---');
       $casesList[$key]['manager'] = self::getCaseManagerContact($caseTypes[$case['case_type_id']], $case['case_id']);
 
-      $casesList[$key]['date'] = CRM_Utils_Array::value($case['activity_type_id'], $activityTypeLabels);
+      $casesList[$key]['date'] = $activityTypeLabels[$case['activity_type_id']] ?? NULL;
       if ($actId = CRM_Utils_Array::value('activity_id', $case)) {
         if (self::checkPermission($actId, 'view', $case['activity_type_id'], $userID)) {
           if ($type == 'recent') {
@@ -951,7 +951,7 @@ SELECT civicrm_case.id, case_status.label AS case_status, status_id, civicrm_cas
     $groupBy = "
          GROUP BY ca.id, tcc.id, scc.id, acc.id, ov.value";
 
-    $sortBy = CRM_Utils_Array::value('sortBy', $params);
+    $sortBy = $params['sortBy'] ?? NULL;
     if (!$sortBy) {
       // CRM-5081 - added id to act like creation date
       $orderBy = "
@@ -962,8 +962,8 @@ SELECT civicrm_case.id, case_status.label AS case_status, status_id, civicrm_cas
       $orderBy = " ORDER BY $sortBy ";
     }
 
-    $page = CRM_Utils_Array::value('page', $params);
-    $rp = CRM_Utils_Array::value('rp', $params);
+    $page = $params['page'] ?? NULL;
+    $rp = $params['rp'] ?? NULL;
 
     if (!$page) {
       $page = 1;
@@ -1198,7 +1198,7 @@ HERESQL;
         ];
         // Add more info about the role (creator, manager)
         // The XML historically has the reverse direction, so look up reverse.
-        $role = CRM_Utils_Array::value($dao->role_name_reverse, $caseRoles);
+        $role = $caseRoles[$dao->role_name_reverse] ?? NULL;
         if ($role) {
           unset($role['name']);
           $details += $role;
@@ -1300,13 +1300,13 @@ HERESQL;
       $tplParams['contact'] = $info;
       self::buildPermissionLinks($tplParams, $activityParams);
 
-      $displayName = CRM_Utils_Array::value('display_name', $info);
+      $displayName = $info['display_name'] ?? NULL;
 
       list($result[CRM_Utils_Array::value('contact_id', $info)], $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate(
         [
           'groupName' => 'msg_tpl_workflow_case',
           'valueName' => 'case_activity',
-          'contactId' => CRM_Utils_Array::value('contact_id', $info),
+          'contactId' => $info['contact_id'] ?? NULL,
           'tplParams' => $tplParams,
           'from' => $receiptFrom,
           'toName' => $displayName,
@@ -1417,11 +1417,11 @@ HERESQL;
     while ($res->fetch()) {
       if ($type == 'upcoming') {
         $activityInfo[$res->case_id]['date'] = $res->activity_date_time;
-        $activityInfo[$res->case_id]['type'] = CRM_Utils_Array::value($res->activity_type_id, $activityTypes);
+        $activityInfo[$res->case_id]['type'] = $activityTypes[$res->activity_type_id] ?? NULL;
       }
       else {
         $activityInfo[$res->case_id]['date'] = $res->activity_date_time;
-        $activityInfo[$res->case_id]['type'] = CRM_Utils_Array::value($res->activity_type_id, $activityTypes);
+        $activityInfo[$res->case_id]['type'] = $activityTypes[$res->activity_type_id] ?? NULL;
       }
     }
 
@@ -2022,7 +2022,7 @@ HERESQL;
       //for duplicate cases do not process singleton activities.
       $otherActivityIds = $singletonActivityIds = [];
       foreach ($otherCaseActivities as $caseActivityId => $otherIds) {
-        $otherActId = CRM_Utils_Array::value('activity_id', $otherIds);
+        $otherActId = $otherIds['activity_id'] ?? NULL;
         if (!$otherActId || in_array($otherActId, $otherActivityIds)) {
           continue;
         }
@@ -2425,7 +2425,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')';
 
         //check for core permission.
         $hasPermissions = [];
-        $checkPermissions = CRM_Utils_Array::value($operation, $permissions);
+        $checkPermissions = $permissions[$operation] ?? NULL;
         if (is_array($checkPermissions)) {
           foreach ($checkPermissions as $per) {
             if (CRM_Core_Permission::check($per)) {
@@ -2550,15 +2550,15 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')';
       if (in_array($actTypeName, $singletonNames)) {
         $allow = FALSE;
         if ($operation == 'File On Case') {
-          $allow = (in_array($actTypeName, $doNotFileNames)) ? FALSE : TRUE;
+          $allow = !in_array($actTypeName, $doNotFileNames);
         }
         if (in_array($operation, $actionOperations)) {
           $allow = TRUE;
           if ($operation == 'edit') {
-            $allow = (in_array($actTypeName, $allowEditNames)) ? TRUE : FALSE;
+            $allow = in_array($actTypeName, $allowEditNames);
           }
           elseif ($operation == 'delete') {
-            $allow = (in_array($actTypeName, $doNotDeleteNames)) ? FALSE : TRUE;
+            $allow = !in_array($actTypeName, $doNotDeleteNames);
           }
         }
       }
@@ -2740,7 +2740,7 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')';
 
     //lets check for case configured.
     $allCasesCount = CRM_Case_BAO_Case::caseCount(NULL, FALSE);
-    $configured['configured'] = ($allCasesCount) ? TRUE : FALSE;
+    $configured['configured'] = (bool) $allCasesCount;
     if (!$configured['configured']) {
       //do check for case type and case status.
       $caseTypes = CRM_Case_PseudoConstant::caseType('title', FALSE);
diff --git a/civicrm/CRM/Case/BAO/CaseType.php b/civicrm/CRM/Case/BAO/CaseType.php
index a65deb470b..9937c56272 100644
--- a/civicrm/CRM/Case/BAO/CaseType.php
+++ b/civicrm/CRM/Case/BAO/CaseType.php
@@ -45,7 +45,7 @@ class CRM_Case_BAO_CaseType extends CRM_Case_DAO_CaseType {
     $caseTypeDAO = new CRM_Case_DAO_CaseType();
 
     // form the name only if missing: CRM-627
-    $nameParam = CRM_Utils_Array::value('name', $params, NULL);
+    $nameParam = $params['name'] ?? NULL;
     if (!$nameParam && empty($params['id'])) {
       $params['name'] = CRM_Utils_String::titleToVar($params['title']);
     }
diff --git a/civicrm/CRM/Case/BAO/Query.php b/civicrm/CRM/Case/BAO/Query.php
index 67d9d6f227..71a5e0f147 100644
--- a/civicrm/CRM/Case/BAO/Query.php
+++ b/civicrm/CRM/Case/BAO/Query.php
@@ -413,7 +413,7 @@ class CRM_Case_BAO_Query extends CRM_Core_BAO_Query {
 
       case 'case_activity_is_auto':
         $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause("case_activity.is_auto", $op, $value, 'Boolean');
-        $query->_qill[$grouping][] = ts("Activity Auto Genrated %1 '%2'", [1 => $op, 2 => $value]);
+        $query->_qill[$grouping][] = ts("Activity Auto Generated %1 '%2'", [1 => $op, 2 => $value]);
         $query->_tables['case_activity'] = $query->_whereTables['case_activity'] = 1;
         $query->_tables['civicrm_case'] = $query->_whereTables['civicrm_case'] = 1;
         $query->_tables['civicrm_case_contact'] = $query->_whereTables['civicrm_case_contact'] = 1;
diff --git a/civicrm/CRM/Case/Form/Activity.php b/civicrm/CRM/Case/Form/Activity.php
index 219fa7dc05..d84717985c 100644
--- a/civicrm/CRM/Case/Form/Activity.php
+++ b/civicrm/CRM/Case/Form/Activity.php
@@ -145,17 +145,6 @@ class CRM_Case_Form_Activity extends CRM_Activity_Form_Activity {
       );
     }
     if (!$this->_activityId) {
-      $caseTypes = CRM_Case_PseudoConstant::caseType();
-
-      if (empty($caseTypes) && ($this->_activityTypeName == 'Change Case Type') && !$this->_caseId) {
-        $url = CRM_Utils_System::url('civicrm/contact/view/case',
-          "reset=1&action=view&cid={$this->_currentlyViewedContactId}&id={$caseIds}&show=1"
-        );
-        $session = CRM_Core_Session::singleton();
-        $session->pushUserContext($url);
-        CRM_Core_Error::statusBounce(ts("You do not have any active Case Types"));
-      }
-
       // check if activity count is within the limit
       $xmlProcessor = new CRM_Case_XMLProcessor_Process();
       foreach ($this->_caseId as $casePos => $caseId) {
@@ -594,15 +583,20 @@ class CRM_Case_Form_Activity extends CRM_Activity_Form_Activity {
       $selectedContacts[] = 'assignee_contact_id';
     }
 
+    $dndActivityTypes = Civi::settings()->get('do_not_notify_assignees_for') ?? [];
     foreach ($vvalue as $vkey => $vval) {
       foreach ($selectedContacts as $dnt => $val) {
         if (array_key_exists($val, $params) && !CRM_Utils_Array::crmIsEmptyArray($params[$val])) {
           if ($val == 'contact_check') {
-            $mailStatus = ts("A copy of the activity has also been sent to selected contacts(s).");
+            $mailStatus = ts("A copy of the activity has also been sent to selected contact(s).");
           }
           else {
-            $this->_relatedContacts = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames([$vval['actId']], TRUE, FALSE);
-            $mailStatus .= ' ' . ts("A copy of the activity has also been sent to assignee contacts(s).");
+            if (!in_array($this->_activityTypeId, $dndActivityTypes)) {
+              $this->_relatedContacts = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames(
+                [$vval['actId']], TRUE, FALSE
+              );
+              $mailStatus .= ' ' . ts("A copy of the activity has also been sent to assignee contact(s).");
+            }
           }
           //build an associative array with unique email addresses.
           foreach ($params[$val] as $key => $value) {
@@ -616,7 +610,7 @@ class CRM_Case_Form_Activity extends CRM_Activity_Form_Activity {
             if (isset($id) && array_key_exists($id, $this->_relatedContacts) && isset($this->_relatedContacts[$id]['email'])) {
               //if email already exists in array then append with ', ' another role only otherwise add it to array.
               if ($contactDetails = CRM_Utils_Array::value($this->_relatedContacts[$id]['email'], $mailToContacts)) {
-                $caseRole = CRM_Utils_Array::value('role', $this->_relatedContacts[$id]);
+                $caseRole = $this->_relatedContacts[$id]['role'] ?? NULL;
                 $mailToContacts[$this->_relatedContacts[$id]['email']]['role'] = $contactDetails['role'] . ', ' . $caseRole;
               }
               else {
diff --git a/civicrm/CRM/Case/Form/Activity/ChangeCaseStatus.php b/civicrm/CRM/Case/Form/Activity/ChangeCaseStatus.php
index 56ad8f362a..4acf0cf93f 100644
--- a/civicrm/CRM/Case/Form/Activity/ChangeCaseStatus.php
+++ b/civicrm/CRM/Case/Form/Activity/ChangeCaseStatus.php
@@ -127,7 +127,7 @@ class CRM_Case_Form_Activity_ChangeCaseStatus {
    * @param array $params
    */
   public static function beginPostProcess(&$form, &$params) {
-    $params['id'] = CRM_Utils_Array::value('case_id', $params);
+    $params['id'] = $params['case_id'] ?? NULL;
 
     if (CRM_Utils_Array::value('updateLinkedCases', $params) === '1') {
       $caseID = CRM_Utils_Array::first($form->_caseId);
@@ -194,8 +194,8 @@ class CRM_Case_Form_Activity_ChangeCaseStatus {
     foreach ($form->_oldCaseStatus as $statuskey => $statusval) {
       if ($activity->subject == 'null') {
         $activity->subject = ts('Case status changed from %1 to %2', [
-          1 => CRM_Utils_Array::value($statusval, $form->_caseStatus),
-          2 => CRM_Utils_Array::value($params['case_status_id'], $form->_caseStatus),
+          1 => $form->_caseStatus[$statusval] ?? NULL,
+          2 => $form->_caseStatus[$params['case_status_id']] ?? NULL,
         ]);
         $activity->save();
       }
diff --git a/civicrm/CRM/Case/Form/Activity/ChangeCaseType.php b/civicrm/CRM/Case/Form/Activity/ChangeCaseType.php
index fe6ba63475..be93779292 100644
--- a/civicrm/CRM/Case/Form/Activity/ChangeCaseType.php
+++ b/civicrm/CRM/Case/Form/Activity/ChangeCaseType.php
@@ -68,7 +68,7 @@ class CRM_Case_Form_Activity_ChangeCaseType {
       $form->_caseType[$form->_caseTypeId] = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_CaseType', $form->_caseTypeId, 'title');
     }
 
-    $form->addField('case_type_id', ['context' => 'create', 'entity' => 'Case']);
+    $form->addField('case_type_id', ['context' => 'create', 'entity' => 'Case'], TRUE);
 
     // timeline
     $form->addYesNo('is_reset_timeline', ts('Reset Case Timeline?'), NULL, TRUE);
@@ -145,8 +145,8 @@ class CRM_Case_Form_Activity_ChangeCaseType {
     if ($activity->subject == 'null') {
       $activity->subject = ts('Case type changed from %1 to %2',
         [
-          1 => CRM_Utils_Array::value($form->_defaults['case_type_id'], $allCaseTypes),
-          2 => CRM_Utils_Array::value($params['case_type_id'], $allCaseTypes),
+          1 => $allCaseTypes[$form->_defaults['case_type_id']] ?? NULL,
+          2 => $allCaseTypes[$params['case_type_id']] ?? NULL,
         ]
       );
       $activity->save();
@@ -160,9 +160,9 @@ class CRM_Case_Form_Activity_ChangeCaseType {
       'creatorID' => $form->_currentUserId,
       'standardTimeline' => 1,
       'activityTypeName' => 'Change Case Type',
-      'activity_date_time' => CRM_Utils_Array::value('reset_date_time', $params),
+      'activity_date_time' => $params['reset_date_time'] ?? NULL,
       'caseID' => $caseId,
-      'resetTimeline' => CRM_Utils_Array::value('is_reset_timeline', $params),
+      'resetTimeline' => $params['is_reset_timeline'] ?? NULL,
     ];
 
     $xmlProcessor->run($caseType, $xmlProcessorParams);
diff --git a/civicrm/CRM/Case/Form/Activity/LinkCases.php b/civicrm/CRM/Case/Form/Activity/LinkCases.php
index 3e39759d57..2d87c8fb8b 100644
--- a/civicrm/CRM/Case/Form/Activity/LinkCases.php
+++ b/civicrm/CRM/Case/Form/Activity/LinkCases.php
@@ -98,7 +98,7 @@ class CRM_Case_Form_Activity_LinkCases {
   public static function formRule($values, $files, $form) {
     $errors = [];
 
-    $linkCaseId = CRM_Utils_Array::value('link_to_case_id', $values);
+    $linkCaseId = $values['link_to_case_id'] ?? NULL;
     assert('is_numeric($linkCaseId)');
     if ($linkCaseId == CRM_Utils_Array::first($form->_caseId)) {
       $errors['link_to_case'] = ts('Please select some other case to link.');
@@ -131,9 +131,9 @@ class CRM_Case_Form_Activity_LinkCases {
    * @param array $params
    * @param CRM_Activity_BAO_Activity $activity
    */
-  public static function endPostProcess(&$form, &$params, &$activity) {
+  public static function endPostProcess($form, $params, $activity) {
     $activityId = $activity->id;
-    $linkCaseID = CRM_Utils_Array::value('link_to_case_id', $params);
+    $linkCaseID = $params['link_to_case_id'] ?? NULL;
 
     //create a link between two cases.
     if ($activityId && $linkCaseID) {
diff --git a/civicrm/CRM/Case/Form/Activity/OpenCase.php b/civicrm/CRM/Case/Form/Activity/OpenCase.php
index 36157a3aaa..6c5f82aaaa 100644
--- a/civicrm/CRM/Case/Form/Activity/OpenCase.php
+++ b/civicrm/CRM/Case/Form/Activity/OpenCase.php
@@ -212,7 +212,7 @@ class CRM_Case_Form_Activity_OpenCase {
     }
 
     // rename activity_location param to the correct column name for activity DAO
-    $params['location'] = CRM_Utils_Array::value('activity_location', $params);
+    $params['location'] = $params['activity_location'] ?? NULL;
 
     // Add attachments
     CRM_Core_BAO_File::formatAttachment(
@@ -303,10 +303,10 @@ class CRM_Case_Form_Activity_OpenCase {
       'subject' => $params['activity_subject'],
       'location' => $params['location'],
       'activity_date_time' => $params['start_date'],
-      'duration' => CRM_Utils_Array::value('duration', $params),
+      'duration' => $params['duration'] ?? NULL,
       'medium_id' => $params['medium_id'],
       'details' => $params['activity_details'],
-      'relationship_end_date' => CRM_Utils_Array::value('end_date', $params),
+      'relationship_end_date' => $params['end_date'] ?? NULL,
     ];
 
     if (array_key_exists('custom', $params) && is_array($params['custom'])) {
diff --git a/civicrm/CRM/Case/Form/CaseView.php b/civicrm/CRM/Case/Form/CaseView.php
index d3dae3609d..646d48cfd0 100644
--- a/civicrm/CRM/Case/Form/CaseView.php
+++ b/civicrm/CRM/Case/Form/CaseView.php
@@ -29,7 +29,7 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
    * Set variables up before form is built.
    */
   public function preProcess() {
-    $this->_showRelatedCases = CRM_Utils_Array::value('relatedCases', $_GET);
+    $this->_showRelatedCases = $_GET['relatedCases'] ?? NULL;
 
     $xmlProcessorProcess = new CRM_Case_XMLProcessor_Process();
     $isMultiClient = $xmlProcessorProcess->getAllowMultipleCaseClients();
@@ -81,8 +81,8 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
 
     $this->_caseDetails = [
       'case_type' => $caseType,
-      'case_status' => CRM_Utils_Array::value($values['case_status_id'], $statuses),
-      'case_subject' => CRM_Utils_Array::value('subject', $values),
+      'case_status' => $statuses[$values['case_status_id']] ?? NULL,
+      'case_subject' => $values['subject'] ?? NULL,
       'case_start_date' => $values['case_start_date'],
     ];
     $this->_caseType = $caseTypeName;
@@ -470,7 +470,7 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
     $allCaseActTypes = CRM_Case_PseudoConstant::caseActivityType();
     foreach ($allCaseActTypes as $typeDetails) {
       if (!in_array($typeDetails['name'], ['Open Case'])) {
-        $aTypesFilter[$typeDetails['id']] = CRM_Utils_Array::value('label', $typeDetails);
+        $aTypesFilter[$typeDetails['id']] = $typeDetails['label'] ?? NULL;
       }
     }
     $aTypesFilter = $aTypesFilter + $aTypes;
@@ -498,6 +498,7 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
       'check_permissions' => TRUE,
       'contact_id' => $this->_contactID,
       'is_deleted' => 0,
+      'option.limit' => 0,
       'id' => ['!=' => $this->_caseID],
       'return' => ['id', 'start_date', 'case_type_id.title'],
     ]);
diff --git a/civicrm/CRM/Case/Form/Task/Batch.php b/civicrm/CRM/Case/Form/Task/Batch.php
index 702e0971f0..ed0d9e050c 100644
--- a/civicrm/CRM/Case/Form/Task/Batch.php
+++ b/civicrm/CRM/Case/Form/Task/Batch.php
@@ -60,7 +60,7 @@ class CRM_Case_Form_Task_Batch extends CRM_Core_Form_Task_Batch {
 
       // Get the case status
       $daoClass = 'CRM_Case_DAO_Case';
-      $caseStatus = CRM_Utils_Array::value('case_status', $value);
+      $caseStatus = $value['case_status'] ?? NULL;
       if (!$caseStatus) {
         // default to existing status ID
         $caseStatus = CRM_Core_DAO::getFieldValue($daoClass, $key, 'status_id');
diff --git a/civicrm/CRM/Case/Page/AJAX.php b/civicrm/CRM/Case/Page/AJAX.php
index feb48af2a0..abf2858d87 100644
--- a/civicrm/CRM/Case/Page/AJAX.php
+++ b/civicrm/CRM/Case/Page/AJAX.php
@@ -182,7 +182,7 @@ class CRM_Case_Page_AJAX {
     $params = CRM_Core_Page_AJAX::defaultSortAndPagerParams();
     $params += CRM_Core_Page_AJAX::validateParams($requiredParameters, $optionalParameters);
 
-    $allCases = (bool) $params['all'];
+    $allCases = !empty($params['all']);
 
     $cases = CRM_Case_BAO_Case::getCases($allCases, $params);
 
diff --git a/civicrm/CRM/Case/StateMachine/Search.php b/civicrm/CRM/Case/StateMachine/Search.php
index 327fb746dc..a89c2c6a36 100644
--- a/civicrm/CRM/Case/StateMachine/Search.php
+++ b/civicrm/CRM/Case/StateMachine/Search.php
@@ -69,7 +69,7 @@ class CRM_Case_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Case/XMLProcessor/Process.php b/civicrm/CRM/Case/XMLProcessor/Process.php
index 6e3765b05d..90e1adeb50 100644
--- a/civicrm/CRM/Case/XMLProcessor/Process.php
+++ b/civicrm/CRM/Case/XMLProcessor/Process.php
@@ -81,8 +81,8 @@ class CRM_Case_XMLProcessor_Process extends CRM_Case_XMLProcessor {
    * @throws Exception
    */
   public function process($xml, &$params) {
-    $standardTimeline = CRM_Utils_Array::value('standardTimeline', $params);
-    $activitySetName = CRM_Utils_Array::value('activitySetName', $params);
+    $standardTimeline = $params['standardTimeline'] ?? NULL;
+    $activitySetName = $params['activitySetName'] ?? NULL;
 
     if ('Open Case' == CRM_Utils_Array::value('activityTypeName', $params)) {
       // create relationships for the ones that are required
@@ -219,7 +219,7 @@ class CRM_Case_XMLProcessor_Process extends CRM_Case_XMLProcessor {
         'is_active' => 1,
         'case_id' => $params['caseID'],
         'start_date' => date("Ymd"),
-        'end_date' => CRM_Utils_Array::value('relationship_end_date', $params),
+        'end_date' => $params['relationship_end_date'] ?? NULL,
       ];
 
       if (substr($relationshipType, -4) == '_b_a') {
@@ -269,7 +269,7 @@ class CRM_Case_XMLProcessor_Process extends CRM_Case_XMLProcessor {
       foreach ($activityTypeXML as $recordXML) {
         $activityTypeName = (string ) $recordXML->name;
         $maxInstances = (string ) $recordXML->max_instances;
-        $activityTypeInfo = CRM_Utils_Array::value($activityTypeName, $activityTypes);
+        $activityTypeInfo = $activityTypes[$activityTypeName] ?? NULL;
 
         if ($activityTypeInfo['id']) {
           if ($maskAction) {
@@ -415,7 +415,7 @@ AND        a.is_deleted = 0
   public function createActivity($activityTypeXML, &$params) {
     $activityTypeName = (string) $activityTypeXML->name;
     $activityTypes = &$this->allActivityTypes(TRUE, TRUE);
-    $activityTypeInfo = CRM_Utils_Array::value($activityTypeName, $activityTypes);
+    $activityTypeInfo = $activityTypes[$activityTypeName] ?? NULL;
 
     if (!$activityTypeInfo) {
       $docLink = CRM_Utils_System::docURL2("user/case-management/set-up");
@@ -448,13 +448,13 @@ AND        a.is_deleted = 0
         'source_contact_id' => $params['creatorID'],
         'is_auto' => FALSE,
         'is_current_revision' => 1,
-        'subject' => CRM_Utils_Array::value('subject', $params) ? $params['subject'] : $activityTypeName,
+        'subject' => !empty($params['subject']) ? $params['subject'] : $activityTypeName,
         'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', $statusName),
         'target_contact_id' => $client,
-        'medium_id' => CRM_Utils_Array::value('medium_id', $params),
-        'location' => CRM_Utils_Array::value('location', $params),
-        'details' => CRM_Utils_Array::value('details', $params),
-        'duration' => CRM_Utils_Array::value('duration', $params),
+        'medium_id' => $params['medium_id'] ?? NULL,
+        'location' => $params['location'] ?? NULL,
+        'details' => $params['details'] ?? NULL,
+        'duration' => $params['duration'] ?? NULL,
         'weight' => $orderVal,
       ];
     }
@@ -503,7 +503,7 @@ AND        a.is_deleted = 0
           $activityDate = $params['activity_date_time'];
         }
         else {
-          $referenceActivityInfo = CRM_Utils_Array::value($referenceActivityName, $activityTypes);
+          $referenceActivityInfo = $activityTypes[$referenceActivityName] ?? NULL;
           if ($referenceActivityInfo['id']) {
             $caseActivityParams = ['activity_type_id' => $referenceActivityInfo['id']];
 
@@ -516,7 +516,7 @@ AND        a.is_deleted = 0
 
             if (is_array($referenceActivity)) {
               foreach ($referenceActivity as $aId => $details) {
-                $activityDate = CRM_Utils_Array::value('activity_date', $details);
+                $activityDate = $details['activity_date'] ?? NULL;
                 break;
               }
             }
diff --git a/civicrm/CRM/Case/XMLProcessor/Report.php b/civicrm/CRM/Case/XMLProcessor/Report.php
index 720bbbabe7..c4fcba5670 100644
--- a/civicrm/CRM/Case/XMLProcessor/Report.php
+++ b/civicrm/CRM/Case/XMLProcessor/Report.php
@@ -116,7 +116,7 @@ class CRM_Case_XMLProcessor_Report extends CRM_Case_XMLProcessor {
           foreach ($activitySetXML->ActivityTypes as $activityTypesXML) {
             foreach ($activityTypesXML as $activityTypeXML) {
               $activityTypeName = (string ) $activityTypeXML->name;
-              $activityTypeInfo = CRM_Utils_Array::value($activityTypeName, $allActivityTypes);
+              $activityTypeInfo = $allActivityTypes[$activityTypeName] ?? NULL;
               if ($activityTypeInfo) {
                 $activityTypes[$activityTypeInfo['id']] = $activityTypeInfo;
               }
@@ -294,7 +294,8 @@ WHERE      a.id = %1
       }
 
       $activity['fields'][] = array(
-        'label' => 'Client',
+        'name' => 'Client',
+        'label' => ts('Client'),
         'value' => $this->redact($client),
         'type' => 'String',
       );
@@ -308,9 +309,11 @@ WHERE      a.id = %1
       // Maybe not the best solution.
       $targetNames = CRM_Activity_BAO_ActivityContact::getNames($activityDAO->id, $targetID);
       $processTarget = FALSE;
+      $name = 'With Contact(s)';
       $label = ts('With Contact(s)');
       if (in_array($activityTypeInfo['name'], array('Email', 'Inbound Email'))) {
         $processTarget = TRUE;
+        $name = 'Recipient';
         $label = ts('Recipient');
       }
       if (!$processTarget) {
@@ -340,6 +343,7 @@ WHERE      a.id = %1
         }
 
         $activity['fields'][] = array(
+          'name' => $name,
           'label' => $label,
           'value' => implode('; ', $targetRedacted),
           'type' => 'String',
@@ -349,13 +353,20 @@ WHERE      a.id = %1
 
     // Activity Type info is a special field
     $activity['fields'][] = array(
+      'name' => 'Activity Type',
       'label' => ts('Activity Type'),
       'value' => $activityTypeInfo['label'],
       'type' => 'String',
     );
 
     $activity['fields'][] = array(
+      'name' => 'Subject',
       'label' => ts('Subject'),
+      // TODO: Why is this being escaped at this point in the flow? Should
+      // this just be done in the tpl where all the other fields get escaped?
+      // Is anything depending on this currently or is it just a result of
+      // the see-sawing and some double-escaping that went back and forth
+      // for a few years?
       'value' => htmlspecialchars($this->redact($activityDAO->subject)),
       'type' => 'Memo',
     );
@@ -368,6 +379,7 @@ WHERE      a.id = %1
       );
     }
     $activity['fields'][] = array(
+      'name' => 'Created By',
       'label' => ts('Created By'),
       'value' => $this->redact($creator),
       'type' => 'String',
@@ -397,6 +409,7 @@ WHERE      a.id = %1
     }
 
     $activity['fields'][] = array(
+      'name' => 'Reported By',
       'label' => ts('Reported By'),
       'value' => $this->redact($reporter),
       'type' => 'String',
@@ -415,6 +428,7 @@ WHERE      a.id = %1
       }
       $assigneeContacts = implode(', ', $assignee_contact_names);
       $activity['fields'][] = array(
+        'name' => 'Assigned to',
         'label' => ts('Assigned to'),
         'value' => $assigneeContacts,
         'type' => 'String',
@@ -423,6 +437,7 @@ WHERE      a.id = %1
 
     if ($activityDAO->medium_id) {
       $activity['fields'][] = array(
+        'name' => 'Medium',
         'label' => ts('Medium'),
         'value' => CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'medium_id', $activityDAO->medium_id),
         'type' => 'String',
@@ -430,18 +445,21 @@ WHERE      a.id = %1
     }
 
     $activity['fields'][] = array(
+      'name' => 'Location',
       'label' => ts('Location'),
       'value' => $activityDAO->location,
       'type' => 'String',
     );
 
     $activity['fields'][] = array(
+      'name' => 'Date and Time',
       'label' => ts('Date and Time'),
       'value' => $activityDAO->activity_date_time,
       'type' => 'Date',
     );
 
     $activity['fields'][] = array(
+      'name' => 'Details',
       'label' => ts('Details'),
       'value' => $this->redact(CRM_Utils_String::purifyHTML(CRM_Utils_String::stripAlternatives($activityDAO->details))),
       'type' => 'Memo',
@@ -450,12 +468,14 @@ WHERE      a.id = %1
     // Skip Duration field if empty (to avoid " minutes" output). Might want to do this for all fields at some point. dgg
     if ($activityDAO->duration) {
       $activity['fields'][] = array(
+        'name' => 'Duration',
         'label' => ts('Duration'),
         'value' => $activityDAO->duration . ' ' . ts('minutes'),
         'type' => 'Int',
       );
     }
     $activity['fields'][] = array(
+      'name' => 'Status',
       'label' => ts('Status'),
       'value' => CRM_Core_PseudoConstant::getLabel('CRM_Activity_DAO_Activity', 'activity_status_id',
         $activityDAO->status_id
@@ -464,6 +484,7 @@ WHERE      a.id = %1
     );
 
     $activity['fields'][] = array(
+      'name' => 'Priority',
       'label' => ts('Priority'),
       'value' => CRM_Core_PseudoConstant::getLabel('CRM_Activity_DAO_Activity', 'priority_id',
         $activityDAO->priority_id
@@ -743,7 +764,7 @@ LIMIT  1
     $xml = $form->retrieve($case['caseTypeName']);
 
     $activitySetNames = CRM_Case_XMLProcessor_Process::activitySets($xml->ActivitySets);
-    $pageTitle = CRM_Utils_Array::value($activitySetName, $activitySetNames);
+    $pageTitle = $activitySetNames[$activitySetName] ?? NULL;
     $template->assign('pageTitle', $pageTitle);
 
     if ($activitySetName) {
@@ -963,7 +984,7 @@ LIMIT  1
       $params,
       $report
     );
-    $printReport = CRM_Case_Audit_Audit::run($contents, $clientID, $caseID, TRUE);
+    $printReport = CRM_Case_Audit_Audit::run($contents, $clientID, $caseID);
     echo $printReport;
     CRM_Utils_System::civiExit();
   }
diff --git a/civicrm/CRM/Case/XMLRepository.php b/civicrm/CRM/Case/XMLRepository.php
index 19ed92f2d0..8e1853bd59 100644
--- a/civicrm/CRM/Case/XMLRepository.php
+++ b/civicrm/CRM/Case/XMLRepository.php
@@ -94,7 +94,7 @@ class CRM_Case_XMLRepository {
     //  throw new CRM_Core_Exception("Cannot load caseType with malformed name [$caseType]");
     //}
 
-    if (!CRM_Utils_Array::value($caseType, $this->xml)) {
+    if (empty($this->xml[$caseType])) {
       $fileXml = $this->retrieveFile($caseType);
       if ($fileXml) {
         $this->xml[$caseType] = $fileXml;
diff --git a/civicrm/CRM/Contact/BAO/Contact.php b/civicrm/CRM/Contact/BAO/Contact.php
index 4698884396..5122ec5079 100644
--- a/civicrm/CRM/Contact/BAO/Contact.php
+++ b/civicrm/CRM/Contact/BAO/Contact.php
@@ -105,7 +105,7 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
    */
   public static function add(&$params) {
     $contact = new CRM_Contact_DAO_Contact();
-    $contactID = CRM_Utils_Array::value('contact_id', $params);
+    $contactID = $params['contact_id'] ?? NULL;
     if (empty($params)) {
       return NULL;
     }
@@ -122,7 +122,7 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
         ) {
           // we'll need to fix tests to handle this
           // CRM-7925
-          CRM_Core_Error::fatal(ts('The Contact Sub Type does not match the Contact type for this record'));
+          throw new CRM_Core_Exception(ts('The Contact Sub Type does not match the Contact type for this record'));
         }
         $params['contact_sub_type'] = CRM_Utils_Array::implodePadded($params['contact_sub_type']);
       }
@@ -134,7 +134,7 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
       unset($params['preferred_communication_method']);
     }
 
-    $defaults = ['source' => CRM_Utils_Array::value('contact_source', $params)];
+    $defaults = ['source' => $params['contact_source'] ?? NULL];
     if ($params['contact_type'] === 'Organization' && isset($params['organization_name'])) {
       $defaults['display_name'] = $params['organization_name'];
       $defaults['sort_name'] = $params['organization_name'];
@@ -164,14 +164,11 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
       $contact->sort_name = substr($contact->sort_name, 0, 128);
     }
 
-    $privacy = CRM_Utils_Array::value('privacy', $params);
-    if ($privacy &&
-      is_array($privacy) &&
-      !empty($privacy)
-    ) {
+    $privacy = $params['privacy'] ?? NULL;
+    if ($privacy && is_array($privacy)) {
       $allNull = FALSE;
       foreach (self::$_commPrefs as $name) {
-        $contact->$name = CRM_Utils_Array::value($name, $privacy, FALSE);
+        $contact->$name = $privacy[$name] ?? FALSE;
       }
     }
 
@@ -199,19 +196,14 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
 
     if ($contact->contact_type === 'Individual' && (isset($params['current_employer']) || isset($params['employer_id']))) {
       // Create current employer.
-      $newEmployer = !empty($params['employer_id']) ? $params['employer_id'] : CRM_Utils_Array::value('current_employer', $params);
+      $newEmployer = !empty($params['employer_id']) ? $params['employer_id'] : $params['current_employer'] ?? NULL;
 
-      $newContact = FALSE;
-      if (empty($params['contact_id'])) {
-        $newContact = TRUE;
-      }
+      $newContact = empty($params['contact_id']);
       if ($newEmployer) {
         CRM_Contact_BAO_Contact_Utils::createCurrentEmployerRelationship($contact->id, $newEmployer, $employerId, $newContact);
       }
-      else {
-        if ($employerId) {
-          CRM_Contact_BAO_Contact_Utils::clearCurrentEmployer($contact->id, $employerId);
-        }
+      elseif ($employerId) {
+        CRM_Contact_BAO_Contact_Utils::clearCurrentEmployer($contact->id, $employerId);
       }
     }
 
@@ -244,9 +236,10 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
    * @return CRM_Contact_BAO_Contact|CRM_Core_Error
    *   Created or updated contribution object. We are deprecating returning an error in
    *   favour of exceptions
-   * @throws Exception
-   * @todo explain this parameter
    *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
    */
   public static function &create(&$params, $fixAddress = TRUE, $invokeHooks = TRUE, $skipDelete = FALSE) {
     $contact = NULL;
@@ -295,12 +288,6 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
     $transaction = new CRM_Core_Transaction();
 
     $contact = self::add($params);
-    if (!$contact) {
-      // Not dying here is stupid, since we get into weird situation and into a bug that
-      // is impossible to figure out for the user or for us
-      // CRM-7925
-      CRM_Core_Error::fatal();
-    }
 
     $params['contact_id'] = $contact->id;
 
@@ -360,7 +347,7 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
             'entity_id' => $contact->id,
             'entity_table' => 'civicrm_contact',
             'note' => $note['note'],
-            'subject' => CRM_Utils_Array::value('subject', $note),
+            'subject' => $note['subject'] ?? NULL,
             'contact_id' => $contactId,
           ];
           CRM_Core_BAO_Note::add($noteParams);
@@ -377,7 +364,7 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
           'entity_id' => $contact->id,
           'entity_table' => 'civicrm_contact',
           'note' => $params['note'],
-          'subject' => CRM_Utils_Array::value('subject', $params),
+          'subject' => $params['subject'] ?? NULL,
           'contact_id' => $contactId,
         ];
         CRM_Core_BAO_Note::add($noteParams);
@@ -426,6 +413,16 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
       self::unsetProtectedFields($contacts);
     }
 
+    if (!empty($params['is_deceased'])) {
+      // Edit Membership Status
+      $deceasedParams = [
+        'contact_id' => $contact->id,
+        'is_deceased' => $params['is_deceased'],
+        'deceased_date' => $params['deceased_date'] ?? NULL,
+      ];
+      CRM_Member_BAO_Membership::updateMembershipStatus($deceasedParams, $params['contact_type']);
+    }
+
     return $contact;
   }
 
@@ -439,7 +436,7 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
       $currentUser = CRM_Core_Session::getLoggedInContactID();
       $editOwn = $currentUser && CRM_Core_Permission::check('edit own api keys');
       foreach ($contacts as &$contact) {
-        $cid = is_object($contact) ? $contact->id : CRM_Utils_Array::value('id', $contact);
+        $cid = is_object($contact) ? $contact->id : $contact['id'] ?? NULL;
         if (!($editOwn && $cid == $currentUser)) {
           if (is_object($contact)) {
             unset($contact->api_key);
@@ -683,6 +680,36 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
     return 'address';
   }
 
+  /**
+   * Soft delete a contact.
+   *
+   * Call this via the api, not directly.
+   *
+   * @param \CRM_Contact_BAO_Contact $contact
+   *
+   * @return bool
+   * @throws \CRM_Core_Exception
+   */
+  protected static function contactTrash($contact): bool {
+    $updateParams = [
+      'id' => $contact->id,
+      'is_deleted' => 1,
+    ];
+    CRM_Utils_Hook::pre('update', $contact->contact_type, $contact->id, $updateParams);
+
+    $params = [1 => [$contact->id, 'Integer']];
+    $query = 'DELETE FROM civicrm_uf_match WHERE contact_id = %1';
+    CRM_Core_DAO::executeQuery($query, $params);
+
+    $contact->copyValues($updateParams);
+    $contact->save();
+    CRM_Core_BAO_Log::register($contact->id, 'civicrm_contact', $contact->id);
+
+    CRM_Utils_Hook::post('update', $contact->contact_type, $contact->id, $contact);
+
+    return TRUE;
+  }
+
   /**
    * Create last viewed link to recently updated contact.
    *
@@ -754,7 +781,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
     //lookup value of email/postal greeting, addressee, CRM-4575
     foreach (self::$_greetingTypes as $greeting) {
       $filterCondition = [
-        'contact_type' => CRM_Utils_Array::value('contact_type', $defaults),
+        'contact_type' => $defaults['contact_type'] ?? NULL,
         'greeting_type' => $greeting,
       ];
       CRM_Utils_Array::lookupValue($defaults, $greeting,
@@ -792,7 +819,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
               $reverse
             );
           }
-          $stateProvinceID = self::resolveStateProvinceID($values, CRM_Utils_Array::value('country_id', $values));
+          $stateProvinceID = self::resolveStateProvinceID($values, $values['country_id'] ?? NULL);
           if ($stateProvinceID) {
             $values['state_province_id'] = $stateProvinceID;
           }
@@ -915,10 +942,14 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
    *
    * @return bool
    *   Was contact deleted?
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public static function deleteContact($id, $restore = FALSE, $skipUndelete = FALSE, $checkPermissions = TRUE) {
 
-    if (!$id) {
+    if (!$id || !is_numeric($id)) {
+      CRM_Core_Error::deprecatedFunctionWarning('calling delete contact without a valid contact ID is deprecated.');
       return FALSE;
     }
     // If trash is disabled in system settings then we always skip
@@ -959,14 +990,21 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
 
     $contactType = $contact->contact_type;
     if ($restore) {
-      return self::contactTrashRestore($contact, TRUE);
+      // @todo deprecate calling contactDelete with the intention to restore.
+      $updateParams = [
+        'id' => $contact->id,
+        'is_deleted' => FALSE,
+      ];
+      self::create($updateParams);
+      return TRUE;
     }
 
     // start a new transaction
     $transaction = new CRM_Core_Transaction();
 
     if ($skipUndelete) {
-      CRM_Utils_Hook::pre('delete', $contactType, $id, CRM_Core_DAO::$_nullArray);
+      $hookParams = ['check_permissions' => $checkPermissions];
+      CRM_Utils_Hook::pre('delete', $contactType, $id, $hookParams);
 
       //delete billing address if exists.
       CRM_Contribute_BAO_Contribution::deleteAddress(NULL, $id);
@@ -1004,7 +1042,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
       $contact->delete();
     }
     else {
-      self::contactTrashRestore($contact);
+      self::contactTrash($contact);
     }
     // currently we only clear employer cache.
     // we are now deleting inherited membership if any.
@@ -1196,29 +1234,25 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
    *   True to set the is_delete = 1 else false to restore deleted contact,
    *   i.e. is_delete = 0
    *
+   * @deprecated
+   *
    * @return bool
+   * @throws \CRM_Core_Exception
    */
   public static function contactTrashRestore($contact, $restore = FALSE) {
-    $updateParams = [
-      'id' => $contact->id,
-      'is_deleted' => $restore ? 0 : 1,
-    ];
-
-    CRM_Utils_Hook::pre('update', $contact->contact_type, $contact->id, $updateParams);
+    CRM_Core_Error::deprecatedFunctionWarning('Use the api');
 
-    $params = [1 => [$contact->id, 'Integer']];
-    if (!$restore) {
-      $query = "DELETE FROM civicrm_uf_match WHERE contact_id = %1";
-      CRM_Core_DAO::executeQuery($query, $params);
+    if ($restore) {
+      CRM_Core_Error::deprecatedFunctionWarning('Use contact.create to restore - this does nothing much');
+      // @todo deprecate calling contactDelete with the intention to restore.
+      $updateParams = [
+        'id' => $contact->id,
+        'is_deleted' => FALSE,
+      ];
+      self::create($updateParams);
+      return TRUE;
     }
-
-    $contact->copyValues($updateParams);
-    $contact->save();
-    CRM_Core_BAO_Log::register($contact->id, 'civicrm_contact', $contact->id);
-
-    CRM_Utils_Hook::post('update', $contact->contact_type, $contact->id, $contact);
-
-    return TRUE;
+    return self::contactTrash($contact);
   }
 
   /**
@@ -1330,7 +1364,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
     $cacheKeyString .= $checkPermission ? '_1' : '_0';
     $cacheKeyString .= '_' . CRM_Core_Config::domainID() . '_';
 
-    $fields = CRM_Utils_Array::value($cacheKeyString, self::$_importableFields) ?: Civi::cache('fields')->get($cacheKeyString);
+    $fields = self::$_importableFields[$cacheKeyString] ?? Civi::cache('fields')->get($cacheKeyString);
 
     if (!$fields) {
       $fields = CRM_Contact_DAO_Contact::import();
@@ -1483,7 +1517,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
     //as an interim fix we will cache the fields by contact
     $cacheKeyString .= '_' . CRM_Core_Session::getLoggedInContactID();
 
-    if (!self::$_exportableFields || !CRM_Utils_Array::value($cacheKeyString, self::$_exportableFields)) {
+    if (!self::$_exportableFields || empty(self::$_exportableFields[$cacheKeyString])) {
       if (!self::$_exportableFields) {
         self::$_exportableFields = [];
       }
@@ -1608,7 +1642,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
 
         //Sorting fields in alphabetical order(CRM-1507)
         foreach ($fields as $k => $v) {
-          $sortArray[$k] = CRM_Utils_Array::value('title', $v);
+          $sortArray[$k] = $v['title'] ?? NULL;
         }
 
         $fields = array_merge($sortArray, $fields);
@@ -1746,7 +1780,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
             $locationTypeName = 1;
           }
           else {
-            $locationTypeName = CRM_Utils_Array::value($id, $locationTypes);
+            $locationTypeName = $locationTypes[$id] ?? NULL;
             if (!$locationTypeName) {
               continue;
             }
@@ -1812,7 +1846,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
       $blocks = CRM_Core_BAO_Location::getValues($entityBlock);
       foreach ($blocks[$block] as $key => $value) {
         if (!empty($value['is_primary'])) {
-          $locationType = CRM_Utils_Array::value('location_type_id', $value);
+          $locationType = $value['location_type_id'] ?? NULL;
         }
       }
     }
@@ -1896,9 +1930,9 @@ ORDER BY civicrm_email.is_primary DESC";
         $name = $dao->display_name;
       }
       $email = $dao->email;
-      $doNotEmail = $dao->do_not_email ? TRUE : FALSE;
-      $onHold = $dao->on_hold ? TRUE : FALSE;
-      $isDeceased = $dao->is_deceased ? TRUE : FALSE;
+      $doNotEmail = (bool) $dao->do_not_email;
+      $onHold = (bool) $dao->on_hold;
+      $isDeceased = (bool) $dao->is_deceased;
       return [$name, $email, $doNotEmail, $onHold, $isDeceased];
     }
     return [NULL, NULL, NULL, NULL, NULL];
@@ -1961,8 +1995,8 @@ ORDER BY civicrm_email.is_primary DESC";
 
     // manage is_opt_out
     if (array_key_exists('is_opt_out', $fields) && array_key_exists('is_opt_out', $params)) {
-      $wasOptOut = CRM_Utils_Array::value('is_opt_out', $contactDetails, FALSE);
-      $isOptOut = CRM_Utils_Array::value('is_opt_out', $params, FALSE);
+      $wasOptOut = $contactDetails['is_opt_out'] ?? FALSE;
+      $isOptOut = $params['is_opt_out'];
       $data['is_opt_out'] = $isOptOut;
       // on change, create new civicrm_subscription_history entry
       if (($wasOptOut != $isOptOut) && !empty($contactDetails['contact_id'])) {
@@ -2054,8 +2088,8 @@ ORDER BY civicrm_email.is_primary DESC";
       $details = self::getHierContactDetails($contactID, $fields);
 
       $contactDetails = $details[$contactID];
-      $data['contact_type'] = CRM_Utils_Array::value('contact_type', $contactDetails);
-      $data['contact_sub_type'] = CRM_Utils_Array::value('contact_sub_type', $contactDetails);
+      $data['contact_type'] = $contactDetails['contact_type'] ?? NULL;
+      $data['contact_sub_type'] = $contactDetails['contact_sub_type'] ?? NULL;
     }
     else {
       //we should get contact type only if contact
@@ -2104,10 +2138,10 @@ ORDER BY civicrm_email.is_primary DESC";
     }
 
     if ($ctype == 'Organization') {
-      $data['organization_name'] = CRM_Utils_Array::value('organization_name', $contactDetails);
+      $data['organization_name'] = $contactDetails['organization_name'] ?? NULL;
     }
     elseif ($ctype == 'Household') {
-      $data['household_name'] = CRM_Utils_Array::value('household_name', $contactDetails);
+      $data['household_name'] = $contactDetails['household_name'] ?? NULL;
     }
 
     $locationType = [];
@@ -2604,7 +2638,7 @@ AND       civicrm_openid.is_primary = 1";
       CRM_Core_OptionGroup::lookupValues($temp, $names, FALSE);
 
       $values['preferred_communication_method'] = $preffComm;
-      $values['preferred_communication_method_display'] = CRM_Utils_Array::value('preferred_communication_method_display', $temp);
+      $values['preferred_communication_method_display'] = $temp['preferred_communication_method_display'] ?? NULL;
 
       if ($contact->preferred_mail_format) {
         $preferredMailingFormat = CRM_Core_SelectValues::pmf();
@@ -2621,8 +2655,8 @@ AND       civicrm_openid.is_primary = 1";
         $birthDate = CRM_Utils_Date::customFormat($contact->birth_date, '%Y%m%d');
         if ($birthDate < date('Ymd')) {
           $age = CRM_Utils_Date::calculateAge($birthDate);
-          $values['age']['y'] = CRM_Utils_Array::value('years', $age);
-          $values['age']['m'] = CRM_Utils_Array::value('months', $age);
+          $values['age']['y'] = $age['years'] ?? NULL;
+          $values['age']['m'] = $age['months'] ?? NULL;
         }
       }
 
@@ -3195,7 +3229,7 @@ AND       civicrm_openid.is_primary = 1";
           $contextMenu['primaryActions'][$key] = [
             'title' => $values['title'],
             'ref' => $values['ref'],
-            'class' => CRM_Utils_Array::value('class', $values),
+            'class' => $values['class'] ?? NULL,
             'key' => $values['key'],
           ];
           continue;
@@ -3205,9 +3239,9 @@ AND       civicrm_openid.is_primary = 1";
         $contextMenu['moreActions'][$values['weight']] = [
           'title' => $values['title'],
           'ref' => $values['ref'],
-          'href' => CRM_Utils_Array::value('href', $values),
-          'tab' => CRM_Utils_Array::value('tab', $values),
-          'class' => CRM_Utils_Array::value('class', $values),
+          'href' => $values['href'] ?? NULL,
+          'tab' => $values['tab'] ?? NULL,
+          'class' => $values['class'] ?? NULL,
           'key' => $values['key'],
         ];
       }
@@ -3222,10 +3256,10 @@ AND       civicrm_openid.is_primary = 1";
           $contextMenu['otherActions'][$value['weight']] = [
             'title' => $value['title'],
             'ref' => $value['ref'],
-            'href' => CRM_Utils_Array::value('href', $value),
-            'tab' => CRM_Utils_Array::value('tab', $value),
-            'class' => CRM_Utils_Array::value('class', $value),
-            'icon' => CRM_Utils_Array::value('icon', $value),
+            'href' => $value['href'] ?? NULL,
+            'tab' => $value['tab'] ?? NULL,
+            'class' => $value['class'] ?? NULL,
+            'icon' => $value['icon'] ?? NULL,
             'key' => $value['key'],
           ];
         }
@@ -3252,7 +3286,7 @@ AND       civicrm_openid.is_primary = 1";
    *   TRUE if user has all permissions, FALSE if otherwise.
    */
   public static function checkUserMenuPermissions($aclPermissionedTasks, $corePermission, $menuOptions) {
-    $componentName = CRM_Utils_Array::value('component', $menuOptions);
+    $componentName = $menuOptions['component'] ?? NULL;
 
     // if component action - make sure component is enable.
     if ($componentName && !in_array($componentName, CRM_Core_Config::singleton()->enableComponents)) {
@@ -3262,7 +3296,7 @@ AND       civicrm_openid.is_primary = 1";
     // make sure user has all required permissions.
     $hasAllPermissions = FALSE;
 
-    $permissions = CRM_Utils_Array::value('permissions', $menuOptions);
+    $permissions = $menuOptions['permissions'] ?? NULL;
     if (!is_array($permissions) || empty($permissions)) {
       $hasAllPermissions = TRUE;
     }
@@ -3620,7 +3654,7 @@ LEFT JOIN civicrm_address ON ( civicrm_address.contact_id = civicrm_contact.id )
   public static function isFieldHasLocationType($fieldTitle) {
     foreach (CRM_Contact_BAO_Contact::importableFields() as $key => $field) {
       if ($field['title'] === $fieldTitle) {
-        return CRM_Utils_Array::value('hasLocationType', $field);
+        return $field['hasLocationType'] ?? NULL;
       }
     }
     return FALSE;
@@ -3660,7 +3694,7 @@ LEFT JOIN civicrm_address ON ( civicrm_address.contact_id = civicrm_contact.id )
             'url' => CRM_Utils_System::url('civicrm/profile/create', "reset=1&context=dialog&gid=$id",
               NULL, NULL, FALSE, FALSE, TRUE),
             'type' => ucfirst(str_replace('new_', '', $profile['name'])),
-            'icon' => CRM_Utils_Array::value(str_replace('new_', '', $profile['name']), $icons),
+            'icon' => $icons[str_replace('new_', '', $profile['name'])] ?? NULL,
           ];
         }
         else {
diff --git a/civicrm/CRM/Contact/BAO/Contact/Location.php b/civicrm/CRM/Contact/BAO/Contact/Location.php
index 105cbede78..497cf97768 100644
--- a/civicrm/CRM/Contact/BAO/Contact/Location.php
+++ b/civicrm/CRM/Contact/BAO/Contact/Location.php
@@ -184,7 +184,7 @@ AND civicrm_contact.id IN $idString ";
       $location['displayAddress'] = str_replace('<br />', ', ', addslashes($address));
       $location['url'] = CRM_Utils_System::url('civicrm/contact/view', 'reset=1&cid=' . $dao->contact_id);
       $location['location_type'] = $dao->location_type;
-      $location['image'] = CRM_Contact_BAO_Contact_Utils::getImage(isset($dao->contact_sub_type) ? $dao->contact_sub_type : $dao->contact_type, $imageUrlOnly, $dao->contact_id
+      $location['image'] = CRM_Contact_BAO_Contact_Utils::getImage($dao->contact_sub_type ?? $dao->contact_type, $imageUrlOnly, $dao->contact_id
       );
       $locations[] = $location;
     }
diff --git a/civicrm/CRM/Contact/BAO/Contact/Utils.php b/civicrm/CRM/Contact/BAO/Contact/Utils.php
index 2e43667b73..fa355a42bc 100644
--- a/civicrm/CRM/Contact/BAO/Contact/Utils.php
+++ b/civicrm/CRM/Contact/BAO/Contact/Utils.php
@@ -55,15 +55,11 @@ class CRM_Contact_BAO_Contact_Utils {
         $imageInfo[$contactType]['url'] = $imageUrl;
       }
       else {
-        $isSubtype = (array_key_exists('parent_id', $typeInfo) &&
-          $typeInfo['parent_id']
-        ) ? TRUE : FALSE;
-
-        if ($isSubtype) {
+        if (!empty($typeInfo['parent_id'])) {
           $type = CRM_Contact_BAO_ContactType::getBasicType($typeInfo['name']) . '-subtype';
         }
         else {
-          $type = CRM_Utils_Array::value('name', $typeInfo);
+          $type = $typeInfo['name'] ?? NULL;
         }
 
         // do not add title since it hides contact name
@@ -118,7 +114,7 @@ FROM   civicrm_contact
 WHERE  id IN ( $idString )
 ";
     $count = CRM_Core_DAO::singleValueQuery($query);
-    return $count > 1 ? TRUE : FALSE;
+    return $count > 1;
   }
 
   /**
@@ -209,9 +205,9 @@ WHERE  id IN ( $idString )
 
     $input = CRM_Utils_System::explode('_', $inputCheck, 3);
 
-    $inputCS = CRM_Utils_Array::value(0, $input);
-    $inputTS = CRM_Utils_Array::value(1, $input);
-    $inputLF = CRM_Utils_Array::value(2, $input);
+    $inputCS = $input[0] ?? NULL;
+    $inputTS = $input[1] ?? NULL;
+    $inputLF = $input[2] ?? NULL;
 
     $check = self::generateChecksum($contactID, $inputTS, $inputLF);
     // Joomla_11 - If $inputcheck is null without explicitly casting to a string
@@ -584,7 +580,7 @@ LEFT JOIN  civicrm_email ce ON ( ce.contact_id=c.id AND ce.is_primary = 1 )
       $contactLinks['rows'][$i]['primary_email'] = $dao->email;
 
       // get the permission for current contact id.
-      $hasPermissions = CRM_Utils_Array::value($dao->id, $permissionedContactIds);
+      $hasPermissions = $permissionedContactIds[$dao->id] ?? NULL;
       if (!is_array($hasPermissions) || empty($hasPermissions)) {
         $i++;
         continue;
@@ -799,7 +795,7 @@ INNER JOIN civicrm_contact contact_target ON ( contact_target.id = act.contact_i
 
       // 3. get the address details for master_id
       $masterAddress = new CRM_Core_BAO_Address();
-      $masterAddress->id = CRM_Utils_Array::value('master_id', $values);
+      $masterAddress->id = $values['master_id'] ?? NULL;
       $masterAddress->find(TRUE);
 
       // 4. CRM-10336: Empty all fields (execept the fields to skip)
@@ -893,9 +889,9 @@ INNER JOIN civicrm_contact contact_target ON ( contact_target.id = act.contact_i
   public static function updateGreeting($params) {
     $contactType = $params['ct'];
     $greeting = $params['gt'];
-    $valueID = $id = CRM_Utils_Array::value('id', $params);
-    $force = CRM_Utils_Array::value('force', $params);
-    $limit = CRM_Utils_Array::value('limit', $params);
+    $valueID = $id = $params['id'] ?? NULL;
+    $force = $params['force'] ?? NULL;
+    $limit = $params['limit'] ?? NULL;
 
     // if valueID is not passed use default value
     if (!$valueID) {
@@ -908,14 +904,14 @@ INNER JOIN civicrm_contact contact_target ON ( contact_target.id = act.contact_i
     ];
 
     $allGreetings = CRM_Core_PseudoConstant::greeting($filter);
-    $originalGreetingString = $greetingString = CRM_Utils_Array::value($valueID, $allGreetings);
+    $originalGreetingString = $greetingString = $allGreetings[$valueID] ?? NULL;
     if (!$greetingString) {
       throw new CRM_Core_Exception(ts('Incorrect greeting value id %1, or no default greeting for this contact type and greeting type.', [1 => $valueID]));
     }
 
     // build return properties based on tokens
     $greetingTokens = CRM_Utils_Token::getTokens($greetingString);
-    $tokens = CRM_Utils_Array::value('contact', $greetingTokens);
+    $tokens = $greetingTokens['contact'] ?? NULL;
     $greetingsReturnProperties = [];
     if (is_array($tokens)) {
       $greetingsReturnProperties = array_fill_keys(array_values($tokens), 1);
@@ -1081,7 +1077,7 @@ WHERE id IN (" . implode(',', $contactIds) . ")";
       if (!empty($contactParams[$greeting . '_id'])) {
         $string = CRM_Core_PseudoConstant::getLabel('CRM_Contact_BAO_Contact', $greeting . '_id', $contactParams[$greeting . '_id']);
       }
-      $string = isset($contactParams[$greeting . '_custom']) ? $contactParams[$greeting . '_custom'] : $string;
+      $string = $contactParams[$greeting . '_custom'] ?? $string;
       if (empty($string)) {
         $tokens[$greeting] = [];
       }
@@ -1117,7 +1113,10 @@ WHERE id IN (" . implode(',', $contactIds) . ")";
    */
   public static function processGreetingTemplate(&$templateString, $contactDetails, $contactID, $className) {
     CRM_Utils_Token::replaceGreetingTokens($templateString, $contactDetails, $contactID, $className, TRUE);
-
+    if (!CRM_Utils_String::stringContainsTokens($templateString)) {
+      // Skip expensive smarty processing.
+      return;
+    }
     $smarty = CRM_Core_Smarty::singleton();
     $templateString = $smarty->fetch("string:$templateString");
   }
diff --git a/civicrm/CRM/Contact/BAO/ContactType.php b/civicrm/CRM/Contact/BAO/ContactType.php
index 69b774299b..947f8dc430 100644
--- a/civicrm/CRM/Contact/BAO/ContactType.php
+++ b/civicrm/CRM/Contact/BAO/ContactType.php
@@ -46,7 +46,7 @@ class CRM_Contact_BAO_ContactType extends CRM_Contact_DAO_ContactType {
    */
   public static function isActive($contactType) {
     $contact = self::contactTypeInfo(FALSE);
-    $active = array_key_exists($contactType, $contact) ? TRUE : FALSE;
+    $active = array_key_exists($contactType, $contact);
     return $active;
   }
 
@@ -515,7 +515,7 @@ WHERE  subtype.name IN ('" . implode("','", $subType) . "' )";
     foreach ($contactTypes as $key => $value) {
       if ($key) {
         $typeValue = explode(CRM_Core_DAO::VALUE_SEPARATOR, $key);
-        $cType = CRM_Utils_Array::value('0', $typeValue);
+        $cType = $typeValue['0'] ?? NULL;
         $typeUrl = 'ct=' . $cType;
         if ($csType = CRM_Utils_Array::value('1', $typeValue)) {
           $typeUrl .= "&cst=$csType";
@@ -612,7 +612,7 @@ WHERE name = %1";
 
     $contactType = new CRM_Contact_DAO_ContactType();
     $contactType->copyValues($params);
-    $contactType->id = CRM_Utils_Array::value('id', $params);
+    $contactType->id = $params['id'] ?? NULL;
     $contactType->is_active = CRM_Utils_Array::value('is_active', $params, 0);
 
     $contactType->save();
diff --git a/civicrm/CRM/Contact/BAO/Group.php b/civicrm/CRM/Contact/BAO/Group.php
index 57692ca8df..ec214b8142 100644
--- a/civicrm/CRM/Contact/BAO/Group.php
+++ b/civicrm/CRM/Contact/BAO/Group.php
@@ -364,7 +364,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
       }
     }
     // form the name only if missing: CRM-627
-    $nameParam = CRM_Utils_Array::value('name', $params, NULL);
+    $nameParam = $params['name'] ?? NULL;
     if (!$nameParam && empty($params['id'])) {
       $params['name'] = CRM_Utils_String::titleToVar($params['title']);
     }
@@ -645,7 +645,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
    *   ( smartGroupId, ssId ) smart group id and saved search id
    */
   public static function createHiddenSmartGroup($params) {
-    $ssId = CRM_Utils_Array::value('saved_search_id', $params);
+    $ssId = $params['saved_search_id'] ?? NULL;
 
     //add mapping record only for search builder saved search
     $mappingId = NULL;
@@ -677,7 +677,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
     $formValues = $params['search_context'] === 'builder' ? $params['form_values'] : CRM_Contact_BAO_Query::convertFormValues($params['form_values']);
     $savedSearch->form_values = serialize($formValues);
     $savedSearch->mapping_id = $mappingId;
-    $savedSearch->search_custom_id = CRM_Utils_Array::value('search_custom_id', $params);
+    $savedSearch->search_custom_id = $params['search_custom_id'] ?? NULL;
     $savedSearch->save();
 
     $ssId = $savedSearch->id;
@@ -695,8 +695,8 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
         'title' => "Hidden Smart Group {$ssId}",
         'is_active' => CRM_Utils_Array::value('is_active', $params, 1),
         'is_hidden' => CRM_Utils_Array::value('is_hidden', $params, 1),
-        'group_type' => CRM_Utils_Array::value('group_type', $params),
-        'visibility' => CRM_Utils_Array::value('visibility', $params),
+        'group_type' => $params['group_type'] ?? NULL,
+        'visibility' => $params['visibility'] ?? NULL,
         'saved_search_id' => $ssId,
       ];
 
@@ -735,7 +735,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
     // format the params
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['rowCount'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
 
     // get groups
     $groups = CRM_Contact_BAO_Group::getGroupList($params);
@@ -781,7 +781,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
       $group['DT_RowAttr']['data-id'] = $value['id'];
       $group['DT_RowAttr']['data-entity'] = 'group';
 
-      $group['description'] = CRM_Utils_Array::value('description', $value);
+      $group['description'] = $value['description'] ?? NULL;
 
       if (!empty($value['group_type'])) {
         $group['group_type'] = $value['group_type'];
@@ -792,8 +792,8 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
 
       $group['visibility'] = $value['visibility'];
       $group['links'] = $value['action'];
-      $group['org_info'] = CRM_Utils_Array::value('org_info', $value);
-      $group['created_by'] = CRM_Utils_Array::value('created_by', $value);
+      $group['org_info'] = $value['org_info'] ?? NULL;
+      $group['created_by'] = $value['created_by'] ?? NULL;
 
       $group['is_parent'] = $value['is_parent'];
 
@@ -942,7 +942,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
         );
         $types = [];
         foreach ($groupTypes as $type) {
-          $types[] = CRM_Utils_Array::value($type, $allTypes);
+          $types[] = $allTypes[$type] ?? NULL;
         }
         $values[$object->id]['group_type'] = implode(', ', $types);
       }
@@ -1167,7 +1167,7 @@ WHERE {$whereClause}";
    */
   public static function whereClause(&$params, $sortBy = TRUE, $excludeHidden = TRUE) {
     $values = [];
-    $title = CRM_Utils_Array::value('title', $params);
+    $title = $params['title'] ?? NULL;
     if ($title) {
       $clauses[] = "`groups`.title LIKE %1";
       if (strpos($title, '%') !== FALSE) {
@@ -1178,7 +1178,7 @@ WHERE {$whereClause}";
       }
     }
 
-    $groupType = CRM_Utils_Array::value('group_type', $params);
+    $groupType = $params['group_type'] ?? NULL;
     if ($groupType) {
       $types = explode(',', $groupType);
       if (!empty($types)) {
@@ -1188,13 +1188,13 @@ WHERE {$whereClause}";
       }
     }
 
-    $visibility = CRM_Utils_Array::value('visibility', $params);
+    $visibility = $params['visibility'] ?? NULL;
     if ($visibility) {
       $clauses[] = '`groups`.visibility = %3';
       $params[3] = [$visibility, 'String'];
     }
 
-    $groupStatus = CRM_Utils_Array::value('status', $params);
+    $groupStatus = $params['status'] ?? NULL;
     if ($groupStatus) {
       switch ($groupStatus) {
         case 1:
@@ -1213,13 +1213,13 @@ WHERE {$whereClause}";
       }
     }
 
-    $parentsOnly = CRM_Utils_Array::value('parentsOnly', $params);
+    $parentsOnly = $params['parentsOnly'] ?? NULL;
     if ($parentsOnly) {
       $clauses[] = '`groups`.parents IS NULL';
     }
 
     // only show child groups of a specific parent group
-    $parent_id = CRM_Utils_Array::value('parent_id', $params);
+    $parent_id = $params['parent_id'] ?? NULL;
     if ($parent_id) {
       $clauses[] = '`groups`.id IN (SELECT child_group_id FROM civicrm_group_nesting WHERE parent_group_id = %5)';
       $params[5] = [$parent_id, 'Integer'];
diff --git a/civicrm/CRM/Contact/BAO/GroupContactCache.php b/civicrm/CRM/Contact/BAO/GroupContactCache.php
index 3234710a6b..c97afa799b 100644
--- a/civicrm/CRM/Contact/BAO/GroupContactCache.php
+++ b/civicrm/CRM/Contact/BAO/GroupContactCache.php
@@ -726,13 +726,9 @@ ORDER BY   gc.contact_id, g.children
    * @throws CRM_Core_Exception
    */
   protected static function getApiSQL($savedSearchID, array $savedSearch): array {
-    $api = \Civi\API\Request::create($savedSearch['api_entity'], 'get', $savedSearch['api_params']);
-    $query = new \Civi\Api4\Query\Api4SelectQuery($api->getEntityName(), FALSE, $api->entityFields());
-    $query->select = ['id'];
-    $query->where = $api->getWhere();
-    $query->orderBy = $api->getOrderBy();
-    $query->limit = $api->getLimit();
-    $query->offset = $api->getOffset();
+    $apiParams = ['select' => ['id'], 'checkPermissions' => FALSE] + $savedSearch['api_params'];
+    $api = \Civi\API\Request::create($savedSearch['api_entity'], 'get', $apiParams);
+    $query = new \Civi\Api4\Query\Api4SelectQuery($api);
     $sql = $query->getSql();
     return [
       'select' => substr($sql, 0, strpos($sql, 'FROM')),
diff --git a/civicrm/CRM/Contact/BAO/Individual.php b/civicrm/CRM/Contact/BAO/Individual.php
index f19325b3b2..679e9229f5 100644
--- a/civicrm/CRM/Contact/BAO/Individual.php
+++ b/civicrm/CRM/Contact/BAO/Individual.php
@@ -225,7 +225,7 @@ class CRM_Contact_BAO_Individual extends CRM_Contact_DAO_Contact {
           }
         }
       }
-      $uniqId = CRM_Utils_Array::value('user_unique_id', $params);
+      $uniqId = $params['user_unique_id'] ?? NULL;
       if (!$email && $contact->id) {
         $email = CRM_Contact_BAO_Contact::getPrimaryEmail($contact->id);
       }
diff --git a/civicrm/CRM/Contact/BAO/Query.php b/civicrm/CRM/Contact/BAO/Query.php
index 5e61c40d13..d41bfea47a 100644
--- a/civicrm/CRM/Contact/BAO/Query.php
+++ b/civicrm/CRM/Contact/BAO/Query.php
@@ -516,8 +516,9 @@ class CRM_Contact_BAO_Query {
       $this->_fields = array_merge($this->_fields, $fields);
 
       // add activity fields
-      $fields = CRM_Activity_BAO_Activity::exportableFields();
-      $this->_fields = array_merge($this->_fields, $fields);
+      $this->_fields = array_merge($this->_fields, CRM_Activity_BAO_Activity::exportableFields());
+      // Add hack as no unique name is defined for the field but the search form is in denial.
+      $this->_fields['activity_priority_id'] = $this->_fields['priority_id'];
 
       // add any fields provided by hook implementers
       $extFields = CRM_Contact_BAO_Query_Hook::singleton()->getFields();
@@ -788,7 +789,7 @@ class CRM_Contact_BAO_Query {
         elseif (isset($field['where'])) {
           list($tableName, $fieldName) = explode('.', $field['where'], 2);
           if (isset($tableName)) {
-            if (CRM_Utils_Array::value($tableName, self::$_dependencies)) {
+            if (!empty(self::$_dependencies[$tableName])) {
               $this->_tables['civicrm_address'] = 1;
               $this->_select['address_id'] = 'civicrm_address.id as address_id';
               $this->_element['address_id'] = 1;
@@ -1118,7 +1119,7 @@ class CRM_Contact_BAO_Query {
           $elementType = '-' . $elementType;
         }
 
-        $field = CRM_Utils_Array::value($elementName, $this->_fields);
+        $field = $this->_fields[$elementName] ?? NULL;
 
         // hack for profile, add location id
         if (!$field) {
@@ -1127,28 +1128,28 @@ class CRM_Contact_BAO_Query {
             !is_numeric($elementType)
           ) {
             if (is_numeric($name)) {
-              $field = CRM_Utils_Array::value($elementName . "-Primary$elementType", $this->_fields);
+              $field = $this->_fields[$elementName . "-Primary$elementType"] ?? NULL;
             }
             else {
-              $field = CRM_Utils_Array::value($elementName . "-$locationTypeId$elementType", $this->_fields);
+              $field = $this->_fields[$elementName . "-$locationTypeId$elementType"] ?? NULL;
             }
           }
           elseif (is_numeric($name)) {
             //this for phone type to work
             if (in_array($elementName, ['phone', 'phone_ext'])) {
-              $field = CRM_Utils_Array::value($elementName . "-Primary" . $elementType, $this->_fields);
+              $field = $this->_fields[$elementName . "-Primary" . $elementType] ?? NULL;
             }
             else {
-              $field = CRM_Utils_Array::value($elementName . "-Primary", $this->_fields);
+              $field = $this->_fields[$elementName . "-Primary"] ?? NULL;
             }
           }
           else {
             //this is for phone type to work for profile edit
             if (in_array($elementName, ['phone', 'phone_ext'])) {
-              $field = CRM_Utils_Array::value($elementName . "-$locationTypeId$elementType", $this->_fields);
+              $field = $this->_fields[$elementName . "-$locationTypeId$elementType"] ?? NULL;
             }
             else {
-              $field = CRM_Utils_Array::value($elementName . "-$locationTypeId", $this->_fields);
+              $field = $this->_fields[$elementName . "-$locationTypeId"] ?? NULL;
             }
           }
         }
@@ -2040,7 +2041,7 @@ class CRM_Contact_BAO_Query {
         // check for both id and contact_id
         if ($this->_params[$id][0] == 'id' || $this->_params[$id][0] == 'contact_id') {
           $this->_where[0][] = self::buildClause("contact_a.id", $this->_params[$id][1], $this->_params[$id][2]);
-          $field = CRM_Utils_Array::value('id', $this->_fields);
+          $field = $this->_fields['id'] ?? NULL;
           list($qillop, $qillVal) = CRM_Contact_BAO_Query::buildQillForFieldValue(
             'CRM_Contact_BAO_Contact',
             "contact_a.id",
@@ -2108,11 +2109,11 @@ class CRM_Contact_BAO_Query {
    * @throws Exception
    */
   public function restWhere(&$values) {
-    $name = CRM_Utils_Array::value(0, $values);
-    $op = CRM_Utils_Array::value(1, $values);
-    $value = CRM_Utils_Array::value(2, $values);
-    $grouping = CRM_Utils_Array::value(3, $values);
-    $wildcard = CRM_Utils_Array::value(4, $values);
+    $name = $values[0] ?? NULL;
+    $op = $values[1] ?? NULL;
+    $value = $values[2] ?? NULL;
+    $grouping = $values[3] ?? NULL;
+    $wildcard = $values[4] ?? NULL;
 
     if (isset($grouping) && empty($this->_where[$grouping])) {
       $this->_where[$grouping] = [];
@@ -2131,10 +2132,10 @@ class CRM_Contact_BAO_Query {
       }
     }
 
-    $field = CRM_Utils_Array::value($name, $this->_fields);
+    $field = $this->_fields[$name] ?? NULL;
 
     if (!$field) {
-      $field = CRM_Utils_Array::value($locType[0], $this->_fields);
+      $field = $this->_fields[$locType[0]] ?? NULL;
 
       if (!$field) {
         // Strip any trailing _high & _low that might be appended.
@@ -2893,7 +2894,7 @@ class CRM_Contact_BAO_Query {
     else {
       $contactTypeANDSubType = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value, 2);
       $contactType = $contactTypeANDSubType[0];
-      $subType = CRM_Utils_Array::value(1, $contactTypeANDSubType);
+      $subType = $contactTypeANDSubType[1] ?? NULL;
       if (!empty($subType)) {
         $subTypes[$subType] = 1;
       }
@@ -3491,7 +3492,8 @@ WHERE  $smartGroupClause
     }
     // Replace spaces with wildcards for a LIKE operation
     // UNLESS string contains a comma (this exception is a tiny bit questionable)
-    elseif ($op == 'LIKE' && strpos($value, ',') === FALSE) {
+    // Also need to check if there is space in between sort name.
+    elseif ($op == 'LIKE' && strpos($value, ',') === FALSE && strpos($value, ' ') === TRUE) {
       $value = str_replace(' ', '%', $value);
     }
     $value = CRM_Core_DAO::escapeString(trim($value));
@@ -3902,7 +3904,7 @@ WHERE  $smartGroupClause
 
       $county = CRM_Core_PseudoConstant::county();
       foreach ($value as $id) {
-        $names[] = CRM_Utils_Array::value($id, $county);
+        $names[] = $county[$id] ?? NULL;
       }
     }
     else {
@@ -4055,9 +4057,9 @@ WHERE  $smartGroupClause
         $value = $value[$op];
       }
     }
+    $field = $this->_fields[$name] ?? NULL;
     CRM_Utils_Type::validate($value, 'Integer');
     $this->_where[$grouping][] = "contact_a.{$name} $op $value";
-    $field = CRM_Utils_Array::value($name, $this->_fields);
     $op = CRM_Utils_Array::value($op, CRM_Core_SelectValues::getSearchBuilderOperators(), $op);
     $title = $field ? $field['title'] : $name;
     $this->_qill[$grouping][] = "$title $op $value";
@@ -4095,7 +4097,7 @@ WHERE  $smartGroupClause
     $qill = [];
     foreach ($value as $dontCare => $pOption) {
       $clauses[] = " ( contact_a.{$pOption} = 1 ) ";
-      $field = CRM_Utils_Array::value($pOption, $this->_fields);
+      $field = $this->_fields[$pOption] ?? NULL;
       $title = $field ? $field['title'] : $pOption;
       $qill[] = " $title = 1 ";
     }
@@ -4726,13 +4728,13 @@ civicrm_relationship.start_date > {$today}
       list($from, $to) = CRM_Utils_Date::getFromTo($values, NULL, NULL);
     }
     else {
-      if ($fieldName == $customFieldName . '_to' && CRM_Utils_Array::value($customFieldName . '_from', $formValues)) {
+      if ($fieldName == $customFieldName . '_to' && !empty($formValues[$customFieldName . '_from'])) {
         // Both to & from are set. We only need to acton one, choosing from.
         return;
       }
 
-      $from = CRM_Utils_Array::value($customFieldName . '_from', $formValues, NULL);
-      $to = CRM_Utils_Array::value($customFieldName . '_to', $formValues, NULL);
+      $from = $formValues[$customFieldName . '_from'] ?? NULL;
+      $to = $formValues[$customFieldName . '_to'] ?? NULL;
 
       if (self::isCustomDateField($customFieldName)) {
         list($from, $to) = CRM_Utils_Date::getFromTo(NULL, $from, $to);
@@ -5845,7 +5847,7 @@ AND   displayRelType.is_active = 1
    * @return bool
    */
   public static function caseImportant($op) {
-    return in_array($op, ['LIKE', 'IS NULL', 'IS NOT NULL', 'IS EMPTY', 'IS NOT EMPTY']) ? FALSE : TRUE;
+    return !in_array($op, ['LIKE', 'IS NULL', 'IS NOT NULL', 'IS EMPTY', 'IS NOT EMPTY']);
   }
 
   /**
@@ -6023,7 +6025,7 @@ AND   displayRelType.is_active = 1
             }
 
             $dao->$key = ($usedForAPI) ? $convertedValues : implode(', ', $convertedValues);
-            $realFieldName = CRM_Utils_Array::value('field_name', $this->_pseudoConstantsSelect[$key]);
+            $realFieldName = $this->_pseudoConstantsSelect[$key]['field_name'] ?? NULL;
             if ($usedForAPI && $realFieldName) {
               // normally we would see 2 fields returned for pseudoConstants. An exception is
               // preferred_communication_method where there is no id-variant.
@@ -6315,7 +6317,7 @@ AND   displayRelType.is_active = 1
     $nullableFields = ['contribution_batch_id'];
 
     foreach ($specialFields as $element) {
-      $value = CRM_Utils_Array::value($element, $formValues);
+      $value = $formValues[$element] ?? NULL;
       if ($value) {
         if (is_array($value)) {
           if (in_array($element, array_keys($changeNames))) {
@@ -6405,7 +6407,7 @@ AND   displayRelType.is_active = 1
     foreach ($orderByArray as $orderByClause) {
       $orderByClauseParts = explode(' ', trim($orderByClause));
       $field = $orderByClauseParts[0];
-      $direction = isset($orderByClauseParts[1]) ? $orderByClauseParts[1] : 'asc';
+      $direction = $orderByClauseParts[1] ?? 'asc';
       $fieldSpec = $this->getMetadataForRealField($field);
 
       // This is a hacky add-in for primary address joins. Feel free to iterate as it is unit tested.
@@ -6553,15 +6555,15 @@ AND   displayRelType.is_active = 1
       return FALSE;
     }
 
-    if (!empty($pseudoConstant['optionGroupName']) && CRM_Utils_Array::value($pseudoConstant['optionGroupName'], $this->_returnProperties)) {
+    if (!empty($pseudoConstant['optionGroupName']) && !empty($this->_returnProperties[$pseudoConstant['optionGroupName']])) {
       return TRUE;
     }
-    if (CRM_Utils_Array::value($fieldName, $this->_returnProperties)) {
+    if (!empty($this->_returnProperties[$fieldName])) {
       return TRUE;
     }
     // Is this still required - the above goes off the unique name. Test with things like
     // communication_preferences & prefix_id.
-    if (CRM_Utils_Array::value($field['name'], $this->_returnProperties)) {
+    if (!empty($this->_returnProperties[$field['name']])) {
       return TRUE;
     }
     return FALSE;
@@ -6808,9 +6810,9 @@ AND   displayRelType.is_active = 1
     // if we’re explicitly looking for a certain contact’s contribs, events, etc.
     // and that contact happens to be deleted, set $onlyDeleted to true
     foreach ($this->_params as $values) {
-      $name = CRM_Utils_Array::value(0, $values);
-      $op = CRM_Utils_Array::value(1, $values);
-      $value = CRM_Utils_Array::value(2, $values);
+      $name = $values[0] ?? NULL;
+      $op = $values[1] ?? NULL;
+      $value = $values[2] ?? NULL;
       if ($name == 'contact_id' and $op == '=') {
         if (CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $value, 'is_deleted')) {
           $onlyDeleted = TRUE;
@@ -6899,8 +6901,8 @@ AND   displayRelType.is_active = 1
       // This seems to be the only anomaly.
       $fieldName = 'id';
     }
-    $pseudoField = isset($this->_pseudoConstantsSelect[$fieldName]) ? $this->_pseudoConstantsSelect[$fieldName] : [];
-    $field = isset($this->_fields[$fieldName]) ? $this->_fields[$fieldName] : $pseudoField;
+    $pseudoField = $this->_pseudoConstantsSelect[$fieldName] ?? [];
+    $field = $this->_fields[$fieldName] ?? $pseudoField;
     $field = array_merge($field, $pseudoField);
     if (!empty($field) && empty($field['name'])) {
       // standardising field formatting here - over time we can phase out variants.
@@ -6952,7 +6954,7 @@ AND   displayRelType.is_active = 1
   protected function addPseudoconstantFieldToSelect($name) {
     $field = $this->getMetadataForRealField($name);
     $realFieldName = $field['name'];
-    $pseudoFieldName = CRM_Utils_Array::value('pseudofield_name', $field);
+    $pseudoFieldName = $field['pseudofield_name'] ?? NULL;
     if ($pseudoFieldName) {
       // @todo - we don't really need to build this array now we have metadata more available with getMetadataForField fn.
       $this->_pseudoConstantsSelect[$pseudoFieldName] = [
@@ -7053,7 +7055,7 @@ AND   displayRelType.is_active = 1
    * @param $values
    */
   protected function buildRelativeDateQuery(&$values) {
-    $value = CRM_Utils_Array::value(2, $values);
+    $value = $values[2] ?? NULL;
     if (empty($value)) {
       return;
     }
@@ -7061,7 +7063,7 @@ AND   displayRelType.is_active = 1
     $fieldSpec = $this->_fields[$fieldName];
     $tableName = $fieldSpec['table_name'];
     $filters = CRM_Core_OptionGroup::values('relative_date_filters');
-    $grouping = CRM_Utils_Array::value(3, $values);
+    $grouping = $values[3] ?? NULL;
     // If the table value is already set for a custom field it will be more nuanced than just '1'.
     $this->_tables[$tableName] = $this->_tables[$tableName] ?? 1;
     $this->_whereTables[$tableName] = $this->_whereTables[$tableName] ?? 1;
diff --git a/civicrm/CRM/Contact/BAO/Relationship.php b/civicrm/CRM/Contact/BAO/Relationship.php
index a88193f071..53a3454fb9 100644
--- a/civicrm/CRM/Contact/BAO/Relationship.php
+++ b/civicrm/CRM/Contact/BAO/Relationship.php
@@ -288,7 +288,7 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
     }
     CRM_Utils_Hook::pre($hook, 'Relationship', $params['id'], $params);
 
-    $relationshipTypes = CRM_Utils_Array::value('relationship_type_id', $params);
+    $relationshipTypes = $params['relationship_type_id'] ?? NULL;
     // explode the string with _ to get the relationship type id
     // and to know which contact has to be inserted in
     // contact_id_a and which one in contact_id_b
@@ -475,14 +475,14 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
       throw new CRM_Core_Exception('Cannot create relationship, insufficient contact IDs provided');
     }
     if (isset($params['relationship_type_id']) && !is_numeric($params['relationship_type_id'])) {
-      $relationshipTypes = CRM_Utils_Array::value('relationship_type_id', $params);
+      $relationshipTypes = $params['relationship_type_id'] ?? NULL;
       list($relationshipTypeID, $first) = explode('_', $relationshipTypes);
       $returnFields['relationship_type_id'] = $relationshipTypeID;
 
       foreach (['a', 'b'] as $contactLetter) {
         if (empty($params['contact_' . $contactLetter])) {
           if ($first == $contactLetter) {
-            $returnFields['contact_id_' . $contactLetter] = CRM_Utils_Array::value('contact', $ids);
+            $returnFields['contact_id_' . $contactLetter] = $ids['contact'] ?? NULL;
           }
           else {
             $returnFields['contact_id_' . $contactLetter] = $contactID;
@@ -516,16 +516,11 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
    * Check if there is data to create the object.
    *
    * @param array $params
-   *   (reference ) an assoc array of name/value pairs.
    *
    * @return bool
    */
-  public static function dataExists(&$params) {
-    // return if no data present
-    if (!is_array(CRM_Utils_Array::value('contact_check', $params))) {
-      return FALSE;
-    }
-    return TRUE;
+  public static function dataExists($params) {
+    return (isset($params['contact_check']) && is_array($params['contact_check']));
   }
 
   /**
@@ -931,7 +926,7 @@ class CRM_Contact_BAO_Relationship extends CRM_Contact_DAO_Relationship {
    *   true if record exists else false
    */
   public static function checkDuplicateRelationship(&$params, $id, $contactId = 0, $relationshipId = 0) {
-    $relationshipTypeId = CRM_Utils_Array::value('relationship_type_id', $params);
+    $relationshipTypeId = $params['relationship_type_id'] ?? NULL;
     list($type) = explode('_', $relationshipTypeId);
 
     $queryString = "
@@ -1728,7 +1723,7 @@ LEFT JOIN  civicrm_country ON (civicrm_address.country_id = civicrm_country.id)
             $relIds = [$params['id']];
           }
           else {
-            $relIds = CRM_Utils_Array::value('relationship_ids', $params);
+            $relIds = $params['relationship_ids'] ?? NULL;
           }
           if (self::isRelatedMembershipExpired($relTypeIds, $contactId, $mainRelatedContactId, $relTypeId,
               $relIds) && !empty($membershipValues['owner_membership_id']
@@ -2009,7 +2004,7 @@ AND cc.sort_name LIKE '%$name%'";
   public static function getContactRelationshipSelector(&$params) {
     // format the params
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
 
     if ($params['context'] == 'past') {
       $relationshipStatus = CRM_Contact_BAO_Relationship::INACTIVE;
@@ -2226,11 +2221,11 @@ AND cc.sort_name LIKE '%$name%'";
    * @return array
    */
   public static function buildRelationshipTypeOptions($params = []) {
-    $contactId = CRM_Utils_Array::value('contact_id', $params);
+    $contactId = $params['contact_id'] ?? NULL;
     $direction = CRM_Utils_Array::value('relationship_direction', $params, 'a_b');
-    $relationshipId = CRM_Utils_Array::value('relationship_id', $params);
-    $contactType = CRM_Utils_Array::value('contact_type', $params);
-    $isForm = CRM_Utils_Array::value('is_form', $params);
+    $relationshipId = $params['relationship_id'] ?? NULL;
+    $contactType = $params['contact_type'] ?? NULL;
+    $isForm = $params['is_form'] ?? NULL;
     $showAll = FALSE;
 
     // getContactRelationshipType will return an empty set if these are not set
diff --git a/civicrm/CRM/Contact/BAO/SavedSearch.php b/civicrm/CRM/Contact/BAO/SavedSearch.php
index f5753039ac..7e1ddd302e 100644
--- a/civicrm/CRM/Contact/BAO/SavedSearch.php
+++ b/civicrm/CRM/Contact/BAO/SavedSearch.php
@@ -94,11 +94,11 @@ class CRM_Contact_BAO_SavedSearch extends CRM_Contact_DAO_SavedSearch {
     $specialFields = ['contact_type', 'group', 'contact_tags', 'member_membership_type_id', 'member_status_id'];
     foreach ($result as $element => $value) {
       if (CRM_Contact_BAO_Query::isAlreadyProcessedForQueryFormat($value)) {
-        $id = CRM_Utils_Array::value(0, $value);
-        $value = CRM_Utils_Array::value(2, $value);
+        $id = $value[0] ?? NULL;
+        $value = $value[2] ?? NULL;
         if (is_array($value) && in_array(key($value), CRM_Core_DAO::acceptedSQLOperators(), TRUE)) {
           $op = key($value);
-          $value = CRM_Utils_Array::value($op, $value);
+          $value = $value[$op] ?? NULL;
           if (in_array($op, ['BETWEEN', '>=', '<='])) {
             self::decodeRelativeFields($result, $id, $op, $value);
             unset($result[$element]);
@@ -150,7 +150,7 @@ class CRM_Contact_BAO_SavedSearch extends CRM_Contact_DAO_SavedSearch {
         // As per the OK (Operator as Key) value format, value array may contain key
         // as an operator so to ensure the default is always set actual value
         elseif (in_array(key($value), CRM_Core_DAO::acceptedSQLOperators(), TRUE)) {
-          $result[$element] = CRM_Utils_Array::value(key($value), $value);
+          $result[$element] = $value[key($value)] ?? NULL;
           if (is_string($result[$element])) {
             $result[$element] = str_replace("%", '', $result[$element]);
           }
diff --git a/civicrm/CRM/Contact/DAO/DashboardContact.php b/civicrm/CRM/Contact/DAO/DashboardContact.php
index 9870459a87..1e890bdd2f 100644
--- a/civicrm/CRM/Contact/DAO/DashboardContact.php
+++ b/civicrm/CRM/Contact/DAO/DashboardContact.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/DashboardContact.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e2e825929c6c5404e7649fdde3162597)
+ * (GenCodeChecksum:65a1fcc31732f320ae7193e2a111f72b)
  */
 
 /**
@@ -50,7 +50,7 @@ class CRM_Contact_DAO_DashboardContact extends CRM_Core_DAO {
   /**
    * column no for this widget
    *
-   * @var bool
+   * @var int
    */
   public $column_no;
 
@@ -139,7 +139,7 @@ class CRM_Contact_DAO_DashboardContact extends CRM_Core_DAO {
         ],
         'column_no' => [
           'name' => 'column_no',
-          'type' => CRM_Utils_Type::T_BOOLEAN,
+          'type' => CRM_Utils_Type::T_INT,
           'title' => ts('Column No'),
           'description' => ts('column no for this widget'),
           'where' => 'civicrm_dashboard_contact.column_no',
diff --git a/civicrm/CRM/Contact/DAO/Factory.php b/civicrm/CRM/Contact/DAO/Factory.php
index 8af2fc1ac4..ef11dad723 100644
--- a/civicrm/CRM/Contact/DAO/Factory.php
+++ b/civicrm/CRM/Contact/DAO/Factory.php
@@ -30,7 +30,7 @@ class CRM_Contact_DAO_Factory {
    * @return mixed
    */
   public static function create($className) {
-    $type = CRM_Utils_Array::value($className, self::$_classes);
+    $type = self::$_classes[$className] ?? NULL;
     if (!$type) {
       return CRM_Core_DAO_Factory::create($className);
     }
diff --git a/civicrm/CRM/Contact/Form/Contact.php b/civicrm/CRM/Contact/Form/Contact.php
index df3a342e4a..3a1d69fc16 100644
--- a/civicrm/CRM/Contact/Form/Contact.php
+++ b/civicrm/CRM/Contact/Form/Contact.php
@@ -200,8 +200,8 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
           CRM_Core_Error::statusBounce(ts('A Contact with that ID does not exist: %1', [1 => $this->_contactId]));
         }
 
-        $this->_contactType = CRM_Utils_Array::value('contact_type', $defaults);
-        $this->_contactSubType = CRM_Utils_Array::value('contact_sub_type', $defaults);
+        $this->_contactType = $defaults['contact_type'] ?? NULL;
+        $this->_contactSubType = $defaults['contact_sub_type'] ?? NULL;
 
         // check for permissions
         $session = CRM_Core_Session::singleton();
@@ -321,7 +321,7 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
 
     // retain the multiple count custom fields value
     if (!empty($_POST['hidden_custom'])) {
-      $customGroupCount = CRM_Utils_Array::value('hidden_custom_group_count', $_POST);
+      $customGroupCount = $_POST['hidden_custom_group_count'] ?? NULL;
 
       if ($contactSubType = CRM_Utils_Array::value('contact_sub_type', $_POST)) {
         $paramSubType = implode(',', $contactSubType);
@@ -501,7 +501,7 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
           $defaults[$name][$instance]['location_type_id'] = $locationType->id;
         }
         else {
-          $locTypeId = isset($locationTypeKeys[$instance - 1]) ? $locationTypeKeys[$instance - 1] : $locationType->id;
+          $locTypeId = $locationTypeKeys[$instance - 1] ?? $locationType->id;
           $defaults[$name][$instance]['location_type_id'] = $locTypeId;
         }
 
@@ -614,7 +614,7 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
           $dataExists = self::blockDataExists($blockValues);
 
           if (!$dataExists && $name == 'address') {
-            $dataExists = CRM_Utils_Array::value('use_shared_address', $fields['address'][$instance]);
+            $dataExists = $fields['address'][$instance]['use_shared_address'] ?? NULL;
           }
 
           if ($dataExists) {
@@ -652,8 +652,8 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
 
           if ($name == 'openid' && !empty($blockValues[$name])) {
             $oid = new CRM_Core_DAO_OpenID();
-            $oid->openid = $openIds[$instance] = CRM_Utils_Array::value($name, $blockValues);
-            $cid = isset($contactId) ? $contactId : 0;
+            $oid->openid = $openIds[$instance] = $blockValues[$name];
+            $cid = $contactId ?? 0;
             if ($oid->find(TRUE) && ($oid->contact_id != $cid)) {
               $errors["{$name}[$instance][openid]"] = ts('%1 already exist.', [1 => $blocks['OpenID']]);
             }
@@ -869,7 +869,7 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
       $params['preferred_communication_method'] = 'null';
     }
 
-    $group = CRM_Utils_Array::value('group', $params);
+    $group = $params['group'] ?? NULL;
     if (!empty($group) && is_array($group)) {
       unset($params['group']);
       foreach ($group as $key => $value) {
@@ -907,16 +907,6 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
       $params['deceased_date'] = NULL;
     }
 
-    if (isset($params['contact_id'])) {
-      // process membership status for deceased contact
-      $deceasedParams = [
-        'contact_id' => CRM_Utils_Array::value('contact_id', $params),
-        'is_deceased' => CRM_Utils_Array::value('is_deceased', $params, FALSE),
-        'deceased_date' => CRM_Utils_Array::value('deceased_date', $params, NULL),
-      ];
-      $updateMembershipMsg = $this->updateMembershipStatus($deceasedParams, $this->_contactType);
-    }
-
     // action is taken depending upon the mode
     if ($this->_action & CRM_Core_Action::UPDATE) {
       CRM_Utils_Hook::pre('edit', $params['contact_type'], $params['contact_id'], $params);
@@ -1015,9 +1005,6 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
     if (!empty($parseStatusMsg)) {
       $message .= "<br />$parseStatusMsg";
     }
-    if (!empty($updateMembershipMsg)) {
-      $message .= "<br />$updateMembershipMsg";
-    }
 
     $session = CRM_Core_Session::singleton();
     $session->setStatus($message, ts('Contact Saved'), 'success');
@@ -1256,7 +1243,7 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
       }
 
       // main parse string.
-      $parseString = CRM_Utils_Array::value($parseFieldName, $address);
+      $parseString = $address[$parseFieldName] ?? NULL;
 
       // parse address field.
       $parsedFields = CRM_Core_BAO_Address::parseStreetAddress($parseString);
@@ -1288,7 +1275,7 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
             $streetAddress .= ' ';
           }
           // CRM-17619 - if the street number suffix begins with a number, add a space
-          $thesuffix = CRM_Utils_Array::value('street_number_suffix', $address);
+          $thesuffix = $address['street_number_suffix'] ?? NULL;
           if ($fld === 'street_number_suffix' && $thesuffix) {
             if (ctype_digit(substr($thesuffix, 0, 1))) {
               $streetAddress .= ' ';
@@ -1394,105 +1381,4 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
     return "$number$str";
   }
 
-  /**
-   * Update membership status to deceased.
-   * function return the status message for updated membership.
-   *
-   * @param array $deceasedParams
-   *  - contact id
-   *  - is_deceased
-   *  - deceased_date
-   *
-   * @param string $contactType
-   *
-   * @return null|string
-   *   $updateMembershipMsg string  status message for updated membership.
-   */
-  public function updateMembershipStatus($deceasedParams, $contactType) {
-    $updateMembershipMsg = NULL;
-    $contactId = CRM_Utils_Array::value('contact_id', $deceasedParams);
-    $deceasedDate = CRM_Utils_Array::value('deceased_date', $deceasedParams);
-
-    // process to set membership status to deceased for both active/inactive membership
-    if ($contactId &&
-      $contactType === 'Individual' && !empty($deceasedParams['is_deceased'])
-    ) {
-
-      $session = CRM_Core_Session::singleton();
-      $userId = $session->get('userID');
-      if (!$userId) {
-        $userId = $contactId;
-      }
-
-      // get deceased status id
-      $allStatus = CRM_Member_PseudoConstant::membershipStatus();
-      $deceasedStatusId = array_search('Deceased', $allStatus);
-      if (!$deceasedStatusId) {
-        return $updateMembershipMsg;
-      }
-
-      $today = time();
-      if ($deceasedDate && strtotime($deceasedDate) > $today) {
-        return $updateMembershipMsg;
-      }
-
-      // get non deceased membership
-      $dao = new CRM_Member_DAO_Membership();
-      $dao->contact_id = $contactId;
-      $dao->whereAdd("status_id != $deceasedStatusId");
-      $dao->find();
-      $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, FALSE, FALSE, 'name');
-      $allStatus = CRM_Member_PseudoConstant::membershipStatus();
-      $memCount = 0;
-      while ($dao->fetch()) {
-        // update status to deceased (for both active/inactive membership )
-        CRM_Core_DAO::setFieldValue('CRM_Member_DAO_Membership', $dao->id,
-          'status_id', $deceasedStatusId
-        );
-
-        // add membership log
-        $membershipLog = [
-          'membership_id' => $dao->id,
-          'status_id' => $deceasedStatusId,
-          'start_date' => CRM_Utils_Date::isoToMysql($dao->start_date),
-          'end_date' => CRM_Utils_Date::isoToMysql($dao->end_date),
-          'modified_id' => $userId,
-          'modified_date' => date('Ymd'),
-          'membership_type_id' => $dao->membership_type_id,
-          'max_related' => $dao->max_related,
-        ];
-
-        CRM_Member_BAO_MembershipLog::add($membershipLog);
-
-        //create activity when membership status is changed
-        $activityParam = [
-          'subject' => "Status changed from {$allStatus[$dao->status_id]} to {$allStatus[$deceasedStatusId]}",
-          'source_contact_id' => $userId,
-          'target_contact_id' => $dao->contact_id,
-          'source_record_id' => $dao->id,
-          'activity_type_id' => array_search('Change Membership Status', $activityTypes),
-          'status_id' => 2,
-          'version' => 3,
-          'priority_id' => 2,
-          'activity_date_time' => date('Y-m-d H:i:s'),
-          'is_auto' => 0,
-          'is_current_revision' => 1,
-          'is_deleted' => 0,
-        ];
-        $activityResult = civicrm_api('activity', 'create', $activityParam);
-
-        $memCount++;
-      }
-
-      // set status msg
-      if ($memCount) {
-        $updateMembershipMsg = ts("%1 Current membership(s) for this contact have been set to 'Deceased' status.",
-          [1 => $memCount]
-        );
-      }
-    }
-
-    return $updateMembershipMsg;
-  }
-
 }
diff --git a/civicrm/CRM/Contact/Form/CustomData.php b/civicrm/CRM/Contact/Form/CustomData.php
index da71a117d1..86dc621b46 100644
--- a/civicrm/CRM/Contact/Form/CustomData.php
+++ b/civicrm/CRM/Contact/Form/CustomData.php
@@ -90,7 +90,7 @@ class CRM_Contact_Form_CustomData extends CRM_Core_Form {
    * Gets session variables for table name, id of entity in table, type of entity and stores them.
    */
   public function preProcess() {
-    $this->_cdType = CRM_Utils_Array::value('type', $_GET);
+    $this->_cdType = $_GET['type'] ?? NULL;
     $this->assign('cdType', FALSE);
     $this->_multiRecordDisplay = CRM_Utils_Request::retrieve('multiRecordDisplay', 'String', $this);
     if ($this->_cdType || $this->_multiRecordDisplay == 'single') {
diff --git a/civicrm/CRM/Contact/Form/DedupeRules.php b/civicrm/CRM/Contact/Form/DedupeRules.php
index a2d36401ed..7e4a850c97 100644
--- a/civicrm/CRM/Contact/Form/DedupeRules.php
+++ b/civicrm/CRM/Contact/Form/DedupeRules.php
@@ -215,7 +215,7 @@ UPDATE civicrm_dedupe_rule_group
     }
 
     // lets skip updating of fields for reserved dedupe group
-    if (CRM_Utils_Array::value('is_reserved', $this->_defaults)) {
+    if (!empty($this->_defaults['is_reserved'])) {
       CRM_Core_Session::setStatus(ts("The rule '%1' has been saved.", [1 => $rgDao->title]), ts('Saved'), 'success');
       return;
     }
diff --git a/civicrm/CRM/Contact/Form/Edit/Address.php b/civicrm/CRM/Contact/Form/Edit/Address.php
index 9ea5b2af70..7c46252f4a 100644
--- a/civicrm/CRM/Contact/Form/Edit/Address.php
+++ b/civicrm/CRM/Contact/Form/Edit/Address.php
@@ -287,7 +287,7 @@ class CRM_Contact_Form_Edit_Address {
               $streetAddress .= ' ';
             }
             // CRM-17619 - if the street number suffix begins with a number, add a space
-            $numsuffix = CRM_Utils_Array::value($fld, $address);
+            $numsuffix = $address[$fld] ?? NULL;
             if ($fld === 'street_number_suffix' && !empty($numsuffix)) {
               if (ctype_digit(substr($numsuffix, 0, 1))) {
                 $streetAddress .= ' ';
@@ -301,7 +301,7 @@ class CRM_Contact_Form_Edit_Address {
           }
           if (isset($address['street_number'])) {
             // CRM-17619 - if the street number suffix begins with a number, add a space
-            $thesuffix = CRM_Utils_Array::value('street_number_suffix', $address);
+            $thesuffix = $address['street_number_suffix'] ?? NULL;
             if ($thesuffix) {
               if (ctype_digit(substr($thesuffix, 0, 1))) {
                 $address['street_number'] .= " ";
@@ -311,7 +311,7 @@ class CRM_Contact_Form_Edit_Address {
           }
           // build array for set default.
           foreach ($parseFields as $field) {
-            $addressValues["{$field}_{$cnt}"] = CRM_Utils_Array::value($field, $address);
+            $addressValues["{$field}_{$cnt}"] = $address[$field] ?? NULL;
           }
           // don't load fields, use js to populate.
           foreach (['street_number', 'street_name', 'street_unit'] as $f) {
@@ -338,7 +338,7 @@ class CRM_Contact_Form_Edit_Address {
           }
         }
         $form->assign('showHideAddressFields', $parsedAddress);
-        $form->assign('loadShowHideAddressFields', empty($parsedAddress) ? FALSE : TRUE);
+        $form->assign('loadShowHideAddressFields', !empty($parsedAddress));
       }
       // end of parse address functionality
     }
diff --git a/civicrm/CRM/Contact/Form/Edit/CustomData.php b/civicrm/CRM/Contact/Form/Edit/CustomData.php
index 7260b70412..0d65448ca2 100644
--- a/civicrm/CRM/Contact/Form/Edit/CustomData.php
+++ b/civicrm/CRM/Contact/Form/Edit/CustomData.php
@@ -71,7 +71,7 @@ class CRM_Contact_Form_Edit_CustomData {
       $contactSubType = $_POST['contact_sub_type'];
     }
     else {
-      $contactSubType = CRM_Utils_Array::value('contact_sub_type', $form->_values);
+      $contactSubType = $form->_values['contact_sub_type'] ?? NULL;
     }
     $form->assign('contactType', $form->_contactType);
     $form->assign('contactSubType', $contactSubType);
diff --git a/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php b/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php
index 7096501843..c7d2692715 100644
--- a/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php
+++ b/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php
@@ -73,7 +73,7 @@ class CRM_Contact_Form_Edit_TagsAndGroups {
         $fName = $fieldName;
       }
 
-      $groupID = isset($form->_grid) ? $form->_grid : NULL;
+      $groupID = $form->_grid ?? NULL;
       if ($groupID && $visibility) {
         $ids = [$groupID => $groupID];
       }
diff --git a/civicrm/CRM/Contact/Form/Merge.php b/civicrm/CRM/Contact/Form/Merge.php
index 2c3d2cb35c..ddea89ac89 100644
--- a/civicrm/CRM/Contact/Form/Merge.php
+++ b/civicrm/CRM/Contact/Form/Merge.php
@@ -161,7 +161,7 @@ class CRM_Contact_Form_Merge extends CRM_Core_Form {
         $this->assign('otherUfName', $otherUser ? $otherUser['name'] : NULL);
       }
 
-      $cmsUser = ($mainUfId && $otherUfId) ? TRUE : FALSE;
+      $cmsUser = $mainUfId && $otherUfId;
       $this->assign('user', $cmsUser);
 
       $rowsElementsAndInfo = CRM_Dedupe_Merger::getRowsElementsAndInfo($this->_cid, $this->_oid);
diff --git a/civicrm/CRM/Contact/Form/Relationship.php b/civicrm/CRM/Contact/Form/Relationship.php
index 50c8c7c3ce..2be985d27a 100644
--- a/civicrm/CRM/Contact/Form/Relationship.php
+++ b/civicrm/CRM/Contact/Form/Relationship.php
@@ -207,14 +207,14 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
     if ($this->_action & CRM_Core_Action::UPDATE) {
       if (!empty($this->_values)) {
         $defaults['relationship_type_id'] = $this->_rtypeId;
-        $defaults['start_date'] = CRM_Utils_Array::value('start_date', $this->_values);
-        $defaults['end_date'] = CRM_Utils_Array::value('end_date', $this->_values);
-        $defaults['description'] = CRM_Utils_Array::value('description', $this->_values);
-        $defaults['is_active'] = CRM_Utils_Array::value('is_active', $this->_values);
+        $defaults['start_date'] = $this->_values['start_date'] ?? NULL;
+        $defaults['end_date'] = $this->_values['end_date'] ?? NULL;
+        $defaults['description'] = $this->_values['description'] ?? NULL;
+        $defaults['is_active'] = $this->_values['is_active'] ?? NULL;
 
         // The postprocess function will swap these fields if it is a b_a relationship, so we compensate here
-        $defaults['is_permission_a_b'] = CRM_Utils_Array::value('is_permission_' . $this->_rtype, $this->_values);
-        $defaults['is_permission_b_a'] = CRM_Utils_Array::value('is_permission_' . strrev($this->_rtype), $this->_values);
+        $defaults['is_permission_a_b'] = $this->_values['is_permission_' . $this->_rtype] ?? NULL;
+        $defaults['is_permission_b_a'] = $this->_values['is_permission_' . strrev($this->_rtype)] ?? NULL;
 
         $defaults['is_current_employer'] = $this->_isCurrentEmployer;
 
@@ -239,7 +239,7 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
           'version' => 3,
         ];
         $note = civicrm_api('Note', 'getsingle', $noteParams);
-        $defaults['note'] = CRM_Utils_Array::value('note', $note);
+        $defaults['note'] = $note['note'] ?? NULL;
       }
     }
     else {
diff --git a/civicrm/CRM/Contact/Form/Search.php b/civicrm/CRM/Contact/Form/Search.php
index 1e64b00371..322dc47e31 100644
--- a/civicrm/CRM/Contact/Form/Search.php
+++ b/civicrm/CRM/Contact/Form/Search.php
@@ -183,7 +183,7 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
    */
   public static function isSearchContext($context) {
     $searchContext = CRM_Utils_Array::value($context, self::validContext());
-    return $searchContext ? TRUE : FALSE;
+    return (bool) $searchContext;
   }
 
   public static function setModeValues() {
@@ -364,10 +364,10 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
     if ($this->_context !== 'amtg') {
       $taskParams['deletedContacts'] = FALSE;
       if ($this->_componentMode == CRM_Contact_BAO_Query::MODE_CONTACTS || $this->_componentMode == CRM_Contact_BAO_Query::MODE_CONTACTSRELATED) {
-        $taskParams['deletedContacts'] = CRM_Utils_Array::value('deleted_contacts', $this->_formValues);
+        $taskParams['deletedContacts'] = $this->_formValues['deleted_contacts'] ?? NULL;
       }
       $className = $this->_modeValue['taskClassName'];
-      $taskParams['ssID'] = isset($this->_ssID) ? $this->_ssID : NULL;
+      $taskParams['ssID'] = $this->_ssID ?? NULL;
       $this->_taskList += $className::permissionedTaskTitles(CRM_Core_Permission::getPermission(), $taskParams);
     }
 
@@ -398,9 +398,9 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
 
     if ($this->_context === 'smog') {
       // CRM-11788, we might want to do this for all of search where force=1
-      $formQFKey = CRM_Utils_Array::value('qfKey', $this->_formValues);
-      $getQFKey = CRM_Utils_Array::value('qfKey', $_GET);
-      $postQFKey = CRM_Utils_Array::value('qfKey', $_POST);
+      $formQFKey = $this->_formValues['qfKey'] ?? NULL;
+      $getQFKey = $_GET['qfKey'] ?? NULL;
+      $postQFKey = $_POST['qfKey'] ?? NULL;
       if ($formQFKey && empty($getQFKey) && empty($postQFKey)) {
         $url = CRM_Utils_System::makeURL('qfKey') . $formQFKey;
         CRM_Utils_System::redirect($url);
@@ -481,7 +481,7 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
     }
 
     $selectedContactIds = [];
-    $qfKeyParam = CRM_Utils_Array::value('qfKey', $this->_formValues);
+    $qfKeyParam = $this->_formValues['qfKey'] ?? NULL;
     // We use ajax to handle selections only if the search results component_mode is set to "contacts"
     if ($qfKeyParam && ($this->get('component_mode') <= CRM_Contact_BAO_Query::MODE_CONTACTS || $this->get('component_mode') == CRM_Contact_BAO_Query::MODE_CONTACTSRELATED)) {
       $this->addClass('crm-ajax-selection-form');
@@ -546,7 +546,7 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
 
     // assign context to drive the template display, make sure context is valid
     $this->_context = CRM_Utils_Request::retrieve('context', 'Alphanumeric', $this, FALSE, 'search');
-    if (!CRM_Utils_Array::value($this->_context, self::validContext())) {
+    if (!array_key_exists($this->_context, self::validContext())) {
       $this->_context = 'search';
     }
     $this->set('context', $this->_context);
diff --git a/civicrm/CRM/Contact/Form/Search/Advanced.php b/civicrm/CRM/Contact/Form/Search/Advanced.php
index 6a4127b25a..4bc5d28dbf 100644
--- a/civicrm/CRM/Contact/Form/Search/Advanced.php
+++ b/civicrm/CRM/Contact/Form/Search/Advanced.php
@@ -38,7 +38,7 @@ class CRM_Contact_Form_Search_Advanced extends CRM_Contact_Form_Search {
   public function buildQuickForm() {
     $this->set('context', 'advanced');
 
-    $this->_searchPane = CRM_Utils_Array::value('searchPane', $_GET);
+    $this->_searchPane = $_GET['searchPane'] ?? NULL;
 
     $this->_searchOptions = CRM_Core_BAO_Setting::valueOptions(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
       'advanced_search_options'
@@ -303,7 +303,7 @@ class CRM_Contact_Form_Search_Advanced extends CRM_Contact_Form_Search {
    * multiple purposes (queries, save/edit etc)
    */
   public function normalizeFormValues() {
-    $contactType = CRM_Utils_Array::value('contact_type', $this->_formValues);
+    $contactType = $this->_formValues['contact_type'] ?? NULL;
 
     if ($contactType && is_array($contactType)) {
       unset($this->_formValues['contact_type']);
@@ -334,7 +334,7 @@ class CRM_Contact_Form_Search_Advanced extends CRM_Contact_Form_Search {
     ];
     CRM_Contact_BAO_Query::processSpecialFormValue($this->_formValues, $specialParams, $changeNames);
 
-    $taglist = CRM_Utils_Array::value('contact_taglist', $this->_formValues);
+    $taglist = $this->_formValues['contact_taglist'] ?? NULL;
 
     if ($taglist && is_array($taglist)) {
       unset($this->_formValues['contact_taglist']);
diff --git a/civicrm/CRM/Contact/Form/Search/Basic.php b/civicrm/CRM/Contact/Form/Search/Basic.php
index 9d236d5014..1b6ae423fa 100644
--- a/civicrm/CRM/Contact/Form/Search/Basic.php
+++ b/civicrm/CRM/Contact/Form/Search/Basic.php
@@ -83,7 +83,7 @@ class CRM_Contact_Form_Search_Basic extends CRM_Contact_Form_Search {
   public function setDefaultValues() {
     $defaults = [];
 
-    $defaults['sort_name'] = CRM_Utils_Array::value('sort_name', $this->_formValues);
+    $defaults['sort_name'] = $this->_formValues['sort_name'] ?? NULL;
     foreach (self::$csv as $v) {
       if (!empty($this->_formValues[$v]) && is_array($this->_formValues[$v])) {
         $tmpArray = array_keys($this->_formValues[$v]);
diff --git a/civicrm/CRM/Contact/Form/Search/Builder.php b/civicrm/CRM/Contact/Form/Search/Builder.php
index 6f3bc7cac2..fc51f6580d 100644
--- a/civicrm/CRM/Contact/Form/Search/Builder.php
+++ b/civicrm/CRM/Contact/Form/Search/Builder.php
@@ -190,8 +190,8 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
               $fldName = substr($v[0], 13);
             }
 
-            $fldValue = CRM_Utils_Array::value($fldName, $fields);
-            $fldType = CRM_Utils_Array::value('type', $fldValue);
+            $fldValue = $fields[$fldName] ?? NULL;
+            $fldType = $fldValue['type'] ?? NULL;
             $type = CRM_Utils_Type::typeToString($fldType);
 
             if (strstr($v[1], 'IN')) {
@@ -328,7 +328,7 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
         return;
       }
       // Add another field
-      $addMore = CRM_Utils_Array::value('addMore', $params);
+      $addMore = $params['addMore'] ?? NULL;
       for ($x = 1; $x <= $this->_blockCount; $x++) {
         if (!empty($addMore[$x])) {
           $this->set('newBlock', $x);
diff --git a/civicrm/CRM/Contact/Form/Search/Criteria.php b/civicrm/CRM/Contact/Form/Search/Criteria.php
index 89010bee15..d4d711296c 100644
--- a/civicrm/CRM/Contact/Form/Search/Criteria.php
+++ b/civicrm/CRM/Contact/Form/Search/Criteria.php
@@ -412,7 +412,7 @@ class CRM_Contact_Form_Search_Criteria {
       'street_unit' => [ts('Apt/Unit/Suite'), $attributes['street_unit'], NULL, NULL],
     ];
 
-    $parseStreetAddress = CRM_Utils_Array::value('street_address_parsing', $addressOptions, 0);
+    $parseStreetAddress = $addressOptions['street_address_parsing'] ?? 0;
     $form->assign('parseStreetAddress', $parseStreetAddress);
     foreach ($elements as $name => $v) {
       list($title, $attributes, $select, $multiSelect) = $v;
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/ContribSYBNT.php b/civicrm/CRM/Contact/Form/Search/Custom/ContribSYBNT.php
index f811a9222c..00a471369d 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/ContribSYBNT.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/ContribSYBNT.php
@@ -58,7 +58,7 @@ class CRM_Contact_Form_Search_Custom_ContribSYBNT extends CRM_Contact_Form_Searc
     $this->_checkboxes = ['is_first_amount' => ts('First Donation?')];
 
     foreach ($this->_amounts as $name => $title) {
-      $this->{$name} = CRM_Utils_Array::value($name, $this->_formValues);
+      $this->{$name} = $this->_formValues[$name] ?? NULL;
     }
 
     foreach ($this->_checkboxes as $name => $title) {
@@ -329,12 +329,12 @@ AND      c.receive_date < {$this->start_date_1}
    */
   public function having($includeContactIDs = FALSE) {
     $clauses = [];
-    $min = CRM_Utils_Array::value('min_amount', $this->_formValues);
+    $min = $this->_formValues['min_amount'] ?? NULL;
     if ($min) {
       $clauses[] = "sum(contrib_1.total_amount) >= $min";
     }
 
-    $max = CRM_Utils_Array::value('max_amount', $this->_formValues);
+    $max = $this->_formValues['max_amount'] ?? NULL;
     if ($max) {
       $clauses[] = "sum(contrib_1.total_amount) <= $max";
     }
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/ContributionAggregate.php b/civicrm/CRM/Contact/Form/Search/Custom/ContributionAggregate.php
index 88ee107239..89f0be3feb 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/ContributionAggregate.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/ContributionAggregate.php
@@ -269,13 +269,13 @@ civicrm_contact AS contact_a {$this->_aclFrom}
    */
   public function having($includeContactIDs = FALSE) {
     $clauses = [];
-    $min = CRM_Utils_Array::value('min_amount', $this->_formValues);
+    $min = $this->_formValues['min_amount'] ?? NULL;
     if ($min) {
       $min = CRM_Utils_Rule::cleanMoney($min);
       $clauses[] = "sum(contrib.total_amount) >= $min";
     }
 
-    $max = CRM_Utils_Array::value('max_amount', $this->_formValues);
+    $max = $this->_formValues['max_amount'] ?? NULL;
     if ($max) {
       $max = CRM_Utils_Rule::cleanMoney($max);
       $clauses[] = "sum(contrib.total_amount) <= $max";
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/FullText.php b/civicrm/CRM/Contact/Form/Search/Custom/FullText.php
index 091e5a1df0..c8ea5961aa 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/FullText.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/FullText.php
@@ -126,7 +126,7 @@ class CRM_Contact_Form_Search_Custom_FullText extends CRM_Contact_Form_Search_Cu
    * @return mixed|null
    */
   public function getFieldValue($formValues, $field, $type, $default = NULL) {
-    $value = CRM_Utils_Array::value($field, $formValues);
+    $value = $formValues[$field] ?? NULL;
     if (!$value) {
       return CRM_Utils_Request::retrieve($field, $type, CRM_Core_DAO::$_nullObject, FALSE, $default);
     }
@@ -384,7 +384,7 @@ WHERE      t.table_name = 'Activity' AND
           $row[$name] = $dao->$name;
         }
         else {
-          $row['activity_type'] = CRM_Utils_Array::value($dao->$name, $activityTypes);
+          $row['activity_type'] = $activityTypes[$dao->$name] ?? NULL;
         }
       }
       if (isset($row['participant_role'])) {
@@ -411,7 +411,7 @@ WHERE      t.table_name = 'Activity' AND
 
     $summary['Count'] = [];
     foreach (array_keys($summary) as $table) {
-      $summary['Count'][$table] = CRM_Utils_Array::value($table, $this->_foundRows);
+      $summary['Count'][$table] = $this->_foundRows[$table] ?? NULL;
       if ($summary['Count'][$table] >= self::LIMIT) {
         $summary['addShowAllLink'][$table] = TRUE;
       }
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/Group.php b/civicrm/CRM/Contact/Form/Search/Custom/Group.php
index 4dcb40dceb..b6e4d59d64 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/Group.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/Group.php
@@ -91,7 +91,7 @@ class CRM_Contact_Form_Search_Custom_Group extends CRM_Contact_Form_Search_Custo
     $this->_allSearch = FALSE;
     $this->_groups = FALSE;
     $this->_tags = FALSE;
-    $this->_andOr = CRM_Utils_Array::value('andOr', $this->_formValues);
+    $this->_andOr = $this->_formValues['andOr'] ?? NULL;
     //make easy to check conditions for groups and tags are
     //selected or it is empty search
     if (empty($this->_includeGroups) && empty($this->_excludeGroups) &&
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/MultipleValues.php b/civicrm/CRM/Contact/Form/Search/Custom/MultipleValues.php
index 9e1ccb6952..bd000d85e7 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/MultipleValues.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/MultipleValues.php
@@ -33,9 +33,9 @@ class CRM_Contact_Form_Search_Custom_MultipleValues extends CRM_Contact_Form_Sea
 
     $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree("'Contact', 'Individual', 'Organization', 'Household'", NULL, NULL, -1);
 
-    $this->_group = CRM_Utils_Array::value('group', $this->_formValues);
+    $this->_group = $this->_formValues['group'] ?? NULL;
 
-    $this->_tag = CRM_Utils_Array::value('tag', $this->_formValues);
+    $this->_tag = $this->_formValues['tag'] ?? NULL;
 
     $this->_columns = [
       ts('Contact ID') => 'contact_id',
@@ -43,7 +43,7 @@ class CRM_Contact_Form_Search_Custom_MultipleValues extends CRM_Contact_Form_Sea
       ts('Name') => 'sort_name',
     ];
 
-    $this->_customGroupIDs = CRM_Utils_Array::value('custom_group', $formValues);
+    $this->_customGroupIDs = $formValues['custom_group'] ?? NULL;
 
     if (!empty($this->_customGroupIDs)) {
       $this->addColumns();
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/PriceSet.php b/civicrm/CRM/Contact/Form/Search/Custom/PriceSet.php
index a927dc5b0b..56f5c5e53c 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/PriceSet.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/PriceSet.php
@@ -87,28 +87,33 @@ FROM   civicrm_contact c,
        civicrm_participant p
 WHERE  p.contact_id = c.id
   AND  p.is_test    = 0
-  AND  p.event_id = {$this->_eventID}
+  AND  p.event_id = %1
   AND  p.status_id NOT IN (4,11,12)
   AND  ( c.is_deleted = 0 OR c.is_deleted IS NULL )
 ";
-    CRM_Core_DAO::executeQuery($sql);
+    CRM_Core_DAO::executeQuery($sql, [1 => [$this->_eventID, 'Positive']]);
 
     $sql = "
-SELECT c.id as contact_id,
-       p.id as participant_id,
-       l.price_field_value_id as price_field_value_id,
-       l.qty
-FROM   civicrm_contact c,
-       civicrm_participant  p,
-       civicrm_line_item    l
-WHERE  c.id = p.contact_id
-AND    p.event_id = {$this->_eventID}
-AND    p.id = l.entity_id
-AND    l.entity_table ='civicrm_participant'
-ORDER BY c.id, l.price_field_value_id;
-";
-
-    $dao = CRM_Core_DAO::executeQuery($sql);
+      SELECT c.id as contact_id,
+        p.id as participant_id,
+        l.price_field_value_id AS price_field_value_id,
+        l.qty
+      FROM civicrm_contact c
+        INNER JOIN civicrm_participant p
+          ON p.contact_id = c.id AND c.is_deleted = 0
+        INNER JOIN civicrm_line_item l
+          ON p.id = l.entity_id AND l.entity_table ='civicrm_participant'
+        INNER JOIN civicrm_price_field_value cpfv
+          ON cpfv.id = l.price_field_value_id AND cpfv.is_active = 1
+        INNER JOIN civicrm_price_field cpf
+          ON cpf.id = l.price_field_id AND cpf.is_active = 1
+        INNER JOIN civicrm_price_set cps
+          ON cps.id = cpf.price_set_id AND cps.is_active = 1
+      WHERE  p.event_id = %1
+      ORDER BY c.id, l.price_field_value_id;
+    ";
+
+    $dao = CRM_Core_DAO::executeQuery($sql, [1 => [$this->_eventID, 'Positive']]);
 
     // first store all the information by option value id
     $rows = [];
@@ -229,7 +234,7 @@ AND    p.entity_id    = e.id
       foreach ($priceSet[$dao->price_set_id]['fields'] as $key => $value) {
         if (is_array($value['options'])) {
           foreach ($value['options'] as $oKey => $oValue) {
-            $columnHeader = CRM_Utils_Array::value('label', $value);
+            $columnHeader = $value['label'] ?? NULL;
             if (CRM_Utils_Array::value('html_type', $value) != 'Text') {
               $columnHeader .= ' - ' . $oValue['label'];
             }
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/Proximity.php b/civicrm/CRM/Contact/Form/Search/Custom/Proximity.php
index 6a9b4e4ac6..34026c06de 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/Proximity.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/Proximity.php
@@ -54,9 +54,9 @@ class CRM_Contact_Form_Search_Custom_Proximity extends CRM_Contact_Form_Search_C
       }
       $this->_distance = $this->_formValues['distance'] * $conversionFactor;
     }
-    $this->_group = CRM_Utils_Array::value('group', $this->_formValues);
+    $this->_group = $this->_formValues['group'] ?? NULL;
 
-    $this->_tag = CRM_Utils_Array::value('tag', $this->_formValues);
+    $this->_tag = $this->_formValues['tag'] ?? NULL;
 
     $this->_columns = [
       ts('Name') => 'sort_name',
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/RandomSegment.php b/civicrm/CRM/Contact/Form/Search/Custom/RandomSegment.php
index 127d0c3eb5..b09d151fce 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/RandomSegment.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/RandomSegment.php
@@ -39,11 +39,11 @@ class CRM_Contact_Form_Search_Custom_RandomSegment extends CRM_Contact_Form_Sear
   }
 
   public function initialize() {
-    $this->_segmentSize = CRM_Utils_Array::value('segmentSize', $this->_formValues);
+    $this->_segmentSize = $this->_formValues['segmentSize'] ?? NULL;
 
-    $this->_includeGroups = CRM_Utils_Array::value('includeGroups', $this->_formValues);
+    $this->_includeGroups = $this->_formValues['includeGroups'] ?? NULL;
 
-    $this->_excludeGroups = CRM_Utils_Array::value('excludeGroups', $this->_formValues);
+    $this->_excludeGroups = $this->_formValues['excludeGroups'] ?? NULL;
 
     $this->_allSearch = FALSE;
     $this->_groups = FALSE;
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/TagContributions.php b/civicrm/CRM/Contact/Form/Search/Custom/TagContributions.php
index cdee4a9d89..7b1cd6a65d 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/TagContributions.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/TagContributions.php
@@ -173,7 +173,7 @@ WHERE  $where
       $clauses[] = "civicrm_contribution.receive_date <= '{$this->_formValues['end_date']} 23:59:59'";
     }
 
-    $tag = CRM_Utils_Array::value('tag', $this->_formValues);
+    $tag = $this->_formValues['tag'] ?? NULL;
     if ($tag) {
       $clauses[] = "civicrm_entity_tag.tag_id = $tag";
       $clauses[] = "civicrm_tag.id = civicrm_entity_tag.tag_id";
diff --git a/civicrm/CRM/Contact/Form/Task.php b/civicrm/CRM/Contact/Form/Task.php
index 718d5c4bbc..b478fb4867 100644
--- a/civicrm/CRM/Contact/Form/Task.php
+++ b/civicrm/CRM/Contact/Form/Task.php
@@ -133,7 +133,7 @@ class CRM_Contact_Form_Task extends CRM_Core_Form_Task {
     $session = CRM_Core_Session::singleton();
     $session->replaceUserContext($url);
 
-    $form->_task = CRM_Utils_Array::value('task', self::$_searchFormValues);
+    $form->_task = self::$_searchFormValues['task'] ?? NULL;
     $crmContactTaskTasks = CRM_Contact_Task::taskTitles();
     $form->assign('taskName', CRM_Utils_Array::value($form->_task, $crmContactTaskTasks));
 
@@ -251,7 +251,7 @@ class CRM_Contact_Form_Task extends CRM_Core_Form_Task {
     if (CRM_Utils_Array::value('radio_ts', self::$_searchFormValues) == 'ts_sel'
       && ($form->_action != CRM_Core_Action::COPY)
     ) {
-      $sel = CRM_Utils_Array::value('radio_ts', self::$_searchFormValues);
+      $sel = self::$_searchFormValues['radio_ts'] ?? NULL;
       $form->assign('searchtype', $sel);
       $result = self::getSelectedContactNames();
       $form->assign("value", $result);
diff --git a/civicrm/CRM/Contact/Form/Task/AddToGroup.php b/civicrm/CRM/Contact/Form/Task/AddToGroup.php
index 091010ca3b..5385ed1fc7 100644
--- a/civicrm/CRM/Contact/Form/Task/AddToGroup.php
+++ b/civicrm/CRM/Contact/Form/Task/AddToGroup.php
@@ -175,7 +175,7 @@ class CRM_Contact_Form_Task_AddToGroup extends CRM_Contact_Form_Task {
    */
   public function postProcess() {
     $params = $this->controller->exportValues();
-    $groupOption = CRM_Utils_Array::value('group_option', $params, NULL);
+    $groupOption = $params['group_option'] ?? NULL;
     if ($groupOption) {
       $groupParams = [];
       $groupParams['title'] = $params['title'];
diff --git a/civicrm/CRM/Contact/Form/Task/AlterPreferences.php b/civicrm/CRM/Contact/Form/Task/AlterPreferences.php
index d0be40d343..fd3a239dd0 100644
--- a/civicrm/CRM/Contact/Form/Task/AlterPreferences.php
+++ b/civicrm/CRM/Contact/Form/Task/AlterPreferences.php
@@ -79,7 +79,7 @@ class CRM_Contact_Form_Task_AlterPreferences extends CRM_Contact_Form_Task {
     //get the submitted values in an array
     $params = $this->controller->exportValues($this->_name);
 
-    $actionTypeOption = CRM_Utils_Array::value('actionTypeOption', $params, NULL);
+    $actionTypeOption = $params['actionTypeOption'] ?? NULL;
     // If remove option has been selected set new privacy value to "false"
     $privacyValueNew = empty($actionTypeOption);
 
diff --git a/civicrm/CRM/Contact/Form/Task/Email.php b/civicrm/CRM/Contact/Form/Task/Email.php
index 1b702c3e5f..afd39cd3a3 100644
--- a/civicrm/CRM/Contact/Form/Task/Email.php
+++ b/civicrm/CRM/Contact/Form/Task/Email.php
@@ -20,62 +20,13 @@
  */
 class CRM_Contact_Form_Task_Email extends CRM_Contact_Form_Task {
 
-  /**
-   * Are we operating in "single mode".
-   *
-   * Single mode means sending email to one specific contact.
-   *
-   * @var bool
-   */
-  public $_single = FALSE;
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_noEmails = FALSE;
-
-  /**
-   * All the existing templates in the system.
-   *
-   * @var array
-   */
-  public $_templates = NULL;
-
-  /**
-   * Store "to" contact details.
-   * @var array
-   */
-  public $_toContactDetails = [];
-
-  /**
-   * Store all selected contact id's, that includes to, cc and bcc contacts
-   * @var array
-   */
-  public $_allContactIds = [];
-
-  /**
-   * Store only "to" contact ids.
-   * @var array
-   */
-  public $_toContactIds = [];
-
-  /**
-   * Store only "cc" contact ids.
-   * @var array
-   */
-  public $_ccContactIds = [];
-
-  /**
-   * Store only "bcc" contact ids.
-   * @var array
-   */
-  public $_bccContactIds = [];
+  use CRM_Contact_Form_Task_EmailTrait;
 
   /**
    * Build all the data structures needed to build the form.
+   *
+   * @throws \CiviCRM_API3_Exception
+   * @throws \CRM_Core_Exception
    */
   public function preProcess() {
     // store case id if present
@@ -110,9 +61,12 @@ class CRM_Contact_Form_Task_Email extends CRM_Contact_Form_Task {
     else {
       CRM_Utils_System::setTitle(ts('New Email'));
     }
+    if ($this->_context === 'search') {
+      $this->_single = TRUE;
+    }
     CRM_Contact_Form_Task_EmailCommon::preProcessFromAddress($this);
 
-    if (!$cid && $this->_context != 'standalone') {
+    if (!$cid && $this->_context !== 'standalone') {
       parent::preProcess();
     }
 
@@ -122,24 +76,6 @@ class CRM_Contact_Form_Task_Email extends CRM_Contact_Form_Task {
     }
   }
 
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    //enable form element
-    $this->assign('suppressForm', FALSE);
-    $this->assign('emailTask', TRUE);
-
-    CRM_Contact_Form_Task_EmailCommon::buildQuickForm($this);
-  }
-
-  /**
-   * Process the form after the input has been submitted and validated.
-   */
-  public function postProcess() {
-    CRM_Contact_Form_Task_EmailCommon::postProcess($this);
-  }
-
   /**
    * List available tokens for this form.
    *
diff --git a/civicrm/CRM/Contact/Form/Task/EmailCommon.php b/civicrm/CRM/Contact/Form/Task/EmailCommon.php
index d8e7af4c33..e0334ead75 100644
--- a/civicrm/CRM/Contact/Form/Task/EmailCommon.php
+++ b/civicrm/CRM/Contact/Form/Task/EmailCommon.php
@@ -21,37 +21,30 @@
  * components in CiviCRM (since they all have send email as a task)
  */
 class CRM_Contact_Form_Task_EmailCommon {
+
   const MAX_EMAILS_KILL_SWITCH = 50;
 
-  public $_contactDetails = array();
-  public $_allContactDetails = array();
-  public $_toContactEmails = array();
+  public $_contactDetails = [];
 
-  /**
-   * @deprecated Generate an array of Domain email addresses.
-   * @return array $domainEmails;
-   */
-  public static function domainEmails() {
-    CRM_Core_Error::deprecatedFunctionWarning('CRM_Core_BAO_Email::domainEmails()');
-    return CRM_Core_BAO_Email::domainEmails();
-  }
+  public $_allContactDetails = [];
+
+  public $_toContactEmails = [];
 
   /**
    * Pre Process Form Addresses to be used in Quickform
+   *
    * @param CRM_Core_Form $form
    * @param bool $bounce determine if we want to throw a status bounce.
+   *
+   * @throws \CiviCRM_API3_Exception
    */
   public static function preProcessFromAddress(&$form, $bounce = TRUE) {
-    $form->_single = FALSE;
-    $className = CRM_Utils_System::getClassName($form);
-    if (property_exists($form, '_context') &&
-      $form->_context != 'search' &&
-      $className == 'CRM_Contact_Form_Task_Email'
-    ) {
-      $form->_single = TRUE;
+    if (!isset($form->_single)) {
+      // @todo ensure this is already set.
+      $form->_single = FALSE;
     }
 
-    $form->_emails = array();
+    $form->_emails = [];
 
     // @TODO remove these line and to it somewhere more appropriate. Currently some classes (e.g Case
     // are having to re-write contactIds afterwards due to this inappropriate variable setting
@@ -60,28 +53,22 @@ class CRM_Contact_Form_Task_EmailCommon {
 
     $fromEmailValues = CRM_Core_BAO_Email::getFromEmail();
 
-    $form->_noEmails = FALSE;
-    if (empty($fromEmailValues)) {
-      $form->_noEmails = TRUE;
-    }
-    $form->assign('noEmails', $form->_noEmails);
-
     if ($bounce) {
-      if ($form->_noEmails) {
+      if (empty($fromEmailValues)) {
         CRM_Core_Error::statusBounce(ts('Your user record does not have a valid email address and no from addresses have been configured.'));
       }
     }
 
     $form->_emails = $fromEmailValues;
-    $defaults = array();
+    $defaults = [];
     $form->_fromEmails = $fromEmailValues;
     if (!Civi::settings()->get('allow_mail_from_logged_in_contact')) {
       $defaults['from_email_address'] = current(CRM_Core_BAO_Domain::getNameAndEmail(FALSE, TRUE));
     }
     if (is_numeric(key($form->_fromEmails))) {
       // Add signature
-      $defaultEmail = civicrm_api3('email', 'getsingle', array('id' => key($form->_fromEmails)));
-      $defaults = array();
+      $defaultEmail = civicrm_api3('email', 'getsingle', ['id' => key($form->_fromEmails)]);
+      $defaults = [];
       if (!empty($defaultEmail['signature_html'])) {
         $defaults['html_message'] = '<br/><br/>--' . $defaultEmail['signature_html'];
       }
@@ -96,9 +83,11 @@ class CRM_Contact_Form_Task_EmailCommon {
    * Build the form object.
    *
    * @param CRM_Core_Form $form
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function buildQuickForm(&$form) {
-    $toArray = $ccArray = $bccArray = array();
+    $toArray = $ccArray = $bccArray = [];
     $suppressedEmails = 0;
     //here we are getting logged in user id as array but we need target contact id. CRM-5988
     $cid = $form->get('cid');
@@ -110,29 +99,29 @@ class CRM_Contact_Form_Task_EmailCommon {
     }
     CRM_Contact_Form_Task_EmailCommon::bounceIfSimpleMailLimitExceeded(count($form->_contactIds));
 
-    $emailAttributes = array(
+    $emailAttributes = [
       'class' => 'huge',
-    );
+    ];
     $to = $form->add('text', 'to', ts('To'), $emailAttributes, TRUE);
     $cc = $form->add('text', 'cc_id', ts('CC'), $emailAttributes);
     $bcc = $form->add('text', 'bcc_id', ts('BCC'), $emailAttributes);
 
+    if ($to->getValue()) {
+      $form->_toContactIds = $form->_contactIds = [];
+    }
     $setDefaults = TRUE;
     if (property_exists($form, '_context') && $form->_context == 'standalone') {
       $setDefaults = FALSE;
     }
 
-    $elements = array('to', 'cc', 'bcc');
+    $elements = ['to', 'cc', 'bcc'];
     $form->_allContactIds = $form->_toContactIds = $form->_contactIds;
     foreach ($elements as $element) {
       if ($$element->getValue()) {
-        $allEmails = explode(',', $$element->getValue());
-        if ($element == 'to') {
-          $form->_toContactIds = $form->_contactIds = array();
-        }
 
-        foreach ($allEmails as $value) {
-          list($contactId, $email) = explode('::', $value);
+        foreach (self::getEmails($$element) as $value) {
+          $contactId = $value['contact_id'];
+          $email = $value['email'];
           if ($contactId) {
             switch ($element) {
               case 'to':
@@ -165,7 +154,7 @@ class CRM_Contact_Form_Task_EmailCommon {
 
     // check if we need to setdefaults and check for valid contact emails / communication preferences
     if (is_array($form->_allContactIds) && $setDefaults) {
-      $returnProperties = array(
+      $returnProperties = [
         'sort_name' => 1,
         'email' => 1,
         'do_not_email' => 1,
@@ -173,7 +162,7 @@ class CRM_Contact_Form_Task_EmailCommon {
         'on_hold' => 1,
         'display_name' => 1,
         'preferred_mail_format' => 1,
-      );
+      ];
 
       // get the details for all selected contacts ( to, cc and bcc contacts )
       list($form->_contactDetails) = CRM_Utils_Token::getTokenDetails($form->_allContactIds,
@@ -205,22 +194,22 @@ class CRM_Contact_Form_Task_EmailCommon {
             if (!empty($form->_toEmail) && $form->_toEmail['contact_id'] == $contactId) {
               $email = $form->_toEmail['email'];
             }
-            $toArray[] = array(
+            $toArray[] = [
               'text' => '"' . $value['sort_name'] . '" <' . $email . '>',
               'id' => "$contactId::{$email}",
-            );
+            ];
           }
           elseif (in_array($contactId, $form->_ccContactIds)) {
-            $ccArray[] = array(
+            $ccArray[] = [
               'text' => '"' . $value['sort_name'] . '" <' . $email . '>',
               'id' => "$contactId::{$email}",
-            );
+            ];
           }
           elseif (in_array($contactId, $form->_bccContactIds)) {
-            $bccArray[] = array(
+            $bccArray[] = [
               'text' => '"' . $value['sort_name'] . '" <' . $email . '>',
               'id' => "$contactId::{$email}",
-            );
+            ];
           }
         }
       }
@@ -274,41 +263,41 @@ class CRM_Contact_Form_Task_EmailCommon {
       $form->addDefaultButtons(ts('Send Email'), 'upload');
     }
 
-    $fields = array(
-      'followup_assignee_contact_id' => array(
+    $fields = [
+      'followup_assignee_contact_id' => [
         'type' => 'entityRef',
         'label' => ts('Assigned to'),
-        'attributes' => array(
+        'attributes' => [
           'multiple' => TRUE,
           'create' => TRUE,
-          'api' => array('params' => array('is_deceased' => 0)),
-        ),
-      ),
-      'followup_activity_type_id' => array(
+          'api' => ['params' => ['is_deceased' => 0]],
+        ],
+      ],
+      'followup_activity_type_id' => [
         'type' => 'select',
         'label' => ts('Followup Activity'),
-        'attributes' => array('' => '- ' . ts('select activity') . ' -') + CRM_Core_PseudoConstant::ActivityType(FALSE),
-        'extra' => array('class' => 'crm-select2'),
-      ),
-      'followup_activity_subject' => array(
+        'attributes' => ['' => '- ' . ts('select activity') . ' -'] + CRM_Core_PseudoConstant::ActivityType(FALSE),
+        'extra' => ['class' => 'crm-select2'],
+      ],
+      'followup_activity_subject' => [
         'type' => 'text',
         'label' => ts('Subject'),
         'attributes' => CRM_Core_DAO::getAttribute('CRM_Activity_DAO_Activity',
           'subject'
         ),
-      ),
-    );
+      ],
+    ];
 
     //add followup date
     $form->add('datepicker', 'followup_date', ts('in'));
 
     foreach ($fields as $field => $values) {
       if (!empty($fields[$field])) {
-        $attribute = CRM_Utils_Array::value('attributes', $values);
+        $attribute = $values['attributes'] ?? NULL;
         $required = !empty($values['required']);
 
         if ($values['type'] == 'select' && empty($attribute)) {
-          $form->addSelect($field, array('entity' => 'activity'), $required);
+          $form->addSelect($field, ['entity' => 'activity'], $required);
         }
         elseif ($values['type'] == 'entityRef') {
           $form->addEntityRef($field, $values['label'], $attribute, $required);
@@ -322,7 +311,7 @@ class CRM_Contact_Form_Task_EmailCommon {
     //Added for CRM-15984: Add campaign field
     CRM_Campaign_BAO_Campaign::addCampaign($form);
 
-    $form->addFormRule(array('CRM_Contact_Form_Task_EmailCommon', 'formRule'), $form);
+    $form->addFormRule(['CRM_Contact_Form_Task_EmailCommon', 'formRule'], $form);
     CRM_Core_Resources::singleton()->addScriptFile('civicrm', 'templates/CRM/Contact/Form/Task/EmailCommon.js', 0, 'html-header');
   }
 
@@ -339,11 +328,11 @@ class CRM_Contact_Form_Task_EmailCommon {
    *   true if no errors, else array of errors
    */
   public static function formRule($fields, $dontCare, $self) {
-    $errors = array();
+    $errors = [];
     $template = CRM_Core_Smarty::singleton();
 
     if (isset($fields['html_message'])) {
-      $htmlMessage = str_replace(array("\n", "\r"), ' ', $fields['html_message']);
+      $htmlMessage = str_replace(["\n", "\r"], ' ', $fields['html_message']);
       $htmlMessage = str_replace('"', '\"', $htmlMessage);
       $template->assign('htmlContent', $htmlMessage);
     }
@@ -360,6 +349,10 @@ class CRM_Contact_Form_Task_EmailCommon {
    * Process the form after the input has been submitted and validated.
    *
    * @param CRM_Core_Form $form
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
    */
   public static function postProcess(&$form) {
     self::bounceIfSimpleMailLimitExceeded(count($form->_contactIds));
@@ -376,11 +369,15 @@ class CRM_Contact_Form_Task_EmailCommon {
    *
    * @param CRM_Core_Form $form
    * @param array $formValues
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
    */
   public static function submit(&$form, $formValues) {
     self::saveMessageTemplate($formValues);
 
-    $from = CRM_Utils_Array::value('from_email_address', $formValues);
+    $from = $formValues['from_email_address'] ?? NULL;
     // dev/core#357 User Emails are keyed by their id so that the Signature is able to be added
     // If we have had a contact email used here the value returned from the line above will be the
     // numerical key where as $from for use in the sendEmail in Activity needs to be of format of "To Name" <toemailaddress>
@@ -388,9 +385,9 @@ class CRM_Contact_Form_Task_EmailCommon {
     $subject = $formValues['subject'];
 
     // CRM-13378: Append CC and BCC information at the end of Activity Details and format cc and bcc fields
-    $elements = array('cc_id', 'bcc_id');
+    $elements = ['cc_id', 'bcc_id'];
     $additionalDetails = NULL;
-    $ccValues = $bccValues = array();
+    $ccValues = $bccValues = [];
     foreach ($elements as $element) {
       if (!empty($formValues[$element])) {
         $allEmails = explode(',', $formValues[$element]);
@@ -428,15 +425,15 @@ class CRM_Contact_Form_Task_EmailCommon {
       $subject = "[case #$hash] $subject";
     }
 
-    $attachments = array();
+    $attachments = [];
     CRM_Core_BAO_File::formatAttachment($formValues,
       $attachments,
       NULL, NULL
     );
 
     // format contact details array to handle multiple emails from same contact
-    $formattedContactDetails = array();
-    $tempEmails = array();
+    $formattedContactDetails = [];
+    $tempEmails = [];
     foreach ($form->_contactIds as $key => $contactId) {
       // if we dont have details on this contactID, we should ignore
       // potentially this is due to the contact not wanting to receive email
@@ -456,7 +453,7 @@ class CRM_Contact_Form_Task_EmailCommon {
       }
     }
 
-    $contributionIds = array();
+    $contributionIds = [];
     if ($form->getVar('_contributionIds')) {
       $contributionIds = $form->getVar('_contributionIds');
     }
@@ -494,8 +491,8 @@ class CRM_Contact_Form_Task_EmailCommon {
 
         if (Civi::settings()->get('activity_assignee_notification')) {
           if ($followupActivity) {
-            $mailToFollowupContacts = array();
-            $assignee = array($followupActivity->id);
+            $mailToFollowupContacts = [];
+            $assignee = [$followupActivity->id];
             $assigneeContacts = CRM_Activity_BAO_ActivityAssignment::getAssigneeNames($assignee, TRUE, FALSE);
             foreach ($assigneeContacts as $values) {
               $mailToFollowupContacts[$values['email']] = $values;
@@ -510,10 +507,10 @@ class CRM_Contact_Form_Task_EmailCommon {
       }
 
       $count_success = count($form->_toContactDetails);
-      CRM_Core_Session::setStatus(ts('One message was sent successfully. ', array(
+      CRM_Core_Session::setStatus(ts('One message was sent successfully. ', [
         'plural' => '%count messages were sent successfully. ',
         'count' => $count_success,
-      )) . $followupStatus, ts('Message Sent', array('plural' => 'Messages Sent', 'count' => $count_success)), 'success');
+      ]) . $followupStatus, ts('Message Sent', ['plural' => 'Messages Sent', 'count' => $count_success]), 'success');
     }
 
     // Display the name and number of contacts for those email is not sent.
@@ -523,7 +520,7 @@ class CRM_Contact_Form_Task_EmailCommon {
     $emailsNotSent = @array_diff_assoc($form->_allContactDetails, $form->_contactDetails);
 
     if ($emailsNotSent) {
-      $not_sent = array();
+      $not_sent = [];
       foreach ($emailsNotSent as $contactId => $values) {
         $displayName = $values['display_name'];
         $email = $values['email'];
@@ -531,10 +528,10 @@ class CRM_Contact_Form_Task_EmailCommon {
         $not_sent[] = "<a href='$contactViewUrl' title='$email'>$displayName</a>" . ($values['on_hold'] ? '(' . ts('on hold') . ')' : '');
       }
       $status = '(' . ts('because no email address on file or communication preferences specify DO NOT EMAIL or Contact is deceased or Primary email address is On Hold') . ')<ul><li>' . implode('</li><li>', $not_sent) . '</li></ul>';
-      CRM_Core_Session::setStatus($status, ts('One Message Not Sent', array(
+      CRM_Core_Session::setStatus($status, ts('One Message Not Sent', [
         'count' => count($emailsNotSent),
         'plural' => '%count Messages Not Sent',
-      )), 'info');
+      ]), 'info');
     }
 
     if (isset($form->_caseId)) {
@@ -542,10 +539,10 @@ class CRM_Contact_Form_Task_EmailCommon {
       $cases = explode(',', $form->_caseId);
       foreach ($cases as $key => $val) {
         if (is_numeric($val)) {
-          $caseParams = array(
+          $caseParams = [
             'activity_id' => $activityId,
             'case_id' => $val,
-          );
+          ];
           CRM_Case_BAO_Case::processCaseActivity($caseParams);
         }
       }
@@ -556,15 +553,18 @@ class CRM_Contact_Form_Task_EmailCommon {
    * Save the template if update selected.
    *
    * @param array $formValues
+   *
+   * @throws \CiviCRM_API3_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
    */
   protected static function saveMessageTemplate($formValues) {
     if (!empty($formValues['saveTemplate']) || !empty($formValues['updateTemplate'])) {
-      $messageTemplate = array(
+      $messageTemplate = [
         'msg_text' => $formValues['text_message'],
         'msg_html' => $formValues['html_message'],
         'msg_subject' => $formValues['subject'],
         'is_active' => TRUE,
-      );
+      ];
 
       if (!empty($formValues['saveTemplate'])) {
         $messageTemplate['msg_title'] = $formValues['saveTemplateName'];
@@ -589,9 +589,26 @@ class CRM_Contact_Form_Task_EmailCommon {
     $limit = Civi::settings()->get('simple_mail_limit');
     if ($count > $limit) {
       CRM_Core_Error::statusBounce(ts('Please do not use this task to send a lot of emails (greater than %1). Many countries have legal requirements when sending bulk emails and the CiviMail framework has opt out functionality and domain tokens to help meet these.',
-        array(1 => $limit)
+        [1 => $limit]
       ));
     }
   }
 
+  /**
+   * Get the emails from the added element.
+   *
+   * @param HTML_QuickForm_Element $element
+   *
+   * @return array
+   */
+  protected static function getEmails($element): array {
+    $allEmails = explode(',', $element->getValue());
+    $return = [];
+    foreach ($allEmails as $value) {
+      $values = explode('::', $value);
+      $return[] = ['contact_id' => $values[0], 'email' => $values[1]];
+    }
+    return $return;
+  }
+
 }
diff --git a/civicrm/CRM/Contact/Form/Task/EmailTrait.php b/civicrm/CRM/Contact/Form/Task/EmailTrait.php
new file mode 100644
index 0000000000..0c4776b1fe
--- /dev/null
+++ b/civicrm/CRM/Contact/Form/Task/EmailTrait.php
@@ -0,0 +1,95 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+/**
+ * This class provides the common functionality for tasks that send emails.
+ */
+trait CRM_Contact_Form_Task_EmailTrait {
+
+  /**
+   * Are we operating in "single mode", i.e. sending email to one
+   * specific contact?
+   *
+   * @var bool
+   */
+  public $_single = FALSE;
+
+  public $_noEmails = FALSE;
+
+  /**
+   * All the existing templates in the system.
+   *
+   * @var array
+   */
+  public $_templates;
+
+  /**
+   * Store "to" contact details.
+   * @var array
+   */
+  public $_toContactDetails = [];
+
+  /**
+   * Store all selected contact id's, that includes to, cc and bcc contacts
+   * @var array
+   */
+  public $_allContactIds = [];
+
+  /**
+   * Store only "to" contact ids.
+   * @var array
+   */
+  public $_toContactIds = [];
+
+  /**
+   * Store only "cc" contact ids.
+   * @var array
+   */
+  public $_ccContactIds = [];
+
+  /**
+   * Store only "bcc" contact ids.
+   *
+   * @var array
+   */
+  public $_bccContactIds = [];
+
+  /**
+   * Build the form object.
+   *
+   * @throws \CRM_Core_Exception
+   */
+  public function buildQuickForm() {
+    // Suppress form might not be required but perhaps there was a risk some other  process had set it to TRUE.
+    $this->assign('suppressForm', FALSE);
+    $this->assign('emailTask', TRUE);
+
+    CRM_Contact_Form_Task_EmailCommon::buildQuickForm($this);
+  }
+
+  /**
+   * Process the form after the input has been submitted and validated.
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
+   */
+  public function postProcess() {
+    CRM_Contact_Form_Task_EmailCommon::postProcess($this);
+  }
+
+}
diff --git a/civicrm/CRM/Contact/Form/Task/Label.php b/civicrm/CRM/Contact/Form/Task/Label.php
index ad9010a4b4..02e73d127d 100644
--- a/civicrm/CRM/Contact/Form/Task/Label.php
+++ b/civicrm/CRM/Contact/Form/Task/Label.php
@@ -83,7 +83,7 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
   public function setDefaultValues() {
     $defaults = [];
     $format = CRM_Core_BAO_LabelFormat::getDefaultValues();
-    $defaults['label_name'] = CRM_Utils_Array::value('name', $format);
+    $defaults['label_name'] = $format['name'] ?? NULL;
     $defaults['do_not_mail'] = 1;
 
     return $defaults;
@@ -227,7 +227,7 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
           $details[0][$value]["custom_{$cfID}"] = CRM_Core_BAO_CustomField::displayValue($details[0][$value]["custom_{$cfID}"], $cfID);
         }
       }
-      $contact = CRM_Utils_Array::value($value, $details['0']);
+      $contact = $details['0'][$value] ?? NULL;
 
       if (is_a($contact, 'CRM_Core_Error')) {
         return NULL;
diff --git a/civicrm/CRM/Contact/Form/Task/LabelCommon.php b/civicrm/CRM/Contact/Form/Task/LabelCommon.php
index b356735176..ddc289154d 100644
--- a/civicrm/CRM/Contact/Form/Task/LabelCommon.php
+++ b/civicrm/CRM/Contact/Form/Task/LabelCommon.php
@@ -149,7 +149,7 @@ class CRM_Contact_Form_Task_LabelCommon {
           $details[$value]["custom_{$cfID}"] = CRM_Core_BAO_CustomField::displayValue($details[$value]["custom_{$cfID}"], $cfID);
         }
       }
-      $contact = CRM_Utils_Array::value($value, $details);
+      $contact = $details[$value] ?? NULL;
 
       if (is_a($contact, 'CRM_Core_Error')) {
         return NULL;
diff --git a/civicrm/CRM/Contact/Form/Task/PDF.php b/civicrm/CRM/Contact/Form/Task/PDF.php
index f69a1f84a6..59b14006da 100644
--- a/civicrm/CRM/Contact/Form/Task/PDF.php
+++ b/civicrm/CRM/Contact/Form/Task/PDF.php
@@ -76,7 +76,7 @@ class CRM_Contact_Form_Task_PDF extends CRM_Contact_Form_Task {
     if (isset($this->_activityId)) {
       $params = ['id' => $this->_activityId];
       CRM_Activity_BAO_Activity::retrieve($params, $defaults);
-      $defaults['html_message'] = CRM_Utils_Array::value('details', $defaults);
+      $defaults['html_message'] = $defaults['details'] ?? NULL;
     }
     $defaults = $defaults + CRM_Contact_Form_Task_PDFLetterCommon::setDefaultValues();
     return $defaults;
diff --git a/civicrm/CRM/Contact/Form/Task/PDFLetterCommon.php b/civicrm/CRM/Contact/Form/Task/PDFLetterCommon.php
index ee7179f210..fddf30a8f9 100644
--- a/civicrm/CRM/Contact/Form/Task/PDFLetterCommon.php
+++ b/civicrm/CRM/Contact/Form/Task/PDFLetterCommon.php
@@ -110,8 +110,8 @@ class CRM_Contact_Form_Task_PDFLetterCommon extends CRM_Core_Form_Task_PDFLetter
   public static function postProcess(&$form) {
     $formValues = $form->controller->exportValues($form->getName());
     list($formValues, $categories, $html_message, $messageToken, $returnProperties) = self::processMessageTemplate($formValues);
-    $skipOnHold = isset($form->skipOnHold) ? $form->skipOnHold : FALSE;
-    $skipDeceased = isset($form->skipDeceased) ? $form->skipDeceased : TRUE;
+    $skipOnHold = $form->skipOnHold ?? FALSE;
+    $skipDeceased = $form->skipDeceased ?? TRUE;
     $html = $activityIds = [];
 
     // CRM-16725 Skip creation of activities if user is previewing their PDF letter(s)
diff --git a/civicrm/CRM/Contact/Form/Task/Print.php b/civicrm/CRM/Contact/Form/Task/Print.php
index 65189f345f..2869f520a1 100644
--- a/civicrm/CRM/Contact/Form/Task/Print.php
+++ b/civicrm/CRM/Contact/Form/Task/Print.php
@@ -66,7 +66,7 @@ class CRM_Contact_Form_Task_Print extends CRM_Contact_Form_Task {
     $selectorName = $this->controller->selectorName();
     require_once str_replace('_', DIRECTORY_SEPARATOR, $selectorName) . '.php';
 
-    $returnP = isset($returnProperties) ? $returnProperties : "";
+    $returnP = $returnProperties ?? "";
     $customSearchClass = $this->get('customSearchClass');
     $this->assign('customSearchID', $this->get('customSearchID'));
     $selector = new $selectorName($customSearchClass,
diff --git a/civicrm/CRM/Contact/Form/Task/ProximityCommon.php b/civicrm/CRM/Contact/Form/Task/ProximityCommon.php
index b4aed3a98c..58c6abe8fc 100644
--- a/civicrm/CRM/Contact/Form/Task/ProximityCommon.php
+++ b/civicrm/CRM/Contact/Form/Task/ProximityCommon.php
@@ -49,7 +49,7 @@ class CRM_Contact_Form_Task_ProximityCommon {
    */
   public static function buildQuickForm($form, $proxSearch) {
     // is proximity search required (2) or optional (1)?
-    $proxRequired = ($proxSearch == 2 ? TRUE : FALSE);
+    $proxRequired = ($proxSearch == 2);
     $form->assign('proximity_search', TRUE);
 
     $form->add('text', 'prox_street_address', ts('Street Address'), NULL, FALSE);
diff --git a/civicrm/CRM/Contact/Form/Task/SMSCommon.php b/civicrm/CRM/Contact/Form/Task/SMSCommon.php
index c352a47516..269f1f4018 100644
--- a/civicrm/CRM/Contact/Form/Task/SMSCommon.php
+++ b/civicrm/CRM/Contact/Form/Task/SMSCommon.php
@@ -204,7 +204,7 @@ class CRM_Contact_Form_Task_SMSCommon {
               $mobilePhone = CRM_Utils_Array::retrieveValueRecursive($contactPhones, 'phone');
               $form->_contactDetails[$contactId]['phone_id'] = CRM_Utils_Array::retrieveValueRecursive($contactPhones, 'id');
               $form->_contactDetails[$contactId]['phone'] = $mobilePhone;
-              $form->_contactDetails[$contactId]['phone_type_id'] = CRM_Utils_Array::value('Mobile', $phoneTypes);
+              $form->_contactDetails[$contactId]['phone_type_id'] = $phoneTypes['Mobile'] ?? NULL;
             }
             else {
               $suppressedSms++;
@@ -226,7 +226,7 @@ class CRM_Contact_Form_Task_SMSCommon {
           $phone = $value['phone'];
         }
         else {
-          $phone = CRM_Utils_Array::value($key, $form->_toContactPhone);
+          $phone = $form->_toContactPhone[$key] ?? NULL;
         }
 
         if ($phone) {
@@ -302,7 +302,7 @@ class CRM_Contact_Form_Task_SMSCommon {
     }
     else {
       if (!empty($fields['sms_text_message'])) {
-        $messageCheck = CRM_Utils_Array::value('sms_text_message', $fields);
+        $messageCheck = $fields['sms_text_message'] ?? NULL;
         $messageCheck = str_replace("\r\n", "\n", $messageCheck);
         if ($messageCheck && (strlen($messageCheck) > CRM_SMS_Provider::MAX_SMS_CHAR)) {
           $errors['sms_text_message'] = ts("You can configure the SMS message body up to %1 characters", [1 => CRM_SMS_Provider::MAX_SMS_CHAR]);
diff --git a/civicrm/CRM/Contact/Form/Task/SaveSearch.php b/civicrm/CRM/Contact/Form/Task/SaveSearch.php
index f8114ce8d1..a98a29fee0 100644
--- a/civicrm/CRM/Contact/Form/Task/SaveSearch.php
+++ b/civicrm/CRM/Contact/Form/Task/SaveSearch.php
@@ -54,7 +54,7 @@ class CRM_Contact_Form_Task_SaveSearch extends CRM_Contact_Form_Task {
     $modeValue = CRM_Contact_Form_Search::getModeValue(CRM_Utils_Array::value('component_mode', $values, CRM_Contact_BAO_Query::MODE_CONTACTS));
     $className = $modeValue['taskClassName'];
     $taskList = $className::taskTitles();
-    $this->_task = CRM_Utils_Array::value('task', $values);
+    $this->_task = $values['task'] ?? NULL;
     $this->assign('taskName', CRM_Utils_Array::value($this->_task, $taskList));
   }
 
diff --git a/civicrm/CRM/Contact/Import/Form/DataSource.php b/civicrm/CRM/Contact/Import/Form/DataSource.php
index e7cc48bd6c..97ffa8453d 100644
--- a/civicrm/CRM/Contact/Import/Form/DataSource.php
+++ b/civicrm/CRM/Contact/Import/Form/DataSource.php
@@ -57,7 +57,7 @@ class CRM_Contact_Import_Form_DataSource extends CRM_Core_Form {
     $errorFiles = ['sqlImport.errors', 'sqlImport.conflicts', 'sqlImport.duplicates', 'sqlImport.mismatch'];
 
     // check for post max size avoid when called twice
-    $snippet = CRM_Utils_Array::value('snippet', $_GET, 0);
+    $snippet = $_GET['snippet'] ?? 0;
     if (empty($snippet)) {
       CRM_Utils_Number::formatUnitSize(ini_get('post_max_size'), TRUE);
     }
diff --git a/civicrm/CRM/Contact/Import/Form/MapField.php b/civicrm/CRM/Contact/Import/Form/MapField.php
index 7b18995697..be989a8d19 100644
--- a/civicrm/CRM/Contact/Import/Form/MapField.php
+++ b/civicrm/CRM/Contact/Import/Form/MapField.php
@@ -429,7 +429,7 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
   public static function formRule($fields) {
     $errors = [];
     if (!empty($fields['saveMapping'])) {
-      $nameField = CRM_Utils_Array::value('saveMappingName', $fields);
+      $nameField = $fields['saveMappingName'] ?? NULL;
       if (empty($nameField)) {
         $errors['saveMappingName'] = ts('Name is required to save Import Mapping');
       }
@@ -532,10 +532,10 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
 
     for ($i = 0; $i < $this->_columnCount; $i++) {
 
-      $fldName = CRM_Utils_Array::value(0, $mapperKeys[$i]);
-      $selOne = CRM_Utils_Array::value(1, $mapperKeys[$i]);
-      $selTwo = CRM_Utils_Array::value(2, $mapperKeys[$i]);
-      $selThree = CRM_Utils_Array::value(3, $mapperKeys[$i]);
+      $fldName = $mapperKeys[$i][0] ?? NULL;
+      $selOne = $mapperKeys[$i][1] ?? NULL;
+      $selTwo = $mapperKeys[$i][2] ?? NULL;
+      $selThree = $mapperKeys[$i][3] ?? NULL;
       $mapper[$i] = $this->_mapperFields[$mapperKeys[$i][0]];
       $mapperKeysMain[$i] = $fldName;
 
@@ -569,7 +569,7 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
             $parserParameters['relatedContactWebsiteType'][$i] = $websiteTypes[$selTwo];
           }
           else {
-            $parserParameters['relatedContactLocType'][$i] = CRM_Utils_Array::value($selTwo, $locationTypes);
+            $parserParameters['relatedContactLocType'][$i] = $locationTypes[$selTwo] ?? NULL;
             if ($selThree) {
               if ($selOne === 'phone') {
                 $parserParameters['relatedContactPhoneType'][$i] = $phoneTypes[$selThree];
@@ -623,14 +623,14 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
 
       for ($i = 0; $i < $this->_columnCount; $i++) {
         $updateMappingFields = new CRM_Core_DAO_MappingField();
-        $updateMappingFields->id = CRM_Utils_Array::value($i, $mappingFieldsId);
+        $updateMappingFields->id = $mappingFieldsId[$i] ?? NULL;
         $updateMappingFields->mapping_id = $params['mappingId'];
         $updateMappingFields->column_number = $i;
 
         $mapperKeyParts = explode('_', $mapperKeys[$i][0], 3);
-        $id = isset($mapperKeyParts[0]) ? $mapperKeyParts[0] : NULL;
-        $first = isset($mapperKeyParts[1]) ? $mapperKeyParts[1] : NULL;
-        $second = isset($mapperKeyParts[2]) ? $mapperKeyParts[2] : NULL;
+        $id = $mapperKeyParts[0] ?? NULL;
+        $first = $mapperKeyParts[1] ?? NULL;
+        $second = $mapperKeyParts[2] ?? NULL;
         if (($first == 'a' && $second == 'b') || ($first == 'b' && $second == 'a')) {
           $updateMappingFields->relationship_type_id = $id;
           $updateMappingFields->relationship_direction = "{$first}_{$second}";
@@ -638,14 +638,14 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
           // get phoneType id and provider id separately
           // before updating mappingFields of phone and IM for related contact, CRM-3140
           if (CRM_Utils_Array::value('1', $mapperKeys[$i]) == 'url') {
-            $updateMappingFields->website_type_id = isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
+            $updateMappingFields->website_type_id = $mapperKeys[$i][2] ?? NULL;
           }
           else {
             if (CRM_Utils_Array::value('1', $mapperKeys[$i]) == 'phone') {
-              $updateMappingFields->phone_type_id = isset($mapperKeys[$i][3]) ? $mapperKeys[$i][3] : NULL;
+              $updateMappingFields->phone_type_id = $mapperKeys[$i][3] ?? NULL;
             }
             elseif (CRM_Utils_Array::value('1', $mapperKeys[$i]) == 'im') {
-              $updateMappingFields->im_provider_id = isset($mapperKeys[$i][3]) ? $mapperKeys[$i][3] : NULL;
+              $updateMappingFields->im_provider_id = $mapperKeys[$i][3] ?? NULL;
             }
             $updateMappingFields->location_type_id = isset($mapperKeys[$i][2]) && is_numeric($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
           }
@@ -657,14 +657,14 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
           // to store phoneType id and provider id separately
           // before updating mappingFields for phone and IM, CRM-3140
           if (CRM_Utils_Array::value('0', $mapperKeys[$i]) == 'url') {
-            $updateMappingFields->website_type_id = isset($mapperKeys[$i][1]) ? $mapperKeys[$i][1] : NULL;
+            $updateMappingFields->website_type_id = $mapperKeys[$i][1] ?? NULL;
           }
           else {
             if (CRM_Utils_Array::value('0', $mapperKeys[$i]) == 'phone') {
-              $updateMappingFields->phone_type_id = isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
+              $updateMappingFields->phone_type_id = $mapperKeys[$i][2] ?? NULL;
             }
             elseif (CRM_Utils_Array::value('0', $mapperKeys[$i]) == 'im') {
-              $updateMappingFields->im_provider_id = isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
+              $updateMappingFields->im_provider_id = $mapperKeys[$i][2] ?? NULL;
             }
             $locationTypeID = $parserParameters['mapperLocType'][$i];
             // location_type_id is NULL for non-location fields, and for Primary location.
@@ -747,9 +747,9 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
     $saveMappingFields->column_number = $i;
 
     $mapperKeyParts = explode('_', $mapperKeys[$i][0], 3);
-    $id = isset($mapperKeyParts[0]) ? $mapperKeyParts[0] : NULL;
-    $first = isset($mapperKeyParts[1]) ? $mapperKeyParts[1] : NULL;
-    $second = isset($mapperKeyParts[2]) ? $mapperKeyParts[2] : NULL;
+    $id = $mapperKeyParts[0] ?? NULL;
+    $first = $mapperKeyParts[1] ?? NULL;
+    $second = $mapperKeyParts[2] ?? NULL;
     if (($first == 'a' && $second == 'b') || ($first == 'b' && $second == 'a')) {
       $saveMappingFields->name = ucwords(str_replace("_", " ", $mapperKeys[$i][1]));
       $saveMappingFields->relationship_type_id = $id;
@@ -757,14 +757,14 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
       // to get phoneType id and provider id separately
       // before saving mappingFields of phone and IM for related contact, CRM-3140
       if (CRM_Utils_Array::value('1', $mapperKeys[$i]) == 'url') {
-        $saveMappingFields->website_type_id = isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
+        $saveMappingFields->website_type_id = $mapperKeys[$i][2] ?? NULL;
       }
       else {
         if (CRM_Utils_Array::value('1', $mapperKeys[$i]) == 'phone') {
-          $saveMappingFields->phone_type_id = isset($mapperKeys[$i][3]) ? $mapperKeys[$i][3] : NULL;
+          $saveMappingFields->phone_type_id = $mapperKeys[$i][3] ?? NULL;
         }
         elseif (CRM_Utils_Array::value('1', $mapperKeys[$i]) == 'im') {
-          $saveMappingFields->im_provider_id = isset($mapperKeys[$i][3]) ? $mapperKeys[$i][3] : NULL;
+          $saveMappingFields->im_provider_id = $mapperKeys[$i][3] ?? NULL;
         }
         $saveMappingFields->location_type_id = (isset($mapperKeys[$i][2]) && $mapperKeys[$i][2] !== 'Primary') ? $mapperKeys[$i][2] : NULL;
       }
@@ -775,14 +775,14 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
       // to get phoneType id and provider id separately
       // before saving mappingFields of phone and IM, CRM-3140
       if (CRM_Utils_Array::value('0', $mapperKeys[$i]) == 'url') {
-        $saveMappingFields->website_type_id = isset($mapperKeys[$i][1]) ? $mapperKeys[$i][1] : NULL;
+        $saveMappingFields->website_type_id = $mapperKeys[$i][1] ?? NULL;
       }
       else {
         if (CRM_Utils_Array::value('0', $mapperKeys[$i]) == 'phone') {
-          $saveMappingFields->phone_type_id = isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
+          $saveMappingFields->phone_type_id = $mapperKeys[$i][2] ?? NULL;
         }
         elseif (CRM_Utils_Array::value('0', $mapperKeys[$i]) == 'im') {
-          $saveMappingFields->im_provider_id = isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : NULL;
+          $saveMappingFields->im_provider_id = $mapperKeys[$i][2] ?? NULL;
         }
         $saveMappingFields->location_type_id = is_numeric($locationTypeID) ? $locationTypeID : NULL;
       }
diff --git a/civicrm/CRM/Contact/Import/ImportJob.php b/civicrm/CRM/Contact/Import/ImportJob.php
index e15f7e3f86..81e875b502 100644
--- a/civicrm/CRM/Contact/Import/ImportJob.php
+++ b/civicrm/CRM/Contact/Import/ImportJob.php
@@ -133,11 +133,11 @@ class CRM_Contact_Import_ImportJob {
 
     foreach ($mapper as $key => $value) {
 
-      $fldName = CRM_Utils_Array::value(0, $mapper[$key]);
+      $fldName = $mapper[$key][0] ?? NULL;
       $header = array($this->_mapFields[$fldName]);
-      $selOne = CRM_Utils_Array::value(1, $mapper[$key]);
-      $selTwo = CRM_Utils_Array::value(2, $mapper[$key]);
-      $selThree = CRM_Utils_Array::value(3, $mapper[$key]);
+      $selOne = $mapper[$key][1] ?? NULL;
+      $selTwo = $mapper[$key][2] ?? NULL;
+      $selThree = $mapper[$key][3] ?? NULL;
       $this->_mapperKeys[$key] = $fldName;
 
       //need to differentiate non location elements.
@@ -165,8 +165,8 @@ class CRM_Contact_Import_ImportJob {
 
       $fldNameParts = explode('_', $fldName, 3);
       $id = $fldNameParts[0];
-      $first = isset($fldNameParts[1]) ? $fldNameParts[1] : NULL;
-      $second = isset($fldNameParts[2]) ? $fldNameParts[2] : NULL;
+      $first = $fldNameParts[1] ?? NULL;
+      $second = $fldNameParts[2] ?? NULL;
       if (($first == 'a' && $second == 'b') ||
         ($first == 'b' && $second == 'a')
       ) {
@@ -294,7 +294,7 @@ class CRM_Contact_Import_ImportJob {
 
     if ($newGroupName) {
       /* Create a new group */
-      $newGroupType = isset($newGroupType) ? $newGroupType : array();
+      $newGroupType = $newGroupType ?? array();
       $gParams = array(
         'title' => $newGroupName,
         'description' => $newGroupDesc,
diff --git a/civicrm/CRM/Contact/Import/Parser.php b/civicrm/CRM/Contact/Import/Parser.php
index a4b11fb439..146c1b5d37 100644
--- a/civicrm/CRM/Contact/Import/Parser.php
+++ b/civicrm/CRM/Contact/Import/Parser.php
@@ -865,8 +865,8 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
         !array_key_exists($customFieldID, $addressCustomFields)
       ) {
 
-        $extends = CRM_Utils_Array::value('extends', $customFields[$customFieldID]);
-        $htmlType = CRM_Utils_Array::value('html_type', $customFields[$customFieldID]);
+        $extends = $customFields[$customFieldID]['extends'] ?? NULL;
+        $htmlType = $customFields[$customFieldID]['html_type'] ?? NULL;
         switch ($htmlType) {
           case 'Select':
           case 'Radio':
@@ -874,8 +874,8 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
             if ($customFields[$customFieldID]['data_type'] == 'String' || $customFields[$customFieldID]['data_type'] == 'Int') {
               $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE);
               foreach ($customOption as $customValue) {
-                $val = CRM_Utils_Array::value('value', $customValue);
-                $label = CRM_Utils_Array::value('label', $customValue);
+                $val = $customValue['value'] ?? NULL;
+                $label = $customValue['label'] ?? NULL;
                 $label = strtolower($label);
                 $value = strtolower(trim($formatted[$key]));
                 if (($value == $label) || ($value == strtolower($val))) {
@@ -926,7 +926,7 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
         if (empty($formatted['custom'][$customKey][-1]['is_required'])) {
           $formatted['custom'][$customKey][-1]['is_required'] = $customFields[$customKey]['is_required'];
         }
-        $emptyValue = CRM_Utils_Array::value('value', $customvalue[-1]);
+        $emptyValue = $customvalue[-1]['value'] ?? NULL;
         if (!isset($emptyValue)) {
           unset($formatted['custom'][$customKey]);
         }
@@ -937,7 +937,7 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
     if ($this->_parseStreetAddress) {
       if (array_key_exists('address', $formatted) && is_array($formatted['address'])) {
         foreach ($formatted['address'] as $instance => & $address) {
-          $streetAddress = CRM_Utils_Array::value('street_address', $address);
+          $streetAddress = $address['street_address'] ?? NULL;
           if (empty($streetAddress)) {
             continue;
           }
@@ -1026,7 +1026,7 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
     if (isset($values['email_greeting'])) {
       if (!empty($params['email_greeting_id'])) {
         $emailGreetingFilter = [
-          'contact_type' => CRM_Utils_Array::value('contact_type', $params),
+          'contact_type' => $params['contact_type'] ?? NULL,
           'greeting_type' => 'email_greeting',
         ];
         $emailGreetings = CRM_Core_PseudoConstant::greeting($emailGreetingFilter);
@@ -1042,7 +1042,7 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
     if (isset($values['postal_greeting'])) {
       if (!empty($params['postal_greeting_id'])) {
         $postalGreetingFilter = [
-          'contact_type' => CRM_Utils_Array::value('contact_type', $params),
+          'contact_type' => $params['contact_type'] ?? NULL,
           'greeting_type' => 'postal_greeting',
         ];
         $postalGreetings = CRM_Core_PseudoConstant::greeting($postalGreetingFilter);
@@ -1057,7 +1057,7 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
     if (isset($values['addressee'])) {
       if (!empty($params['addressee_id'])) {
         $addresseeFilter = [
-          'contact_type' => CRM_Utils_Array::value('contact_type', $params),
+          'contact_type' => $params['contact_type'] ?? NULL,
           'greeting_type' => 'addressee',
         ];
         $addressee = CRM_Core_PseudoConstant::addressee($addresseeFilter);
@@ -1237,7 +1237,7 @@ abstract class CRM_Contact_Import_Parser extends CRM_Import_Parser {
         $customFieldID = CRM_Core_BAO_CustomField::getKeyID($key);
         if ($customFieldID && array_key_exists($customFieldID, $customFields)) {
 
-          $htmlType = CRM_Utils_Array::value('html_type', $customFields[$customFieldID]);
+          $htmlType = $customFields[$customFieldID]['html_type'] ?? NULL;
           switch ($htmlType) {
             case 'CheckBox':
             case 'Multi-Select':
diff --git a/civicrm/CRM/Contact/Import/Parser/Contact.php b/civicrm/CRM/Contact/Import/Parser/Contact.php
index 7b4356fba2..bb4be04495 100644
--- a/civicrm/CRM/Contact/Import/Parser/Contact.php
+++ b/civicrm/CRM/Contact/Import/Parser/Contact.php
@@ -301,7 +301,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {
         }
       }
 
-      $email = CRM_Utils_Array::value($this->_emailIndex, $values);
+      $email = $values[$this->_emailIndex] ?? NULL;
       if ($email) {
         /* If the email address isn't valid, bail */
 
@@ -339,7 +339,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {
     }
 
     //check for duplicate external Identifier
-    $externalID = CRM_Utils_Array::value($this->_externalIdentifierIndex, $values);
+    $externalID = $values[$this->_externalIdentifierIndex] ?? NULL;
     if ($externalID) {
       /* If it's a dupe,external Identifier  */
 
@@ -1121,7 +1121,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {
     $dateType = CRM_Core_Session::singleton()->get("dateTypes");
 
     if (!empty($params['contact_sub_type'])) {
-      $csType = CRM_Utils_Array::value('contact_sub_type', $params);
+      $csType = $params['contact_sub_type'] ?? NULL;
     }
 
     if (empty($params['contact_type'])) {
@@ -1807,7 +1807,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {
     }
 
     foreach ($locationFields as $locKeys) {
-      if (is_array(CRM_Utils_Array::value($locKeys, $params))) {
+      if (isset($params[$locKeys]) && is_array($params[$locKeys])) {
         foreach ($params[$locKeys] as $key => $value) {
           if ($modeFill) {
             $getValue = CRM_Utils_Array::retrieveValueRecursive($contact, $locKeys);
@@ -1908,7 +1908,7 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser {
         if (!empty($relatedContactFields[$name]) && !is_array($relatedContactFields[$name])) {
           $relatedContactFields[$name] = [];
         }
-        $fldName = CRM_Utils_Array::value($key, $this->_mapperRelatedContactDetails);
+        $fldName = $this->_mapperRelatedContactDetails[$key] ?? NULL;
         if ($fldName == 'url') {
           $fldName = 'website';
         }
diff --git a/civicrm/CRM/Contact/Page/AJAX.php b/civicrm/CRM/Contact/Page/AJAX.php
index 334925e6af..069aff30d9 100644
--- a/civicrm/CRM/Contact/Page/AJAX.php
+++ b/civicrm/CRM/Contact/Page/AJAX.php
@@ -37,7 +37,7 @@ class CRM_Contact_Page_AJAX {
    * Todo: Migrate contact reference fields to use EntityRef
    */
   public static function contactReference() {
-    $name = CRM_Utils_Array::value('term', $_GET);
+    $name = $_GET['term'] ?? NULL;
     $name = CRM_Utils_Type::escape($name, 'String');
     $cfID = CRM_Utils_Type::escape($_GET['id'], 'Positive');
 
@@ -54,7 +54,7 @@ class CRM_Contact_Page_AJAX {
       $filterParams = [];
       parse_str($cf['filter'], $filterParams);
 
-      $action = CRM_Utils_Array::value('action', $filterParams);
+      $action = $filterParams['action'] ?? NULL;
       if (!empty($action) && !in_array($action, ['get', 'lookup'])) {
         CRM_Utils_System::civiExit(1);
       }
@@ -146,7 +146,7 @@ class CRM_Contact_Page_AJAX {
    * Fetch PCP ID by PCP Supporter sort_name, also displays PCP title and associated Contribution Page title
    */
   public static function getPCPList() {
-    $name = CRM_Utils_Array::value('term', $_GET);
+    $name = $_GET['term'] ?? NULL;
     $name = CRM_Utils_Type::escape($name, 'String');
     $limit = $max = Civi::settings()->get('search_autocomplete_count');
 
@@ -347,7 +347,7 @@ class CRM_Contact_Page_AJAX {
    */
   public static function getContactEmail() {
     $queryStrings = [];
-    $name = CRM_Utils_Array::value('name', $_GET);
+    $name = $_GET['name'] ?? NULL;
     if ($name) {
       $name = CRM_Utils_Type::escape($name, 'String');
       $wildCard = Civi::settings()->get('includeWildCardInName') ? '%' : '';
@@ -401,7 +401,7 @@ LIMIT {$rowCount}
     $sqlParmas = [];
     //check for mobile type
     $phoneTypes = CRM_Core_OptionGroup::values('phone_type', TRUE, FALSE, FALSE, NULL, 'name');
-    $mobileType = CRM_Utils_Array::value('Mobile', $phoneTypes);
+    $mobileType = $phoneTypes['Mobile'] ?? NULL;
 
     $name = CRM_Utils_Request::retrieveValue('name', 'String', NULL, FALSE, 'GET');
     if ($name) {
@@ -506,12 +506,12 @@ LIMIT {$offset}, {$rowCount}
   public static function dashboard() {
     switch ($_REQUEST['op']) {
       case 'save_columns':
-        CRM_Core_BAO_Dashboard::saveDashletChanges($_REQUEST['columns']);
+        CRM_Core_BAO_Dashboard::saveDashletChanges($_REQUEST['columns'] ?? NULL);
         break;
 
       case 'delete_dashlet':
         $dashletID = CRM_Utils_Type::escape($_REQUEST['dashlet_id'], 'Positive');
-        CRM_Core_BAO_Dashboard::deleteDashlet($dashletID);
+        CRM_Core_DAO_Dashboard::deleteRecord(['id' => $dashletID]);
     }
 
     CRM_Utils_System::civiExit();
@@ -651,7 +651,7 @@ LIMIT {$offset}, {$rowCount}
           $dir = CRM_Utils_Type::escape($orderInfo['dir'], 'MysqlOrderByDirection', FALSE);
         }
       }
-      $columnDetails = CRM_Utils_Array::value($orderColumnNumber, $_REQUEST['columns']);
+      $columnDetails = $_REQUEST['columns'][$orderColumnNumber] ?? NULL;
     }
     if (!empty($columnDetails)) {
       switch ($columnDetails['data']) {
@@ -699,8 +699,8 @@ LIMIT {$offset}, {$rowCount}
     $count = 0;
     foreach ($dupePairs as $key => $pairInfo) {
       $pair = $pairInfo['data'];
-      $srcContactSubType  = CRM_Utils_Array::value('src_contact_sub_type', $pairInfo);
-      $dstContactSubType  = CRM_Utils_Array::value('dst_contact_sub_type', $pairInfo);
+      $srcContactSubType  = $pairInfo['src_contact_sub_type'] ?? NULL;
+      $dstContactSubType  = $pairInfo['dst_contact_sub_type'] ?? NULL;
       $srcTypeImage = CRM_Contact_BAO_Contact_Utils::getImage($srcContactSubType ?
         $srcContactSubType : $pairInfo['src_contact_type'],
         FALSE,
@@ -716,16 +716,16 @@ LIMIT {$offset}, {$rowCount}
       $searchRows[$count]['is_selected_input'] = "<input type='checkbox' class='crm-dedupe-select' name='pnid_{$pairInfo['prevnext_id']}' value='{$pairInfo['is_selected']}' onclick='toggleDedupeSelect(this)'>";
       $searchRows[$count]['src_image'] = $srcTypeImage;
       $searchRows[$count]['src'] = CRM_Utils_System::href($pair['srcName'], 'civicrm/contact/view', "reset=1&cid={$pairInfo['entity_id2']}");
-      $searchRows[$count]['src_email'] = CRM_Utils_Array::value('src_email', $pairInfo);
-      $searchRows[$count]['src_street'] = CRM_Utils_Array::value('src_street', $pairInfo);
-      $searchRows[$count]['src_postcode'] = CRM_Utils_Array::value('src_postcode', $pairInfo);
+      $searchRows[$count]['src_email'] = $pairInfo['src_email'] ?? NULL;
+      $searchRows[$count]['src_street'] = $pairInfo['src_street'] ?? NULL;
+      $searchRows[$count]['src_postcode'] = $pairInfo['src_postcode'] ?? NULL;
       $searchRows[$count]['dst_image'] = $dstTypeImage;
       $searchRows[$count]['dst'] = CRM_Utils_System::href($pair['dstName'], 'civicrm/contact/view', "reset=1&cid={$pairInfo['entity_id1']}");
-      $searchRows[$count]['dst_email'] = CRM_Utils_Array::value('dst_email', $pairInfo);
-      $searchRows[$count]['dst_street'] = CRM_Utils_Array::value('dst_street', $pairInfo);
-      $searchRows[$count]['dst_postcode'] = CRM_Utils_Array::value('dst_postcode', $pairInfo);
+      $searchRows[$count]['dst_email'] = $pairInfo['dst_email'] ?? NULL;
+      $searchRows[$count]['dst_street'] = $pairInfo['dst_street'] ?? NULL;
+      $searchRows[$count]['dst_postcode'] = $pairInfo['dst_postcode'] ?? NULL;
       $searchRows[$count]['conflicts'] = str_replace("',", "',<br/>", CRM_Utils_Array::value('conflicts', $pair));
-      $searchRows[$count]['weight'] = CRM_Utils_Array::value('weight', $pair);
+      $searchRows[$count]['weight'] = $pair['weight'] ?? NULL;
 
       if (!empty($pairInfo['data']['canMerge'])) {
         $mergeParams = [
@@ -769,7 +769,7 @@ LIMIT {$offset}, {$rowCount}
    */
   public static function getSearchOptionsFromRequest() {
     $searchParams = [];
-    $searchData = CRM_Utils_Array::value('search', $_REQUEST);
+    $searchData = $_REQUEST['search'] ?? NULL;
     $searchData['value'] = CRM_Utils_Type::escape($searchData['value'], 'String');
     $selectorElements = [
       'is_selected',
@@ -814,7 +814,7 @@ LIMIT {$offset}, {$rowCount}
    * @return bool
    */
   public static function isOrQuery() {
-    $searchData = CRM_Utils_Array::value('search', $_REQUEST);
+    $searchData = $_REQUEST['search'] ?? NULL;
     return !empty($searchData['value']);
   }
 
@@ -909,8 +909,8 @@ LIMIT {$offset}, {$rowCount}
    * Used to store selected contacts across multiple pages in advanced search.
    */
   public static function selectUnselectContacts() {
-    $name = CRM_Utils_Array::value('name', $_REQUEST);
-    $cacheKey = CRM_Utils_Array::value('qfKey', $_REQUEST);
+    $name = $_REQUEST['name'] ?? NULL;
+    $cacheKey = $_REQUEST['qfKey'] ?? NULL;
     $state = CRM_Utils_Array::value('state', $_REQUEST, 'checked');
     $variableType = CRM_Utils_Array::value('variableType', $_REQUEST, 'single');
 
diff --git a/civicrm/CRM/Contact/Page/Inline/CustomData.php b/civicrm/CRM/Contact/Page/Inline/CustomData.php
index cc31ea1aa9..a2ffabdfd7 100644
--- a/civicrm/CRM/Contact/Page/Inline/CustomData.php
+++ b/civicrm/CRM/Contact/Page/Inline/CustomData.php
@@ -44,7 +44,7 @@ class CRM_Contact_Page_Inline_CustomData extends CRM_Core_Page {
       $fields = reset($details[$cgId]);
     }
     else {
-      $fields = CRM_Utils_Array::value($customRecId, $details[$cgId]);
+      $fields = $details[$cgId][$customRecId] ?? NULL;
     }
     $this->assign('cgcount', $cgcount);
     $this->assign('customRecId', $customRecId);
diff --git a/civicrm/CRM/Contact/Page/View.php b/civicrm/CRM/Contact/Page/View.php
index 8b0ddf9348..faeb0cb8cf 100644
--- a/civicrm/CRM/Contact/Page/View.php
+++ b/civicrm/CRM/Contact/Page/View.php
@@ -119,7 +119,7 @@ class CRM_Contact_Page_View extends CRM_Core_Page {
         $found = TRUE;
       }
 
-      $context = CRM_Utils_Array::value('context', $_GET);
+      $context = $_GET['context'] ?? NULL;
       if (!$found) {
         // seems like we did not find any contacts
         // maybe due to bug CRM-9096
diff --git a/civicrm/CRM/Contact/Page/View/Vcard.php b/civicrm/CRM/Contact/Page/View/Vcard.php
index ac13a802fe..a730ddb18f 100644
--- a/civicrm/CRM/Contact/Page/View/Vcard.php
+++ b/civicrm/CRM/Contact/Page/View/Vcard.php
@@ -50,7 +50,7 @@ class CRM_Contact_Page_View_Vcard extends CRM_Contact_Page_View {
         CRM_Utils_Array::value('prefix', $defaults),
         CRM_Utils_Array::value('suffix', $defaults)
       );
-      $organizationName = CRM_Utils_Array::value('organization_name', $defaults);
+      $organizationName = $defaults['organization_name'] ?? NULL;
       if ($organizationName !== NULL) {
         $vcard->addOrganization($organizationName);
       }
@@ -87,15 +87,15 @@ class CRM_Contact_Page_View_Vcard extends CRM_Contact_Page_View {
       foreach ($defaults['address'] as $location) {
         // we don't keep PO boxes in separate fields
         $pob = '';
-        $extend = CRM_Utils_Array::value('supplemental_address_1', $location);
+        $extend = $location['supplemental_address_1'] ?? NULL;
         if (!empty($location['supplemental_address_2'])) {
           $extend .= ', ' . $location['supplemental_address_2'];
         }
         if (!empty($location['supplemental_address_3'])) {
           $extend .= ', ' . $location['supplemental_address_3'];
         }
-        $street = CRM_Utils_Array::value('street_address', $location);
-        $locality = CRM_Utils_Array::value('city', $location);
+        $street = $location['street_address'] ?? NULL;
+        $locality = $location['city'] ?? NULL;
         $region = NULL;
         if (!empty($location['state_province_id'])) {
           $region = $stateProvices[CRM_Utils_Array::value('state_province_id', $location)];
@@ -105,7 +105,7 @@ class CRM_Contact_Page_View_Vcard extends CRM_Contact_Page_View {
           $country = $countries[CRM_Utils_Array::value('country_id', $location)];
         }
 
-        $postcode = CRM_Utils_Array::value('postal_code', $location);
+        $postcode = $location['postal_code'] ?? NULL;
         if (!empty($location['postal_code_suffix'])) {
           $postcode .= '-' . $location['postal_code_suffix'];
         }
diff --git a/civicrm/CRM/Contact/Selector.php b/civicrm/CRM/Contact/Selector.php
index f9ddd8e954..f2fd42a7e2 100644
--- a/civicrm/CRM/Contact/Selector.php
+++ b/civicrm/CRM/Contact/Selector.php
@@ -179,7 +179,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
 
     $this->_searchContext = $searchContext;
 
-    $this->_ufGroupID = CRM_Utils_Array::value('uf_group_id', $this->_formValues);
+    $this->_ufGroupID = $this->_formValues['uf_group_id'] ?? NULL;
 
     if ($this->_ufGroupID) {
       $this->_fields = CRM_Core_BAO_UFGroup::getListingFields(CRM_Core_Action::VIEW,
@@ -204,7 +204,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
       }
     }
 
-    $displayRelationshipType = CRM_Utils_Array::value('display_relationship_type', $this->_formValues);
+    $displayRelationshipType = $this->_formValues['display_relationship_type'] ?? NULL;
     $operator = CRM_Utils_Array::value('operator', $this->_formValues, 'AND');
 
     // rectify params to what proximity search expects if there is a value for prox_distance
@@ -308,7 +308,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
             'qs' => $qs,
             'title' => $value['title'],
             'ref' => $value['ref'],
-            'class' => CRM_Utils_Array::value('class', $value),
+            'class' => $value['class'] ?? NULL,
           ];
         }
       }
@@ -612,7 +612,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
               $locationTypeName = "website-{$id}";
             }
             else {
-              $locationTypeName = CRM_Utils_Array::value($id, $locationTypes);
+              $locationTypeName = $locationTypes[$id] ?? NULL;
               if (!$locationTypeName) {
                 continue;
               }
@@ -653,7 +653,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
     $links = self::links($this->_context, $this->_contextMenu, $this->_key);
 
     //check explicitly added contact to a Smart Group.
-    $groupID = CRM_Utils_Array::value('group', $this->_formValues);
+    $groupID = $this->_formValues['group'] ?? NULL;
 
     $pseudoconstants = [];
     // for CRM-3157 purposes
@@ -719,13 +719,13 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
           list($locType) = explode("-email", $property);
           $onholdProperty = "{$locType}-on_hold";
 
-          $row[$property] = isset($result->$property) ? $result->$property : NULL;
+          $row[$property] = $result->$property ?? NULL;
           if (!empty($row[$property]) && !empty($result->$onholdProperty)) {
             $row[$property] .= " (On Hold)";
           }
         }
         else {
-          $row[$property] = isset($result->$property) ? $result->$property : NULL;
+          $row[$property] = $result->$property ?? NULL;
         }
       }
 
diff --git a/civicrm/CRM/Contact/Selector/Custom.php b/civicrm/CRM/Contact/Selector/Custom.php
index 1cc1d71bee..b5ea5468bb 100644
--- a/civicrm/CRM/Contact/Selector/Custom.php
+++ b/civicrm/CRM/Contact/Selector/Custom.php
@@ -329,7 +329,7 @@ class CRM_Contact_Selector_Custom extends CRM_Contact_Selector {
         }
       }
       if (!$empty) {
-        $contactID = isset($dao->contact_id) ? $dao->contact_id : NULL;
+        $contactID = $dao->contact_id ?? NULL;
 
         $row['checkbox'] = CRM_Core_Form::CB_PREFIX . $contactID;
         $row['action'] = CRM_Core_Action::formLink($links,
diff --git a/civicrm/CRM/Contact/StateMachine/Search.php b/civicrm/CRM/Contact/StateMachine/Search.php
index c2d7bea1f1..83c60dea7d 100644
--- a/civicrm/CRM/Contact/StateMachine/Search.php
+++ b/civicrm/CRM/Contact/StateMachine/Search.php
@@ -81,7 +81,7 @@ class CRM_Contact_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Contact/Task.php b/civicrm/CRM/Contact/Task.php
index edc579a5c1..e4cac5e862 100644
--- a/civicrm/CRM/Contact/Task.php
+++ b/civicrm/CRM/Contact/Task.php
@@ -311,7 +311,7 @@ class CRM_Contact_Task extends CRM_Core_Task {
   public static function getTask($value) {
     self::tasks();
 
-    if (!CRM_Utils_Array::value($value, self::$_tasks)) {
+    if (empty(self::$_tasks[$value])) {
       // make it the print task by default
       $value = self::TASK_PRINT;
     }
diff --git a/civicrm/CRM/Contribute/BAO/Contribution.php b/civicrm/CRM/Contribute/BAO/Contribution.php
index 3f2ca58df0..e98ee415c0 100644
--- a/civicrm/CRM/Contribute/BAO/Contribution.php
+++ b/civicrm/CRM/Contribute/BAO/Contribution.php
@@ -103,30 +103,6 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
       throw new CRM_Core_Exception($message);
     }
 
-    // first clean up all the money fields
-    $moneyFields = [
-      'total_amount',
-      'net_amount',
-      'fee_amount',
-      'non_deductible_amount',
-    ];
-
-    //if priceset is used, no need to cleanup money
-    if (!empty($params['skipCleanMoney'])) {
-      $moneyFields = [];
-    }
-    else {
-      // @todo put a deprecated here - this should be done in the form layer.
-      $params['skipCleanMoney'] = FALSE;
-      Civi::log()->warning('Deprecated code path. Money should always be clean before it hits the BAO.', array('civi.tag' => 'deprecated'));
-    }
-
-    foreach ($moneyFields as $field) {
-      if (isset($params[$field])) {
-        $params[$field] = CRM_Utils_Rule::cleanMoney($params[$field]);
-      }
-    }
-
     //set defaults in create mode
     if (!$contributionID) {
       CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
@@ -215,8 +191,8 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
     $result = $contribution->save();
 
     // Add financial_trxn details as part of fix for CRM-4724
-    $contribution->trxn_result_code = CRM_Utils_Array::value('trxn_result_code', $params);
-    $contribution->payment_processor = CRM_Utils_Array::value('payment_processor', $params);
+    $contribution->trxn_result_code = $params['trxn_result_code'] ?? NULL;
+    $contribution->payment_processor = $params['payment_processor'] ?? NULL;
 
     //add Account details
     $params['contribution'] = $contribution;
@@ -417,13 +393,13 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
     $addressParams['location_type_id'] = $billingLocationTypeID;
     $addressParams['is_billing'] = 1;
 
-    $billingFirstName = CRM_Utils_Array::value('billing_first_name', $params);
-    $billingMiddleName = CRM_Utils_Array::value('billing_middle_name', $params);
-    $billingLastName = CRM_Utils_Array::value('billing_last_name', $params);
+    $billingFirstName = $params['billing_first_name'] ?? NULL;
+    $billingMiddleName = $params['billing_middle_name'] ?? NULL;
+    $billingLastName = $params['billing_last_name'] ?? NULL;
     $addressParams['address_name'] = "{$billingFirstName}" . CRM_Core_DAO::VALUE_SEPARATOR . "{$billingMiddleName}" . CRM_Core_DAO::VALUE_SEPARATOR . "{$billingLastName}";
 
     foreach ($billingFields as $value) {
-      $addressParams[$value] = CRM_Utils_Array::value("billing_{$value}-{$billingLocationTypeID}", $params);
+      $addressParams[$value] = $params["billing_{$value}-{$billingLocationTypeID}"] ?? NULL;
       if (!empty($addressParams[$value])) {
         $hasBillingField = TRUE;
       }
@@ -1102,7 +1078,7 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
     elseif (($previousContributionStatus == 'Pending'
         && $params['prevContribution']->is_pay_later) || $previousContributionStatus == 'In Progress'
     ) {
-      $financialTypeID = CRM_Utils_Array::value('financial_type_id', $params) ? $params['financial_type_id'] : $params['prevContribution']->financial_type_id;
+      $financialTypeID = !empty($params['financial_type_id']) ? $params['financial_type_id'] : $params['prevContribution']->financial_type_id;
       $arAccountId = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($financialTypeID, 'Accounts Receivable Account is');
 
       if ($currentContributionStatus == 'Cancelled') {
@@ -1235,7 +1211,7 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
         'contact_id' => $params['prevContribution']->contact_id,
         'currency' => $currency,
         'amount' => self::getFinancialItemAmountFromParams($inputParams, $context, $lineItemDetails, $isARefund, $previousLineItemTotal),
-        'description' => CRM_Utils_Array::value('description', $prevFinancialItem),
+        'description' => $prevFinancialItem['description'] ?? NULL,
         'status_id' => $prevFinancialItem['status_id'],
         'financial_account_id' => $financialAccount,
         'entity_table' => 'civicrm_line_item',
@@ -1587,10 +1563,10 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = c.contact_id )
    */
   public static function checkDuplicate($input, &$duplicates, $id = NULL) {
     if (!$id) {
-      $id = CRM_Utils_Array::value('id', $input);
+      $id = $input['id'] ?? NULL;
     }
-    $trxn_id = CRM_Utils_Array::value('trxn_id', $input);
-    $invoice_id = CRM_Utils_Array::value('invoice_id', $input);
+    $trxn_id = $input['trxn_id'] ?? NULL;
+    $invoice_id = $input['invoice_id'] ?? NULL;
 
     $clause = [];
     $input = [];
@@ -2088,14 +2064,14 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
    */
   public static function transitionComponents($params, $processContributionObject = FALSE) {
     // get minimum required values.
-    $contactId = CRM_Utils_Array::value('contact_id', $params);
-    $componentId = CRM_Utils_Array::value('component_id', $params);
-    $componentName = CRM_Utils_Array::value('componentName', $params);
-    $contributionId = CRM_Utils_Array::value('contribution_id', $params);
-    $contributionStatusId = CRM_Utils_Array::value('contribution_status_id', $params);
+    $contactId = $params['contact_id'] ?? NULL;
+    $componentId = $params['component_id'] ?? NULL;
+    $componentName = $params['componentName'] ?? NULL;
+    $contributionId = $params['contribution_id'] ?? NULL;
+    $contributionStatusId = $params['contribution_status_id'] ?? NULL;
 
     // if we already processed contribution object pass previous status id.
-    $previousContriStatusId = CRM_Utils_Array::value('previous_contribution_status_id', $params);
+    $previousContriStatusId = $params['previous_contribution_status_id'] ?? NULL;
 
     $updateResult = [];
 
@@ -2146,13 +2122,13 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
 
     $input = $ids = $objects = [];
 
-    $input['component'] = CRM_Utils_Array::value('component', $componentDetails);
+    $input['component'] = $componentDetails['component'] ?? NULL;
     $ids['contribution'] = $contributionId;
-    $ids['contact'] = CRM_Utils_Array::value('contact_id', $componentDetails);
-    $ids['membership'] = CRM_Utils_Array::value('membership', $componentDetails);
-    $ids['participant'] = CRM_Utils_Array::value('participant', $componentDetails);
-    $ids['event'] = CRM_Utils_Array::value('event', $componentDetails);
-    $ids['pledge_payment'] = CRM_Utils_Array::value('pledge_payment', $componentDetails);
+    $ids['contact'] = $componentDetails['contact_id'] ?? NULL;
+    $ids['membership'] = $componentDetails['membership'] ?? NULL;
+    $ids['participant'] = $componentDetails['participant'] ?? NULL;
+    $ids['event'] = $componentDetails['event'] ?? NULL;
+    $ids['pledge_payment'] = $componentDetails['pledge_payment'] ?? NULL;
     $ids['contributionRecur'] = NULL;
     $ids['contributionPage'] = NULL;
 
@@ -2290,7 +2266,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
             $lineitems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contributionId);
             foreach ($lineitems as $lineitem) {
               if ($membership->membership_type_id == CRM_Utils_Array::value('membership_type_id', $lineitem)) {
-                $numterms = CRM_Utils_Array::value('membership_num_terms', $lineitem);
+                $numterms = $lineitem['membership_num_terms'] ?? NULL;
 
                 // in case membership_num_terms comes through as null or zero
                 $numterms = $numterms >= 1 ? $numterms : 1;
@@ -2948,7 +2924,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     $this->loadRelatedObjects($input, $ids);
 
     if (empty($this->_component)) {
-      $this->_component = CRM_Utils_Array::value('component', $input);
+      $this->_component = $input['component'] ?? NULL;
     }
 
     //not really sure what params might be passed in but lets merge em into values
@@ -3208,7 +3184,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         $groupLabel = $group['title'];
         if (!empty($customField['customValue'])) {
           foreach ($customField['customValue'] as $customFieldValues) {
-            $customGroup[$groupLabel][$customField['label']] = CRM_Utils_Array::value('data', $customFieldValues);
+            $customGroup[$groupLabel][$customField['label']] = $customFieldValues['data'] ?? NULL;
           }
         }
       }
@@ -3579,15 +3555,15 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         $balanceTrxnParams['to_financial_account_id'] = $toFinancialAccount;
         $balanceTrxnParams['contribution_id'] = $params['contribution']->id;
         $balanceTrxnParams['trxn_date'] = !empty($params['contribution']->receive_date) ? $params['contribution']->receive_date : date('YmdHis');
-        $balanceTrxnParams['fee_amount'] = CRM_Utils_Array::value('fee_amount', $params);
-        $balanceTrxnParams['net_amount'] = CRM_Utils_Array::value('net_amount', $params);
+        $balanceTrxnParams['fee_amount'] = $params['fee_amount'] ?? NULL;
+        $balanceTrxnParams['net_amount'] = $params['net_amount'] ?? NULL;
         $balanceTrxnParams['currency'] = $params['contribution']->currency;
         $balanceTrxnParams['trxn_id'] = $params['contribution']->trxn_id;
         $balanceTrxnParams['status_id'] = $statusId;
         $balanceTrxnParams['payment_instrument_id'] = $params['contribution']->payment_instrument_id;
-        $balanceTrxnParams['check_number'] = CRM_Utils_Array::value('check_number', $params);
-        $balanceTrxnParams['pan_truncation'] = CRM_Utils_Array::value('pan_truncation', $params);
-        $balanceTrxnParams['card_type_id'] = CRM_Utils_Array::value('card_type_id', $params);
+        $balanceTrxnParams['check_number'] = $params['check_number'] ?? NULL;
+        $balanceTrxnParams['pan_truncation'] = $params['pan_truncation'] ?? NULL;
+        $balanceTrxnParams['card_type_id'] = $params['card_type_id'] ?? NULL;
         if (!empty($balanceTrxnParams['from_financial_account_id']) &&
           ($statusId == array_search('Completed', $contributionStatuses) || $statusId == array_search('Partially paid', $contributionStatuses))
         ) {
@@ -3635,7 +3611,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         $params['to_financial_account_id'] = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_financial_account WHERE is_default = 1 AND financial_account_type_id = %1", $queryParams);
       }
 
-      $totalAmount = CRM_Utils_Array::value('total_amount', $params);
+      $totalAmount = $params['total_amount'] ?? NULL;
       if (!isset($totalAmount) && !empty($params['prevContribution'])) {
         $totalAmount = $params['total_amount'] = $params['prevContribution']->total_amount;
       }
@@ -3645,7 +3621,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         'to_financial_account_id' => $params['to_financial_account_id'],
         'trxn_date' => !empty($params['contribution']->receive_date) ? $params['contribution']->receive_date : date('YmdHis'),
         'total_amount' => $totalAmount,
-        'fee_amount' => CRM_Utils_Array::value('fee_amount', $params),
+        'fee_amount' => $params['fee_amount'] ?? NULL,
         'net_amount' => CRM_Utils_Array::value('net_amount', $params, $totalAmount),
         'currency' => $params['contribution']->currency,
         'trxn_id' => $params['contribution']->trxn_id,
@@ -3654,9 +3630,9 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         // this should really default to completed (after discussion).
         'status_id' => $statusId,
         'payment_instrument_id' => CRM_Utils_Array::value('payment_instrument_id', $params, $params['contribution']->payment_instrument_id),
-        'check_number' => CRM_Utils_Array::value('check_number', $params),
-        'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $params),
-        'card_type_id' => CRM_Utils_Array::value('card_type_id', $params),
+        'check_number' => $params['check_number'] ?? NULL,
+        'pan_truncation' => $params['pan_truncation'] ?? NULL,
+        'card_type_id' => $params['card_type_id'] ?? NULL,
       ];
       if ($contributionStatus == 'Refunded' || $contributionStatus == 'Chargeback' || $contributionStatus == 'Cancelled') {
         $trxnParams['trxn_date'] = !empty($params['contribution']->cancel_date) ? $params['contribution']->cancel_date : date('YmdHis');
@@ -3777,15 +3753,15 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
           $params['contribution']->find(TRUE);
         }
         $params['trxnParams']['payment_instrument_id'] = $params['contribution']->payment_instrument_id;
-        $params['trxnParams']['check_number'] = CRM_Utils_Array::value('check_number', $params);
+        $params['trxnParams']['check_number'] = $params['check_number'] ?? NULL;
 
         if (self::isPaymentInstrumentChange($params, $pendingStatus)) {
           $updated = CRM_Core_BAO_FinancialTrxn::updateFinancialAccountsOnPaymentInstrumentChange($params);
         }
 
         //if Change contribution amount
-        $params['trxnParams']['fee_amount'] = CRM_Utils_Array::value('fee_amount', $params);
-        $params['trxnParams']['net_amount'] = CRM_Utils_Array::value('net_amount', $params);
+        $params['trxnParams']['fee_amount'] = $params['fee_amount'] ?? NULL;
+        $params['trxnParams']['net_amount'] = $params['net_amount'] ?? NULL;
         $params['trxnParams']['total_amount'] = $trxnParams['total_amount'] = $params['total_amount'] = $totalAmount;
         $params['trxnParams']['trxn_id'] = $params['contribution']->trxn_id;
         if (isset($totalAmount) &&
@@ -3814,8 +3790,8 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
               ]);
             }
           }
-          $cardType = CRM_Utils_Array::value('card_type_id', $params);
-          $panTruncation = CRM_Utils_Array::value('pan_truncation', $params);
+          $cardType = $params['card_type_id'] ?? NULL;
+          $panTruncation = $params['pan_truncation'] ?? NULL;
           CRM_Core_BAO_FinancialTrxn::updateCreditCardDetails($params['contribution']->id, $panTruncation, $cardType);
         }
       }
@@ -3824,8 +3800,8 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         // records finanical trxn and entity financial trxn
         // also make it available as return value
         self::recordAlwaysAccountsReceivable($trxnParams, $params);
-        $trxnParams['pan_truncation'] = CRM_Utils_Array::value('pan_truncation', $params);
-        $trxnParams['card_type_id'] = CRM_Utils_Array::value('card_type_id', $params);
+        $trxnParams['pan_truncation'] = $params['pan_truncation'] ?? NULL;
+        $trxnParams['card_type_id'] = $params['card_type_id'] ?? NULL;
         $return = $financialTxn = CRM_Core_BAO_FinancialTrxn::create($trxnParams);
         $params['entity_id'] = $financialTxn->id;
         if (empty($params['partial_payment_total']) && empty($params['partial_amount_to_pay'])) {
@@ -4087,13 +4063,15 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    * Get list of payments displayed by Contribute_Page_PaymentInfo.
    *
    * @param int $id
-   * @param $component
+   * @param string $component
    * @param bool $getTrxnInfo
-   * @param bool $usingLineTotal
    *
    * @return mixed
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
-  public static function getPaymentInfo($id, $component = 'contribution', $getTrxnInfo = FALSE, $usingLineTotal = FALSE) {
+  public static function getPaymentInfo($id, $component = 'contribution', $getTrxnInfo = FALSE) {
     // @todo deprecate passing in component - always call with contribution.
     if ($component == 'event') {
       $contributionId = CRM_Core_DAO::getFieldValue('CRM_Event_BAO_ParticipantPayment', $id, 'contribution_id', 'participant_id');
@@ -4115,19 +4093,15 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       $contributionId = $id;
     }
 
-    $total = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId);
-    $baseTrxnId = !empty($total['trxn_id']) ? $total['trxn_id'] : NULL;
+    // The balance used to be calculated this way - we really want to remove this 'oldCalculation'
+    // but need to unpick the whole trxn_id it's returning first.
+    $oldCalculation = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId);
+    $baseTrxnId = !empty($oldCalculation['trxn_id']) ? $oldCalculation['trxn_id'] : NULL;
     if (!$baseTrxnId) {
       $baseTrxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contributionId);
       $baseTrxnId = $baseTrxnId['financialTrxnId'];
     }
-    if (empty($total['total_amount']) || $usingLineTotal) {
-      $total = CRM_Price_BAO_LineItem::getLineTotal($contributionId);
-    }
-    else {
-      $baseTrxnId = $total['trxn_id'];
-      $total = $total['total_amount'];
-    }
+    $total = CRM_Price_BAO_LineItem::getLineTotal($contributionId);
 
     $paymentBalance = CRM_Contribute_BAO_Contribution::getContributionBalance($contributionId, $total);
 
@@ -4440,7 +4414,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    * @throws \CiviCRM_API3_Exception
    */
   public static function completeOrder($input, &$ids, $objects, $transaction, $contribution, $isPostPaymentCreate = FALSE) {
-    $primaryContributionID = isset($contribution->id) ? $contribution->id : $objects['first_contribution']->id;
+    $primaryContributionID = $contribution->id ?? $objects['first_contribution']->id;
     // The previous details are used when calculating line items so keep it before any code that 'does something'
     if (!empty($contribution->id)) {
       $input['prevContribution'] = CRM_Contribute_BAO_Contribution::getValues(['id' => $contribution->id]);
@@ -4463,10 +4437,10 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       $inputContributionWhiteList[] = 'financial_type_id';
     }
 
-    $participant = CRM_Utils_Array::value('participant', $objects);
-    $recurContrib = CRM_Utils_Array::value('contributionRecur', $objects);
+    $participant = $objects['participant'] ?? NULL;
+    $recurContrib = $objects['contributionRecur'] ?? NULL;
     $recurringContributionID = (empty($recurContrib->id)) ? NULL : $recurContrib->id;
-    $event = CRM_Utils_Array::value('event', $objects);
+    $event = $objects['event'] ?? NULL;
 
     $paymentProcessorId = '';
     if (isset($objects['paymentProcessor'])) {
@@ -4579,7 +4553,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       // @fixme Can we remove this if altogether? - we removed the participant if / else and left relatedObjects['participant'] to ensure behaviour didn't change but it is probably not required.
       // @todo - use getRelatedMemberships instead
       $contribution->contribution_status_id = $contributionParams['contribution_status_id'];
-      $contribution->trxn_id = CRM_Utils_Array::value('trxn_id', $input);
+      $contribution->trxn_id = $input['trxn_id'] ?? NULL;
       $contribution->receive_date = CRM_Utils_Date::isoToMysql($contribution->receive_date);
     }
 
@@ -4764,13 +4738,13 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     $balanceTrxnParams['total_amount'] = $params['total_amount'];
     $balanceTrxnParams['contribution_id'] = $params['contribution_id'];
     $balanceTrxnParams['trxn_date'] = CRM_Utils_Array::value('trxn_date', $params, CRM_Utils_Array::value('contribution_receive_date', $params, date('YmdHis')));
-    $balanceTrxnParams['fee_amount'] = CRM_Utils_Array::value('fee_amount', $params);
-    $balanceTrxnParams['net_amount'] = CRM_Utils_Array::value('total_amount', $params);
+    $balanceTrxnParams['fee_amount'] = $params['fee_amount'] ?? NULL;
+    $balanceTrxnParams['net_amount'] = $params['total_amount'] ?? NULL;
     $balanceTrxnParams['currency'] = $contribution['currency'];
-    $balanceTrxnParams['trxn_id'] = CRM_Utils_Array::value('contribution_trxn_id', $params, NULL);
+    $balanceTrxnParams['trxn_id'] = $params['contribution_trxn_id'] ?? NULL;
     $balanceTrxnParams['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_FinancialTrxn', 'status_id', 'Completed');
     $balanceTrxnParams['payment_instrument_id'] = CRM_Utils_Array::value('payment_instrument_id', $params, $contribution['payment_instrument_id']);
-    $balanceTrxnParams['check_number'] = CRM_Utils_Array::value('check_number', $params);
+    $balanceTrxnParams['check_number'] = $params['check_number'] ?? NULL;
     $balanceTrxnParams['is_payment'] = 1;
 
     if (!empty($params['payment_processor'])) {
@@ -4846,7 +4820,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    * @throws \API_Exception
    */
   public static function checkLineItems(&$params) {
-    $totalAmount = CRM_Utils_Array::value('total_amount', $params);
+    $totalAmount = $params['total_amount'] ?? NULL;
     $lineItemAmount = 0;
 
     foreach ($params['line_items'] as &$lineItems) {
@@ -5008,7 +4982,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    */
   public static function checkContributeSettings($name) {
     $contributeSettings = Civi::settings()->get('contribution_invoice_settings');
-    return CRM_Utils_Array::value($name, $contributeSettings);
+    return $contributeSettings[$name] ?? NULL;
   }
 
   /**
@@ -5365,33 +5339,41 @@ LIMIT 1;";
       return [];
     }
     $actionLinks = [];
+    $actionLinks[] = [
+      'url' => CRM_Utils_System::url('civicrm/payment', [
+        'action' => 'add',
+        'reset' => 1,
+        'id' => $id,
+        'is_refund' => 0,
+      ]),
+      'title' => ts('Record Payment'),
+    ];
+
     if ((int) $balance > 0) {
+      // @todo - this should be possible even if not > 0 - test & remove this if.
+      // it is possible to 'overpay' in the real world & we honor that.
       if (CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
         $actionLinks[] = [
           'url' => CRM_Utils_System::url('civicrm/payment', [
             'action' => 'add',
             'reset' => 1,
+            'is_refund' => 0,
             'id' => $id,
             'mode' => 'live',
           ]),
           'title' => ts('Submit Credit Card payment'),
         ];
       }
-      $actionLinks[] = [
-        'url' => CRM_Utils_System::url('civicrm/payment', [
-          'action' => 'add',
-          'reset' => 1,
-          'id' => $id,
-        ]),
-        'title' => ts('Record Payment'),
-      ];
     }
     elseif ((int) $balance < 0) {
+      // @todo - in the future remove this IF - OK to refund money even when not due since
+      // ... life.
       $actionLinks[] = [
         'url' => CRM_Utils_System::url('civicrm/payment', [
           'action' => 'add',
           'reset' => 1,
           'id' => $id,
+          'is_refund' => 1,
         ]),
         'title' => ts('Record Refund'),
       ];
@@ -5557,7 +5539,7 @@ LIMIT 1;";
     }
 
     $params = $trxnParams;
-    $financialTypeID = CRM_Utils_Array::value('financial_type_id', $contributionParams) ? $contributionParams['financial_type_id'] : $contributionParams['prevContribution']->financial_type_id;
+    $financialTypeID = !empty($contributionParams['financial_type_id']) ? $contributionParams['financial_type_id'] : $contributionParams['prevContribution']->financial_type_id;
     $arAccountId = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($financialTypeID, 'Accounts Receivable Account is');
     $params['to_financial_account_id'] = $arAccountId;
     $params['status_id'] = array_search('Pending', $contributionStatuses);
@@ -5861,7 +5843,7 @@ LIMIT 1;";
         $groupLabel = $group['title'];
         if (!empty($customField['customValue'])) {
           foreach ($customField['customValue'] as $customFieldValues) {
-            $eventCustomGroup[$groupLabel][$customField['label']] = CRM_Utils_Array::value('data', $customFieldValues);
+            $eventCustomGroup[$groupLabel][$customField['label']] = $customFieldValues['data'] ?? NULL;
           }
         }
       }
@@ -5888,7 +5870,7 @@ LIMIT 1;";
         $groupLabel = $group['title'];
         if (!empty($customField['customValue'])) {
           foreach ($customField['customValue'] as $customFieldValues) {
-            $participantCustomGroup[$groupLabel][$customField['label']] = CRM_Utils_Array::value('data', $customFieldValues);
+            $participantCustomGroup[$groupLabel][$customField['label']] = $customFieldValues['data'] ?? NULL;
           }
         }
       }
diff --git a/civicrm/CRM/Contribute/BAO/Contribution/Utils.php b/civicrm/CRM/Contribute/BAO/Contribution/Utils.php
index 5e3b948828..cbdd33d080 100644
--- a/civicrm/CRM/Contribute/BAO/Contribution/Utils.php
+++ b/civicrm/CRM/Contribute/BAO/Contribution/Utils.php
@@ -85,7 +85,7 @@ class CRM_Contribute_BAO_Contribution_Utils {
 
     if ($isPaymentTransaction) {
       $contributionParams = [
-        'id' => CRM_Utils_Array::value('contribution_id', $paymentParams),
+        'id' => $paymentParams['contribution_id'] ?? NULL,
         'contact_id' => $contactID,
         'is_test' => $isTest,
         'source' => CRM_Utils_Array::value('source', $paymentParams, CRM_Utils_Array::value('description', $paymentParams)),
@@ -146,7 +146,7 @@ class CRM_Contribute_BAO_Contribution_Utils {
         $paymentParams['source'] = $paymentParams['contribution_source'];
       }
 
-      if (CRM_Utils_Array::value('is_recur', $form->_params) && $contribution->contribution_recur_id) {
+      if (!empty($form->_params['is_recur']) && $contribution->contribution_recur_id) {
         $paymentParams['contributionRecurID'] = $contribution->contribution_recur_id;
       }
       if (isset($paymentParams['contribution_source'])) {
@@ -237,7 +237,7 @@ class CRM_Contribute_BAO_Contribution_Utils {
    * @return bool
    */
   protected static function isPaymentTransaction($form) {
-    return ($form->_amount >= 0.0) ? TRUE : FALSE;
+    return $form->_amount >= 0.0;
   }
 
   /**
@@ -574,7 +574,7 @@ LIMIT 1
     }
     else {
       $contributionStatus = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $id, 'contribution_status_id');
-      $name = CRM_Utils_Array::value($contributionStatus, $statusNames);
+      $name = $statusNames[$contributionStatus] ?? NULL;
       switch ($name) {
         case 'Completed':
           // [CRM-17498] Removing unsupported status change options.
diff --git a/civicrm/CRM/Contribute/BAO/ContributionPage.php b/civicrm/CRM/Contribute/BAO/ContributionPage.php
index 43cbb90546..32e8555bcd 100644
--- a/civicrm/CRM/Contribute/BAO/ContributionPage.php
+++ b/civicrm/CRM/Contribute/BAO/ContributionPage.php
@@ -314,7 +314,7 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
           $preProfileTypes = CRM_Core_BAO_UFGroup::profileGroups($preID);
           if (in_array('Individual', $preProfileTypes) || in_array('Contact', $preProfileTypes)) {
             //Take Individual contact ID
-            $userID = CRM_Utils_Array::value('related_contact', $values);
+            $userID = $values['related_contact'] ?? NULL;
           }
         }
         list($values['customPre_grouptitle'], $values['customPre']) = self::getProfileNameAndFields($preID, $userID, $params['custom_pre_id']);
@@ -325,7 +325,7 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
           $postProfileTypes = CRM_Core_BAO_UFGroup::profileGroups($postID);
           if (in_array('Individual', $postProfileTypes) || in_array('Contact', $postProfileTypes)) {
             //Take Individual contact ID
-            $userID = CRM_Utils_Array::value('related_contact', $values);
+            $userID = $values['related_contact'] ?? NULL;
           }
         }
         list($values['customPost_grouptitle'], $values['customPost']) = self::getProfileNameAndFields($postID, $userID, $params['custom_post_id']);
@@ -340,24 +340,24 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
         );
       }
 
-      $title = isset($values['title']) ? $values['title'] : CRM_Contribute_BAO_Contribution_Utils::getContributionPageTitle($values['contribution_page_id']);
+      $title = $values['title'] ?? CRM_Contribute_BAO_Contribution_Utils::getContributionPageTitle($values['contribution_page_id']);
 
       // Set email variables explicitly to avoid leaky smarty variables.
       // All of these will be assigned to the template, replacing any that might be assigned elsewhere.
       $tplParams = [
         'email' => $email,
-        'receiptFromEmail' => CRM_Utils_Array::value('receipt_from_email', $values),
+        'receiptFromEmail' => $values['receipt_from_email'] ?? NULL,
         'contactID' => $contactID,
         'displayName' => $displayName,
-        'contributionID' => CRM_Utils_Array::value('contribution_id', $values),
-        'contributionOtherID' => CRM_Utils_Array::value('contribution_other_id', $values),
+        'contributionID' => $values['contribution_id'] ?? NULL,
+        'contributionOtherID' => $values['contribution_other_id'] ?? NULL,
         // CRM-5095
-        'lineItem' => CRM_Utils_Array::value('lineItem', $values),
+        'lineItem' => $values['lineItem'] ?? NULL,
         // CRM-5095
-        'priceSetID' => CRM_Utils_Array::value('priceSetID', $values),
+        'priceSetID' => $values['priceSetID'] ?? NULL,
         'title' => $title,
-        'isShare' => CRM_Utils_Array::value('is_share', $values),
-        'thankyou_title' => CRM_Utils_Array::value('thankyou_title', $values),
+        'isShare' => $values['is_share'] ?? NULL,
+        'thankyou_title' => $values['thankyou_title'] ?? NULL,
         'customPre' => $values['customPre'],
         'customPre_grouptitle' => $values['customPre_grouptitle'],
         'customPost' => $values['customPost'],
@@ -367,9 +367,9 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
         'amount' => $values['amount'],
         'is_pay_later' => $values['is_pay_later'],
         'receipt_date' => !$values['receipt_date'] ? NULL : date('YmdHis', strtotime($values['receipt_date'])),
-        'pay_later_receipt' => CRM_Utils_Array::value('pay_later_receipt', $values),
-        'honor_block_is_active' => CRM_Utils_Array::value('honor_block_is_active', $values),
-        'contributionStatus' => CRM_Utils_Array::value('contribution_status', $values),
+        'pay_later_receipt' => $values['pay_later_receipt'] ?? NULL,
+        'honor_block_is_active' => $values['honor_block_is_active'] ?? NULL,
+        'contributionStatus' => $values['contribution_status'] ?? NULL,
       ];
 
       if ($contributionTypeId = CRM_Utils_Array::value('financial_type_id', $values)) {
@@ -391,7 +391,7 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
       }
 
       // CRM-6976
-      $originalCCReceipt = CRM_Utils_Array::value('cc_receipt', $values);
+      $originalCCReceipt = $values['cc_receipt'] ?? NULL;
 
       // cc to related contacts of contributor OR the one who
       // signs up. Is used for cases like - on behalf of
@@ -442,14 +442,14 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
         $sendTemplateParams['from'] = CRM_Utils_Array::value('receipt_from_name', $values) . ' <' . $values['receipt_from_email'] . '>';
         $sendTemplateParams['toName'] = $displayName;
         $sendTemplateParams['toEmail'] = $email;
-        $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc_receipt', $values);
-        $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc_receipt', $values);
+        $sendTemplateParams['cc'] = $values['cc_receipt'] ?? NULL;
+        $sendTemplateParams['bcc'] = $values['bcc_receipt'] ?? NULL;
         //send email with pdf invoice
         $template = CRM_Core_Smarty::singleton();
         $taxAmt = $template->get_template_vars('dataArray');
-        $prefixValue = Civi::settings()->get('contribution_invoice_settings');
-        $invoicing = CRM_Utils_Array::value('invoicing', $prefixValue);
-        if (isset($invoicing) && isset($prefixValue['is_email_pdf'])) {
+        $isEmailPDF = Civi::settings()->get('invoice_is_email_pdf');
+        $invoicing = Civi::settings()->get('invoicing');
+        if ($invoicing && !empty($isEmailPDF)) {
           $sendTemplateParams['isEmailPdf'] = TRUE;
           $sendTemplateParams['contributionId'] = $values['contribution_id'];
         }
@@ -461,8 +461,8 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
         $sendTemplateParams['groupName'] = 'msg_tpl_workflow_contribution';
         $sendTemplateParams['valueName'] = 'contribution_dupalert';
         $sendTemplateParams['from'] = ts('Automatically Generated') . " <{$values['receipt_from_email']}>";
-        $sendTemplateParams['toName'] = CRM_Utils_Array::value('receipt_from_name', $values);
-        $sendTemplateParams['toEmail'] = CRM_Utils_Array::value('receipt_from_email', $values);
+        $sendTemplateParams['toName'] = $values['receipt_from_name'] ?? NULL;
+        $sendTemplateParams['toEmail'] = $values['receipt_from_email'] ?? NULL;
         $sendTemplateParams['tplParams']['onBehalfID'] = $contactID;
         $sendTemplateParams['tplParams']['receiptMessage'] = $message;
 
@@ -539,7 +539,7 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
         'cc_receipt',
         'bcc_receipt',
       ]);
-      $isEmailReceipt = CRM_Utils_Array::value('is_email_receipt', $value[$pageID]);
+      $isEmailReceipt = $value[$pageID]['is_email_receipt'] ?? NULL;
     }
     elseif ($recur->id) {
       // This means we are coming from back-office - ie. no page ID, but recurring.
@@ -585,8 +585,8 @@ class CRM_Contribute_BAO_ContributionPage extends CRM_Contribute_DAO_Contributio
       ];
       //CRM-13811
       if ($pageID) {
-        $templatesParams['cc'] = CRM_Utils_Array::value('cc_receipt', $value[$pageID]);
-        $templatesParams['bcc'] = CRM_Utils_Array::value('bcc_receipt', $value[$pageID]);
+        $templatesParams['cc'] = $value[$pageID]['cc_receipt'] ?? NULL;
+        $templatesParams['bcc'] = $value[$pageID]['bcc_receipt'] ?? NULL;
       }
       if ($recur->id) {
         // in some cases its just recurringNotify() thats called for the first time and these urls don't get set.
diff --git a/civicrm/CRM/Contribute/BAO/ContributionRecur.php b/civicrm/CRM/Contribute/BAO/ContributionRecur.php
index 2b385a3414..1bf45bdcdc 100644
--- a/civicrm/CRM/Contribute/BAO/ContributionRecur.php
+++ b/civicrm/CRM/Contribute/BAO/ContributionRecur.php
@@ -66,7 +66,7 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
 
     $recurring = new CRM_Contribute_BAO_ContributionRecur();
     $recurring->copyValues($params);
-    $recurring->id = CRM_Utils_Array::value('id', $params);
+    $recurring->id = $params['id'] ?? NULL;
 
     // set currency for CRM-1496
     if (empty($params['id']) && !isset($recurring->currency)) {
@@ -103,9 +103,9 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
    *   true if duplicate, false otherwise
    */
   public static function checkDuplicate($params, &$duplicates) {
-    $id = CRM_Utils_Array::value('id', $params);
-    $trxn_id = CRM_Utils_Array::value('trxn_id', $params);
-    $invoice_id = CRM_Utils_Array::value('invoice_id', $params);
+    $id = $params['id'] ?? NULL;
+    $trxn_id = $params['trxn_id'] ?? NULL;
+    $invoice_id = $params['invoice_id'] ?? NULL;
 
     $clause = [];
     $params = [];
@@ -181,7 +181,7 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
       'id' => $recurID,
       'return' => ['payment_processor_id'],
     ]);
-    return (int) CRM_Utils_Array::value('payment_processor_id', $recur, 0);
+    return (int) ($recur['payment_processor_id'] ?? 0);
   }
 
   /**
@@ -250,7 +250,7 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
     }
     $activityParams = [
       'subject' => !empty($params['membership_id']) ? ts('Auto-renewal membership cancelled') : ts('Recurring contribution cancelled'),
-      'details' => CRM_Utils_Array::value('processor_message', $params),
+      'details' => $params['processor_message'] ?? NULL,
     ];
 
     $cancelledId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionRecur', 'contribution_status_id', 'Cancelled');
@@ -264,19 +264,19 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
       $recur->start_date = CRM_Utils_Date::isoToMysql($recur->start_date);
       $recur->create_date = CRM_Utils_Date::isoToMysql($recur->create_date);
       $recur->modified_date = CRM_Utils_Date::isoToMysql($recur->modified_date);
-      $recur->cancel_reason = CRM_Utils_Array::value('cancel_reason', $params);
+      $recur->cancel_reason = $params['cancel_reason'] ?? NULL;
       $recur->cancel_date = date('YmdHis');
       $recur->save();
 
       // @fixme https://lab.civicrm.org/dev/core/issues/927 Cancelling membership etc is not desirable for all use-cases and we should be able to disable it
       $dao = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recurId);
       if ($dao && $dao->recur_id) {
-        $details = CRM_Utils_Array::value('details', $activityParams);
+        $details = $activityParams['details'] ?? NULL;
         if ($dao->auto_renew && $dao->membership_id) {
           // its auto-renewal membership mode
           $membershipTypes = CRM_Member_PseudoConstant::membershipType();
           $membershipType = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $dao->membership_id, 'membership_type_id');
-          $membershipType = CRM_Utils_Array::value($membershipType, $membershipTypes);
+          $membershipType = $membershipTypes[$membershipType] ?? NULL;
           $details .= '
 <br/>' . ts('Automatic renewal of %1 membership cancelled.', [1 => $membershipType]);
         }
diff --git a/civicrm/CRM/Contribute/BAO/ContributionSoft.php b/civicrm/CRM/Contribute/BAO/ContributionSoft.php
index 3923e5f73b..679fe80565 100644
--- a/civicrm/CRM/Contribute/BAO/ContributionSoft.php
+++ b/civicrm/CRM/Contribute/BAO/ContributionSoft.php
@@ -71,9 +71,9 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
       );
       $softParams['currency'] = $contribution->currency;
       $softParams['amount'] = $contribution->total_amount;
-      $softParams['pcp_display_in_roll'] = CRM_Utils_Array::value('pcp_display_in_roll', $pcp);
-      $softParams['pcp_roll_nickname'] = CRM_Utils_Array::value('pcp_roll_nickname', $pcp);
-      $softParams['pcp_personal_note'] = CRM_Utils_Array::value('pcp_personal_note', $pcp);
+      $softParams['pcp_display_in_roll'] = $pcp['pcp_display_in_roll'] ?? NULL;
+      $softParams['pcp_roll_nickname'] = $pcp['pcp_roll_nickname'] ?? NULL;
+      $softParams['pcp_personal_note'] = $pcp['pcp_personal_note'] ?? NULL;
       $softParams['soft_credit_type_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionSoft', 'soft_credit_type_id', 'pcp');
       $contributionSoft = self::add($softParams);
       //Send notification to owner for PCP
@@ -130,7 +130,7 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
         'pcp_personal_note',
       ];
       foreach ($fields as $f) {
-        $pcp[$f] = CRM_Utils_Array::value($f, $params);
+        $pcp[$f] = $params[$f] ?? NULL;
       }
     }
 
@@ -154,7 +154,7 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
         FALSE
       );
       if (count($ids)) {
-        $honorId = CRM_Utils_Array::value(0, $ids);
+        $honorId = $ids[0] ?? NULL;
       }
 
       $null = [];
@@ -168,7 +168,7 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
         'soft_credit_type_id' => $params['soft_credit_type_id'],
       ];
 
-      if (CRM_Utils_Array::value('is_email_receipt', $form->_values)) {
+      if (!empty($form->_values['is_email_receipt'])) {
         $form->_values['honor'] = [
           'soft_credit_type' => CRM_Utils_Array::value(
             $params['soft_credit_type_id'],
@@ -289,7 +289,7 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
    */
   public static function getSoftContribution($contributionID, $all = FALSE) {
     $softContributionFields = self::getSoftCreditContributionFields([$contributionID], $all);
-    return isset($softContributionFields[$contributionID]) ? $softContributionFields[$contributionID] : [];
+    return $softContributionFields[$contributionID] ?? [];
   }
 
   /**
@@ -399,7 +399,7 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
     // Format the params.
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['rowCount'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
     $contactId = $params['cid'];
 
     $filter = NULL;
diff --git a/civicrm/CRM/Contribute/BAO/ManagePremiums.php b/civicrm/CRM/Contribute/BAO/ManagePremiums.php
index e7d986678a..272222804d 100644
--- a/civicrm/CRM/Contribute/BAO/ManagePremiums.php
+++ b/civicrm/CRM/Contribute/BAO/ManagePremiums.php
@@ -70,7 +70,7 @@ class CRM_Contribute_BAO_ManagePremiums extends CRM_Contribute_BAO_Product {
    */
   public static function add(&$params, $ids) {
     CRM_Core_Error::deprecatedFunctionWarning('CRM_Contribute_BAO_Product::create');
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('premium', $ids));
+    $id = $params['id'] ?? $ids['premium'] ?? NULL;
     if ($id) {
       $params['id'] = $id;
     }
diff --git a/civicrm/CRM/Contribute/BAO/Product.php b/civicrm/CRM/Contribute/BAO/Product.php
index da94144653..eb79c86d7b 100644
--- a/civicrm/CRM/Contribute/BAO/Product.php
+++ b/civicrm/CRM/Contribute/BAO/Product.php
@@ -78,7 +78,7 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
    * @return CRM_Contribute_DAO_Product
    */
   public static function create($params) {
-    $id = CRM_Utils_Array::value('id', $params);
+    $id = $params['id'] ?? NULL;
     if (empty($id)) {
       $defaultParams = [
         'id' => $id,
diff --git a/civicrm/CRM/Contribute/DAO/Widget.php b/civicrm/CRM/Contribute/DAO/Widget.php
index 5591ae497d..0705b3e744 100644
--- a/civicrm/CRM/Contribute/DAO/Widget.php
+++ b/civicrm/CRM/Contribute/DAO/Widget.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/Widget.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4a3f77ad3185fba0d0c083a1000336b7)
+ * (GenCodeChecksum:5623f4ecd23646d12dd4278675006d7a)
  */
 
 /**
@@ -273,7 +273,7 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
         'color_button' => [
           'name' => 'color_button',
           'type' => CRM_Utils_Type::T_STRING,
-          'title' => ts('Button Colour'),
+          'title' => ts('Button Color'),
           'maxlength' => 10,
           'size' => CRM_Utils_Type::TWELVE,
           'where' => 'civicrm_contribution_widget.color_button',
@@ -309,7 +309,7 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
         'color_main' => [
           'name' => 'color_main',
           'type' => CRM_Utils_Type::T_STRING,
-          'title' => ts('Main Colour'),
+          'title' => ts('Main Color'),
           'maxlength' => 10,
           'size' => CRM_Utils_Type::TWELVE,
           'where' => 'civicrm_contribution_widget.color_main',
@@ -321,7 +321,7 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
         'color_main_bg' => [
           'name' => 'color_main_bg',
           'type' => CRM_Utils_Type::T_STRING,
-          'title' => ts('Backgroup Color'),
+          'title' => ts('Background Color'),
           'maxlength' => 10,
           'size' => CRM_Utils_Type::TWELVE,
           'where' => 'civicrm_contribution_widget.color_main_bg',
@@ -333,7 +333,7 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
         'color_bg' => [
           'name' => 'color_bg',
           'type' => CRM_Utils_Type::T_STRING,
-          'title' => ts('Other Backgroun Colour'),
+          'title' => ts('Other Background Color'),
           'maxlength' => 10,
           'size' => CRM_Utils_Type::TWELVE,
           'where' => 'civicrm_contribution_widget.color_bg',
@@ -345,7 +345,7 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
         'color_about_link' => [
           'name' => 'color_about_link',
           'type' => CRM_Utils_Type::T_STRING,
-          'title' => ts('About Link Colour'),
+          'title' => ts('About Link Color'),
           'maxlength' => 10,
           'size' => CRM_Utils_Type::TWELVE,
           'where' => 'civicrm_contribution_widget.color_about_link',
@@ -357,7 +357,7 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
         'color_homepage_link' => [
           'name' => 'color_homepage_link',
           'type' => CRM_Utils_Type::T_STRING,
-          'title' => ts('Homepage Link Colour'),
+          'title' => ts('Homepage Link Color'),
           'maxlength' => 10,
           'size' => CRM_Utils_Type::TWELVE,
           'where' => 'civicrm_contribution_widget.color_homepage_link',
diff --git a/civicrm/CRM/Contribute/Form/AbstractEditPayment.php b/civicrm/CRM/Contribute/Form/AbstractEditPayment.php
index ee65f5336e..27e19392c2 100644
--- a/civicrm/CRM/Contribute/Form/AbstractEditPayment.php
+++ b/civicrm/CRM/Contribute/Form/AbstractEditPayment.php
@@ -276,10 +276,10 @@ class CRM_Contribute_Form_AbstractEditPayment extends CRM_Contact_Form_Task {
 
     // Also don't allow user to update some fields for recurring contributions.
     if (!$this->_online) {
-      $this->_online = CRM_Utils_Array::value('contribution_recur_id', $values);
+      $this->_online = $values['contribution_recur_id'] ?? NULL;
     }
 
-    $this->assign('isOnline', $this->_online ? TRUE : FALSE);
+    $this->assign('isOnline', (bool) $this->_online);
 
     //to get note id
     $daoNote = new CRM_Core_BAO_Note();
@@ -415,9 +415,9 @@ WHERE  contribution_id = {$id}
       $payParams = ['id' => $this->_ppID];
 
       CRM_Pledge_BAO_PledgePayment::retrieve($payParams, $this->_pledgeValues['pledgePayment']);
-      $this->_pledgeID = CRM_Utils_Array::value('pledge_id', $this->_pledgeValues['pledgePayment']);
-      $paymentStatusID = CRM_Utils_Array::value('status_id', $this->_pledgeValues['pledgePayment']);
-      $this->_id = CRM_Utils_Array::value('contribution_id', $this->_pledgeValues['pledgePayment']);
+      $this->_pledgeID = $this->_pledgeValues['pledgePayment']['pledge_id'] ?? NULL;
+      $paymentStatusID = $this->_pledgeValues['pledgePayment']['status_id'] ?? NULL;
+      $this->_id = $this->_pledgeValues['pledgePayment']['contribution_id'] ?? NULL;
 
       //get all status
       $allStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
diff --git a/civicrm/CRM/Contribute/Form/AdditionalInfo.php b/civicrm/CRM/Contribute/Form/AdditionalInfo.php
index ad9f2b6ed1..41ba9fba27 100644
--- a/civicrm/CRM/Contribute/Form/AdditionalInfo.php
+++ b/civicrm/CRM/Contribute/Form/AdditionalInfo.php
@@ -171,7 +171,7 @@ class CRM_Contribute_Form_AdditionalInfo {
    */
   public static function processPremium($params, $contributionID, $premiumID = NULL, $options = []) {
     $selectedProductID = $params['product_name'][0];
-    $selectedProductOptionID = CRM_Utils_Array::value(1, $params['product_name']);
+    $selectedProductOptionID = $params['product_name'][1] ?? NULL;
 
     $dao = new CRM_Contribute_DAO_ContributionProduct();
     $dao->contribution_id = $contributionID;
@@ -186,7 +186,7 @@ class CRM_Contribute_Form_AdditionalInfo {
 
     $productDetails = [];
     CRM_Contribute_BAO_Product::retrieve($premiumParams, $productDetails);
-    $dao->financial_type_id = CRM_Utils_Array::value('financial_type_id', $productDetails);
+    $dao->financial_type_id = $productDetails['financial_type_id'] ?? NULL;
     if (!empty($options[$selectedProductID])) {
       $dao->product_option = $options[$selectedProductID][$selectedProductOptionID];
     }
@@ -207,9 +207,9 @@ class CRM_Contribute_Form_AdditionalInfo {
     //CRM-11106
     if ($premiumID == NULL || $isDeleted) {
       $premiumParams = [
-        'cost' => CRM_Utils_Array::value('cost', $productDetails),
-        'currency' => CRM_Utils_Array::value('currency', $productDetails),
-        'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $productDetails),
+        'cost' => $productDetails['cost'] ?? NULL,
+        'currency' => $productDetails['currency'] ?? NULL,
+        'financial_type_id' => $productDetails['financial_type_id'] ?? NULL,
         'contributionId' => $contributionID,
       ];
       if ($isDeleted) {
@@ -268,7 +268,7 @@ class CRM_Contribute_Form_AdditionalInfo {
       'contribution_page_id',
     ];
     foreach ($fields as $f) {
-      $formatted[$f] = CRM_Utils_Array::value($f, $params);
+      $formatted[$f] = $params[$f] ?? NULL;
     }
 
     if (!empty($params['thankyou_date']) && !CRM_Utils_System::isNull($params['thankyou_date'])) {
@@ -437,7 +437,7 @@ class CRM_Contribute_Form_AdditionalInfo {
     $taxAmt = $template->get_template_vars('dataArray');
     $eventTaxAmt = $template->get_template_vars('totalTaxAmount');
     $prefixValue = Civi::settings()->get('contribution_invoice_settings');
-    $invoicing = CRM_Utils_Array::value('invoicing', $prefixValue);
+    $invoicing = $prefixValue['invoicing'] ?? NULL;
     if ((!empty($taxAmt) || isset($eventTaxAmt)) && (isset($invoicing) && isset($prefixValue['is_email_pdf']))) {
       $isEmailPdf = TRUE;
     }
diff --git a/civicrm/CRM/Contribute/Form/AdditionalPayment.php b/civicrm/CRM/Contribute/Form/AdditionalPayment.php
index cf387bf944..d60f59ccbd 100644
--- a/civicrm/CRM/Contribute/Form/AdditionalPayment.php
+++ b/civicrm/CRM/Contribute/Form/AdditionalPayment.php
@@ -29,6 +29,8 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
   protected $entity = 'Contribution';
 
+  protected $amountDue;
+
   protected $_owed = NULL;
 
   protected $_refund = NULL;
@@ -59,6 +61,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
    * Pre process form.
    *
    * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public function preProcess() {
 
@@ -84,24 +87,18 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
     }
 
     $paymentDetails = CRM_Contribute_BAO_Contribution::getPaymentInfo($this->_id, $this->_component, FALSE, TRUE);
-    $paymentAmt = CRM_Contribute_BAO_Contribution::getContributionBalance($this->_contributionId);
+    $paymentAmt = $this->getAmountDue();
 
     $this->_amtPaid = $paymentDetails['paid'];
     $this->_amtTotal = $paymentDetails['total'];
 
-    if ($paymentAmt < 0) {
-      $this->_refund = $paymentAmt;
-      $this->_paymentType = 'refund';
-    }
-    elseif ($paymentAmt > 0) {
+    if ($paymentAmt >= 0) {
       $this->_owed = $paymentAmt;
-      $this->_paymentType = 'owed';
-    }
-    else {
-      throw new CRM_Core_Exception(ts('No payment information found for this record'));
     }
 
-    if (!empty($this->_mode) && $this->_paymentType == 'refund') {
+    $this->_paymentType = $this->getPaymentType();
+
+    if (!empty($this->_mode) && $this->isARefund()) {
       throw new CRM_Core_Exception(ts('Credit card payment is not for Refund payments use'));
     }
 
@@ -110,9 +107,11 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
     $this->assign('contributionMode', $this->_mode);
     $this->assign('contactId', $this->_contactID);
     $this->assign('paymentType', $this->_paymentType);
-    $this->assign('paymentAmt', abs($paymentAmt));
+    $this->assign('paymentAmt', $paymentAmt);
+    // It's easier to strip the minus sign for display purposes in php than smarty.
+    $this->assign('absolutePaymentAmount', abs($paymentAmt));
 
-    $this->setPageTitle($this->_refund ? ts('Refund') : ts('Payment'));
+    $this->setPageTitle($this->isARefund() ? ts('Refund') : ts('Payment'));
   }
 
   /**
@@ -138,6 +137,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
   /**
    * @return array
+   * @throws \CRM_Core_Exception
    */
   public function setDefaultValues() {
     if ($this->_view == 'transaction' && ($this->_action & CRM_Core_Action::BROWSE)) {
@@ -153,10 +153,10 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
       $defaults['trxn_date'] = date('Y-m-d H:i:s');
     }
 
-    if ($this->_refund) {
-      $defaults['total_amount'] = CRM_Utils_Money::format(abs($this->_refund), NULL, NULL, TRUE);
+    if ($this->isARefund() && $this->amountDue < 0) {
+      $defaults['total_amount'] = CRM_Utils_Money::format(abs($this->amountDue), NULL, NULL, TRUE);
     }
-    elseif ($this->_owed) {
+    elseif ($this->_owed && $this->amountDue > 0) {
       $defaults['total_amount'] = CRM_Utils_Money::formatLocaleNumericRoundedForDefaultCurrency($this->_owed);
     }
 
@@ -169,9 +169,10 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
    * Build the form object.
    *
    * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public function buildQuickForm() {
-    if ($this->_view == 'transaction' && ($this->_action & CRM_Core_Action::BROWSE)) {
+    if ($this->_view === 'transaction' && ($this->_action & CRM_Core_Action::BROWSE)) {
       $this->addButtons([
         [
           'type' => 'cancel',
@@ -188,9 +189,8 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
     $attributes = CRM_Core_DAO::getAttribute('CRM_Financial_DAO_FinancialTrxn');
 
-    $label = ($this->_refund) ? ts('Refund Amount') : ts('Payment Amount');
     $this->addMoney('total_amount',
-      $label,
+      $this->isARefund() ? ts('Refund Amount') : ts('Payment Amount'),
       TRUE,
       $attributes['total_amount'],
       TRUE, 'currency', NULL
@@ -207,8 +207,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
     $this->add('textarea', 'receipt_text', ts('Confirmation Message'));
 
-    $dateLabel = ($this->_refund) ? ts('Refund Date') : ts('Date Received');
-    $this->addField('trxn_date', ['entity' => 'FinancialTrxn', 'label' => $dateLabel, 'context' => 'Contribution'], FALSE, FALSE);
+    $this->addField('trxn_date', ['entity' => 'FinancialTrxn', 'label' => $this->isARefund() ? ts('Refund Date') : ts('Date Received'), 'context' => 'Contribution'], FALSE, FALSE);
 
     if ($this->_contactId && $this->_id) {
       if ($this->_component == 'event') {
@@ -243,7 +242,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
       $this->addRule('fee_amount', ts('Please enter a valid monetary value for Fee Amount.'), 'money');
     }
 
-    $buttonName = $this->_refund ? ts('Record Refund') : ts('Record Payment');
+    $buttonName = $this->isARefund() ? ts('Record Refund') : ts('Record Payment');
     $this->addButtons([
       [
         'type' => 'upload',
@@ -271,13 +270,6 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
    */
   public static function formRule($fields, $files, $self) {
     $errors = [];
-    if ($self->_paymentType == 'owed' && (int) $fields['total_amount'] > (int) $self->_owed) {
-      $errors['total_amount'] = ts('Payment amount cannot be greater than owed amount');
-    }
-    if ($self->_paymentType == 'refund' && $fields['total_amount'] != abs($self->_refund)) {
-      $errors['total_amount'] = ts('Refund amount must equal refund due amount.');
-    }
-
     if ($self->_paymentProcessor['id'] === 0 && empty($fields['payment_instrument_id'])) {
       $errors['payment_instrument_id'] = ts('Payment method is a required field');
     }
@@ -287,12 +279,14 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
   /**
    * Process the form submission.
+   *
+   * @throws \CiviCRM_API3_Exception
    */
   public function postProcess() {
     $submittedValues = $this->controller->exportValues($this->_name);
     $this->submit($submittedValues);
     $childTab = 'contribute';
-    if ($this->_component == 'event') {
+    if ($this->_component === 'event') {
       $childTab = 'participant';
     }
     $session = CRM_Core_Session::singleton();
@@ -307,6 +301,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
    * @param array $submittedValues
    *
    * @throws \CiviCRM_API3_Exception
+   * @throws \CRM_Core_Exception
    */
   public function submit($submittedValues) {
     $this->_params = $submittedValues;
@@ -314,7 +309,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
     $this->_contributorContactID = $this->_contactID;
     $this->processBillingAddress();
     $participantId = NULL;
-    if ($this->_component == 'event') {
+    if ($this->_component === 'event') {
       $participantId = $this->_id;
     }
 
@@ -326,7 +321,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
     // @todo we should clean $ on the form & pass in skipCleanMoney
     $trxnsData = $this->_params;
-    if ($this->_paymentType == 'refund') {
+    if ($this->isARefund()) {
       $trxnsData['total_amount'] = -$trxnsData['total_amount'];
     }
     $trxnsData['participant_id'] = $participantId;
@@ -453,6 +448,7 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
    * @param string $entityType
    *
    * @throws \CiviCRM_API3_Exception
+   * @throws \CRM_Core_Exception
    */
   public function testSubmit($params, $creditCardMode = NULL, $entityType = 'contribute') {
     $this->_bltID = 5;
@@ -467,18 +463,14 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
 
       $paymentDetails = CRM_Contribute_BAO_Contribution::getPaymentInfo($this->_contributionId, $entityType, FALSE, TRUE);
 
-      $paymentAmount = CRM_Contribute_BAO_Contribution::getContributionBalance($this->_contributionId);
+      $paymentAmount = $this->getAmountDue();
       $this->_amtPaid = $paymentDetails['paid'];
       $this->_amtTotal = $paymentDetails['total'];
 
-      if ($paymentAmount < 0) {
-        $this->_refund = $paymentAmount;
-        $this->_paymentType = 'refund';
-      }
-      elseif ($paymentAmount > 0) {
+      if ($paymentAmount > 0) {
         $this->_owed = $paymentAmount;
-        $this->_paymentType = 'owed';
       }
+      $this->_paymentType = $this->getPaymentType();
     }
 
     if (!empty($params['contact_id'])) {
@@ -495,4 +487,47 @@ class CRM_Contribute_Form_AdditionalPayment extends CRM_Contribute_Form_Abstract
     $this->submit($params);
   }
 
+  /**
+   * Get the 'payment type' - ie is it a payment or a refund.
+   *
+   * We prefer the url action param but fall back on a guess from the balance.
+   *
+   * The refund|owed is not great - perhaps move to positive & negative.
+   *
+   * @return string
+   * @throws \CRM_Core_Exception
+   */
+  protected function getPaymentType():string {
+    $urlParam = CRM_Utils_Request::retrieve('is_refund', 'Int', $this);
+    if ($urlParam === 0) {
+      return 'owed';
+    }
+    if ($urlParam === 1) {
+      return 'refund';
+    }
+
+    return $this->getAmountDue() < 0 ? 'refund' : 'owed';
+  }
+
+  /**
+   * Is the form processing a refund.
+   *
+   * @return bool
+   *
+   * @throws \CRM_Core_Exception
+   */
+  protected function isARefund() {
+    return $this->getPaymentType() === 'refund';
+  }
+
+  /**
+   * @return float
+   */
+  protected function getAmountDue(): float {
+    if (!isset($this->amountDue)) {
+      $this->amountDue = CRM_Contribute_BAO_Contribution::getContributionBalance($this->_contributionId);
+    }
+    return $this->amountDue;
+  }
+
 }
diff --git a/civicrm/CRM/Contribute/Form/CancelSubscription.php b/civicrm/CRM/Contribute/Form/CancelSubscription.php
index 4cbac2cfb6..7afbe299d9 100644
--- a/civicrm/CRM/Contribute/Form/CancelSubscription.php
+++ b/civicrm/CRM/Contribute/Form/CancelSubscription.php
@@ -8,6 +8,7 @@
  | and copyright information, see https://civicrm.org/licensing       |
  +--------------------------------------------------------------------+
  */
+use Civi\Payment\PropertyBag;
 
 /**
  *
@@ -44,15 +45,20 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
    */
   public function preProcess() {
     parent::preProcess();
-    if ($this->_crid) {
-      $this->assign('frequency_unit', $this->_subscriptionDetails->frequency_unit);
-      $this->assign('frequency_interval', $this->_subscriptionDetails->frequency_interval);
-      $this->assign('amount', $this->_subscriptionDetails->amount);
-      $this->assign('installments', $this->_subscriptionDetails->installments);
 
+    $cancelRecurTextParams = [
+      'mode' => $this->_mode,
+      'amount' => $this->getSubscriptionDetails()->amount,
+      'currency' => $this->getSubscriptionDetails()->currency,
+      'frequency_interval' => $this->getSubscriptionDetails()->frequency_interval,
+      'frequency_unit' => $this->getSubscriptionDetails()->frequency_unit,
+      'installments' => $this->getSubscriptionDetails()->installments,
+    ];
+
+    if ($this->_crid) {
       // Are we cancelling a recurring contribution that is linked to an auto-renew membership?
-      if ($this->_subscriptionDetails->membership_id) {
-        $this->_mid = $this->_subscriptionDetails->membership_id;
+      if ($this->getSubscriptionDetails()->membership_id) {
+        $this->_mid = $this->getSubscriptionDetails()->membership_id;
       }
     }
 
@@ -63,7 +69,9 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
 
       $membershipTypes = CRM_Member_PseudoConstant::membershipType();
       $membershipTypeId = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $this->_mid, 'membership_type_id');
-      $this->assign('membershipType', CRM_Utils_Array::value($membershipTypeId, $membershipTypes));
+      $membershipType = $membershipTypes[$membershipTypeId] ?? '';
+      $this->assign('membershipType', $membershipType);
+      $cancelRecurTextParams['membershipType'] = $membershipType;
     }
 
     if ($this->_coid) {
@@ -71,20 +79,17 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
         CRM_Core_Error::statusBounce(ts('The recurring contribution looks to have been cancelled already.'));
       }
       $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_coid, 'contribute', 'obj');
-
-      $this->assign('frequency_unit', $this->_subscriptionDetails->frequency_unit);
-      $this->assign('frequency_interval', $this->_subscriptionDetails->frequency_interval);
-      $this->assign('amount', $this->_subscriptionDetails->amount);
-      $this->assign('installments', $this->_subscriptionDetails->installments);
     }
 
     if (
       (!$this->_crid && !$this->_coid && !$this->_mid) ||
-      (!$this->_subscriptionDetails)
+      (!$this->getSubscriptionDetails())
     ) {
       CRM_Core_Error::statusBounce('Required information missing.');
     }
 
+    $this->assign('cancelRecurDetailText', $this->_paymentProcessorObj->getText('cancelRecurDetailText', $cancelRecurTextParams));
+
     // handle context redirection
     CRM_Contribute_BAO_ContributionRecur::setSubscriptionContext();
 
@@ -95,9 +100,9 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
       unset($this->entityFields['send_cancel_request'], $this->entityFields['is_notify']);
     }
 
-    if ($this->_subscriptionDetails->contact_id) {
+    if ($this->getSubscriptionDetails()->contact_id) {
       list($this->_donorDisplayName, $this->_donorEmail)
-        = CRM_Contact_BAO_Contact::getContactDetails($this->_subscriptionDetails->contact_id);
+        = CRM_Contact_BAO_Contact::getContactDetails($this->getSubscriptionDetails()->contact_id);
     }
   }
 
@@ -136,9 +141,12 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
         $searchRange,
         'send_cancel_request',
         ts('Send cancellation request to %1 ?',
-          [1 => $this->_paymentProcessorObj->_processorName])
+          [1 => $this->_paymentProcessorObj->getTitle()])
       );
     }
+    else {
+      $this->assign('cancelRecurNotSupportedText', $this->_paymentProcessorObj->getText('cancelRecurNotSupportedText', []));
+    }
     $this->assign('cancelSupported', $cancelSupported);
 
     if ($this->_donorEmail) {
@@ -187,7 +195,7 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
    * Process the form submission.
    */
   public function postProcess() {
-    $status = $message = NULL;
+    $message = NULL;
     $cancelSubscription = TRUE;
     $params = $this->controller->exportValues($this->_name);
 
@@ -203,24 +211,21 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
     }
 
     if (CRM_Utils_Array::value('send_cancel_request', $params) == 1) {
-      // Note the 'subscriptionId' here is the value stored in
-      // civicrm_contribution_recur.processor_id
-      $cancelParams = ['subscriptionId' => $this->_subscriptionDetails->subscription_id];
       try {
-        $cancelSubscription = $this->_paymentProcessorObj->cancelSubscription($message, $cancelParams);
+        $propertyBag = new PropertyBag();
+        $propertyBag->setContributionRecurID($this->getSubscriptionDetails()->recur_id);
+        $propertyBag->setRecurProcessorID($this->getSubscriptionDetails()->subscription_id);
+        $message = $this->_paymentProcessorObj->doCancelRecurring($propertyBag)['message'];
       }
       catch (\Civi\Payment\Exception\PaymentProcessorException $e) {
         CRM_Core_Error::statusBounce($e->getMessage());
       }
     }
 
-    if (is_a($cancelSubscription, 'CRM_Core_Error')) {
-      CRM_Core_Error::displaySessionError($cancelSubscription);
-    }
-    elseif ($cancelSubscription) {
+    if ($cancelSubscription) {
       try {
         civicrm_api3('ContributionRecur', 'cancel', [
-          'id' => $this->_subscriptionDetails->recur_id,
+          'id' => $this->getSubscriptionDetails()->recur_id,
           'membership_id' => $this->_mid,
           'processor_message' => $message,
           'cancel_reason' => $params['cancel_reason'],
@@ -240,15 +245,15 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
           $msgType = 'info';
         }
         else {
-          $tplParams['recur_frequency_interval'] = $this->_subscriptionDetails->frequency_interval;
-          $tplParams['recur_frequency_unit'] = $this->_subscriptionDetails->frequency_unit;
-          $tplParams['amount'] = $this->_subscriptionDetails->amount;
+          $tplParams['recur_frequency_interval'] = $this->getSubscriptionDetails()->frequency_interval;
+          $tplParams['recur_frequency_unit'] = $this->getSubscriptionDetails()->frequency_unit;
+          $tplParams['amount'] = CRM_Utils_Money::format($this->getSubscriptionDetails()->amount, $this->getSubscriptionDetails()->currency);
           $tplParams['contact'] = ['display_name' => $this->_donorDisplayName];
           $status = ts('The recurring contribution of %1, every %2 %3 has been cancelled.',
             [
-              1 => $this->_subscriptionDetails->amount,
-              2 => $this->_subscriptionDetails->frequency_interval,
-              3 => $this->_subscriptionDetails->frequency_unit,
+              1 => $tplParams['amount'],
+              2 => $tplParams['recur_frequency_interval'],
+              3 => $tplParams['recur_frequency_unit'],
             ]
           );
           $msgTitle = 'Contribution Cancelled';
@@ -256,18 +261,18 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
         }
 
         if (CRM_Utils_Array::value('is_notify', $params) == 1) {
-          if ($this->_subscriptionDetails->contribution_page_id) {
+          if ($this->getSubscriptionDetails()->contribution_page_id) {
             CRM_Core_DAO::commonRetrieveAll(
               'CRM_Contribute_DAO_ContributionPage',
               'id',
-              $this->_subscriptionDetails->contribution_page_id,
+              $this->getSubscriptionDetails()->contribution_page_id,
               $value,
               ['title', 'receipt_from_name', 'receipt_from_email']
             );
             $receiptFrom
-              = '"' . CRM_Utils_Array::value('receipt_from_name', $value[$this->_subscriptionDetails->contribution_page_id]) .
+              = '"' . CRM_Utils_Array::value('receipt_from_name', $value[$this->getSubscriptionDetails()->contribution_page_id]) .
               '" <' .
-              $value[$this->_subscriptionDetails->contribution_page_id]['receipt_from_email'] .
+              $value[$this->getSubscriptionDetails()->contribution_page_id]['receipt_from_email'] .
               '>';
           }
           else {
@@ -280,7 +285,7 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
             = [
               'groupName' => $this->_mode == 'auto_renew' ? 'msg_tpl_workflow_membership' : 'msg_tpl_workflow_contribution',
               'valueName' => $this->_mode == 'auto_renew' ? 'membership_autorenew_cancelled' : 'contribution_recurring_cancelled',
-              'contactId' => $this->_subscriptionDetails->contact_id,
+              'contactId' => $this->getSubscriptionDetails()->contact_id,
               'tplParams' => $tplParams,
               //'isTest'    => $isTest, set this from _objects
               'PDFFilename' => 'receipt.pdf',
diff --git a/civicrm/CRM/Contribute/Form/Contribution.php b/civicrm/CRM/Contribute/Form/Contribution.php
index a47c573dd1..1712d0a79a 100644
--- a/civicrm/CRM/Contribute/Form/Contribution.php
+++ b/civicrm/CRM/Contribute/Form/Contribution.php
@@ -223,10 +223,10 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
 
     parent::preProcess();
 
-    $this->_formType = CRM_Utils_Array::value('formType', $_GET);
+    $this->_formType = $_GET['formType'] ?? NULL;
 
     // Get price set id.
-    $this->_priceSetId = CRM_Utils_Array::value('priceSetId', $_GET);
+    $this->_priceSetId = $_GET['priceSetId'] ?? NULL;
     $this->set('priceSetId', $this->_priceSetId);
     $this->assign('priceSetId', $this->_priceSetId);
 
@@ -321,9 +321,9 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
 
     // Set defaults for pledge payment.
     if ($this->_ppID) {
-      $defaults['total_amount'] = CRM_Utils_Array::value('scheduled_amount', $this->_pledgeValues['pledgePayment']);
-      $defaults['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_pledgeValues);
-      $defaults['currency'] = CRM_Utils_Array::value('currency', $this->_pledgeValues);
+      $defaults['total_amount'] = $this->_pledgeValues['pledgePayment']['scheduled_amount'] ?? NULL;
+      $defaults['financial_type_id'] = $this->_pledgeValues['financial_type_id'] ?? NULL;
+      $defaults['currency'] = $this->_pledgeValues['currency'] ?? NULL;
       $defaults['option_type'] = 1;
     }
 
@@ -398,7 +398,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
     // For Premium section.
     if ($this->_premiumID) {
       $this->assign('showOption', FALSE);
-      $options = isset($this->_options[$this->_productDAO->product_id]) ? $this->_options[$this->_productDAO->product_id] : "";
+      $options = $this->_options[$this->_productDAO->product_id] ?? "";
       if (!$options) {
         $this->assign('showOption', TRUE);
       }
@@ -430,14 +430,14 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       $defaults['refund_trxn_id'] = CRM_Core_BAO_FinancialTrxn::getRefundTransactionTrxnID($this->_id);
     }
     else {
-      $defaults['refund_trxn_id'] = isset($defaults['trxn_id']) ? $defaults['trxn_id'] : NULL;
+      $defaults['refund_trxn_id'] = $defaults['trxn_id'] ?? NULL;
     }
 
     if (!$this->_id && empty($defaults['receive_date'])) {
       $defaults['receive_date'] = date('Y-m-d H:i:s');
     }
 
-    $currency = CRM_Utils_Array::value('currency', $defaults);
+    $currency = $defaults['currency'] ?? NULL;
     $this->assign('currency', $currency);
     // Hack to get currency info to the js layer. CRM-11440.
     CRM_Utils_Money::format(1);
@@ -637,7 +637,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
     $paymentInstrument = FALSE;
     if (!$this->_mode) {
       // payment_instrument isn't required in edit and will not be present when payment block is enabled.
-      $required = $this->_id ? FALSE : TRUE;
+      $required = !$this->_id;
       $checkPaymentID = array_search('Check', CRM_Contribute_PseudoConstant::paymentInstrument('name'));
       $paymentInstrument = $this->add('select', 'payment_instrument_id',
         ts('Payment Method'),
@@ -776,7 +776,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
 
       $totalAmount = $this->addMoney('total_amount',
         ts('Total Amount'),
-        ($hasPriceSets) ? FALSE : TRUE,
+        !$hasPriceSets,
         $attributes['total_amount'],
         TRUE, 'currency', NULL, $currencyFreeze
       );
@@ -1069,9 +1069,9 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       CRM_Core_Config::singleton()->defaultCurrency
     );
 
-    $this->_params['pcp_display_in_roll'] = CRM_Utils_Array::value('pcp_display_in_roll', $params);
-    $this->_params['pcp_roll_nickname'] = CRM_Utils_Array::value('pcp_roll_nickname', $params);
-    $this->_params['pcp_personal_note'] = CRM_Utils_Array::value('pcp_personal_note', $params);
+    $this->_params['pcp_display_in_roll'] = $params['pcp_display_in_roll'] ?? NULL;
+    $this->_params['pcp_roll_nickname'] = $params['pcp_roll_nickname'] ?? NULL;
+    $this->_params['pcp_personal_note'] = $params['pcp_personal_note'] ?? NULL;
 
     //Add common data to formatted params
     CRM_Contribute_Form_AdditionalInfo::postProcessCommon($params, $this->_params, $this);
@@ -1126,14 +1126,14 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       $this->set('is_deductible', TRUE);
     }
     $contributionParams = [
-      'id' => CRM_Utils_Array::value('contribution_id', $this->_params),
+      'id' => $this->_params['contribution_id'] ?? NULL,
       'contact_id' => $contactID,
       'line_item' => $lineItem,
       'is_test' => $isTest,
-      'campaign_id' => CRM_Utils_Array::value('campaign_id', $this->_params),
-      'contribution_page_id' => CRM_Utils_Array::value('contribution_page_id', $this->_params),
+      'campaign_id' => $this->_params['campaign_id'] ?? NULL,
+      'contribution_page_id' => $this->_params['contribution_page_id'] ?? NULL,
       'source' => CRM_Utils_Array::value('source', $paymentParams, CRM_Utils_Array::value('description', $paymentParams)),
-      'thankyou_date' => CRM_Utils_Array::value('thankyou_date', $this->_params),
+      'thankyou_date' => $this->_params['thankyou_date'] ?? NULL,
     ];
     $contributionParams['payment_instrument_id'] = $this->_paymentProcessor['payment_instrument_id'];
 
@@ -1178,9 +1178,9 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
               'trxn_id' => $result['trxn_id'],
               'payment_processor_id' => $this->_paymentProcessor['id'],
               'is_transactional' => FALSE,
-              'fee_amount' => CRM_Utils_Array::value('fee_amount', $result),
-              'card_type_id' => CRM_Utils_Array::value('card_type_id', $paymentParams),
-              'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $paymentParams),
+              'fee_amount' => $result['fee_amount'] ?? NULL,
+              'card_type_id' => $paymentParams['card_type_id'] ?? NULL,
+              'pan_truncation' => $paymentParams['pan_truncation'] ?? NULL,
               'is_email_receipt' => FALSE,
             ]);
             // This has now been set to 1 in the DB - declare it here also
@@ -1205,7 +1205,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
     // Send receipt mail.
     array_unshift($this->statusMessage, ts('The contribution record has been saved.'));
     if ($contribution->id && !empty($this->_params['is_email_receipt'])) {
-      $this->_params['trxn_id'] = CRM_Utils_Array::value('trxn_id', $result);
+      $this->_params['trxn_id'] = $result['trxn_id'] ?? NULL;
       $this->_params['contact_id'] = $contactID;
       $this->_params['contribution_id'] = $contribution->id;
       if (CRM_Contribute_Form_AdditionalInfo::emailReceipt($this, $this->_params, TRUE)) {
@@ -1372,7 +1372,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
 
     // Process price set and get total amount and line items.
     $lineItem = [];
-    $priceSetId = CRM_Utils_Array::value('price_set_id', $submittedValues);
+    $priceSetId = $submittedValues['price_set_id'] ?? NULL;
     if (empty($priceSetId) && !$this->_id) {
       $this->_priceSetId = $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', 'default_contribution_amount', 'id', 'name');
       $this->_priceSet = current(CRM_Price_BAO_PriceSet::getSetDetail($priceSetId));
@@ -1396,7 +1396,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       ) {
         unset($submittedValues['tax_amount']);
       }
-      $submittedValues['total_amount'] = CRM_Utils_Array::value('amount', $submittedValues);
+      $submittedValues['total_amount'] = $submittedValues['amount'] ?? NULL;
     }
 
     if ($this->_id) {
@@ -1507,7 +1507,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
     }
 
     if (!isset($submittedValues['total_amount'])) {
-      $submittedValues['total_amount'] = CRM_Utils_Array::value('total_amount', $this->_values);
+      $submittedValues['total_amount'] = $this->_values['total_amount'] ?? NULL;
       // Avoid tax amount deduction on edit form and keep it original, because this will lead to error described in CRM-20676
       if (!$this->_id) {
         $submittedValues['total_amount'] -= CRM_Utils_Array::value('tax_amount', $this->_values, 0);
@@ -1574,7 +1574,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
         'pan_truncation',
       ];
       foreach ($fields as $f) {
-        $params[$f] = CRM_Utils_Array::value($f, $formValues);
+        $params[$f] = $formValues[$f] ?? NULL;
       }
 
       $params['revenue_recognition_date'] = NULL;
@@ -1620,7 +1620,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
         $params['contribution_mode'] = 'membership';
       }
       $params['line_item'] = $lineItem;
-      $params['payment_processor_id'] = $params['payment_processor'] = CRM_Utils_Array::value('id', $this->_paymentProcessor);
+      $params['payment_processor_id'] = $params['payment_processor'] = $this->_paymentProcessor['id'] ?? NULL;
       $params['tax_amount'] = CRM_Utils_Array::value('tax_amount', $submittedValues, CRM_Utils_Array::value('tax_amount', $this->_values));
       //create contribution.
       if ($isQuickConfig) {
@@ -1657,7 +1657,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
         $formValues += CRM_Contribute_BAO_ContributionSoft::getSoftContribution($contribution->id);
 
         // to get 'from email id' for send receipt
-        $this->fromEmailId = CRM_Utils_Array::value('from_email_address', $formValues);
+        $this->fromEmailId = $formValues['from_email_address'] ?? NULL;
         if (CRM_Contribute_Form_AdditionalInfo::emailReceipt($this, $formValues)) {
           $this->statusMessage[] = ts('A receipt has been emailed to the contributor.');
         }
@@ -1683,7 +1683,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       $action,
       $pledgePaymentID,
       $contribution->id,
-      (CRM_Utils_Array::value('option_type', $formValues) == 2) ? TRUE : FALSE,
+      ($formValues['option_type'] ?? 0) == 2,
       $formValues['total_amount'],
       CRM_Utils_Array::value('total_amount', $this->_defaults),
       $formValues['contribution_status_id'],
@@ -1715,7 +1715,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
         }
         else {
           if (isset($v['tax_rate'])) {
-            $taxRate[(string) $v['tax_rate']] = CRM_Utils_Array::value('tax_amount', $v);
+            $taxRate[(string) $v['tax_rate']] = $v['tax_amount'] ?? NULL;
             $getTaxDetails = TRUE;
           }
         }
@@ -1763,7 +1763,7 @@ class CRM_Contribute_Form_Contribution extends CRM_Contribute_Form_AbstractEditP
       return $params['non_deductible_amount'];
     }
 
-    $priceSetId = CRM_Utils_Array::value('price_set_id', $params);
+    $priceSetId = $params['price_set_id'] ?? NULL;
     // return non-deductible amount if it is set at the price field option level
     if ($priceSetId && !empty($params['line_item'])) {
       $nonDeductibleAmount = CRM_Price_BAO_PriceSet::getNonDeductibleAmountFromPriceSet($priceSetId, $params['line_item']);
diff --git a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
index 8ae1f65a74..c043716bd0 100644
--- a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
+++ b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
@@ -113,7 +113,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $pledgeParams['original_installment_amount'] = $pledgeParams['installment_amount'];
 
       //inherit campaign from contirb page.
-      $pledgeParams['campaign_id'] = CRM_Utils_Array::value('campaign_id', $contributionParams);
+      $pledgeParams['campaign_id'] = $contributionParams['campaign_id'] ?? NULL;
 
       $pledge = CRM_Pledge_BAO_Pledge::create($pledgeParams);
 
@@ -156,8 +156,8 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $contributionParams = [
       'financial_type_id' => $financialTypeID,
       'receive_date' => (CRM_Utils_Array::value('receive_date', $params)) ? CRM_Utils_Date::processDate($params['receive_date']) : date('YmdHis'),
-      'tax_amount' => CRM_Utils_Array::value('tax_amount', $params),
-      'amount_level' => CRM_Utils_Array::value('amount_level', $params),
+      'tax_amount' => $params['tax_amount'] ?? NULL,
+      'amount_level' => $params['amount_level'] ?? NULL,
       'invoice_id' => $params['invoiceID'],
       'currency' => $params['currencyID'],
       'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
@@ -171,7 +171,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     ];
 
     if ($paymentProcessorOutcome) {
-      $contributionParams['payment_processor'] = CRM_Utils_Array::value('payment_processor', $paymentProcessorOutcome);
+      $contributionParams['payment_processor'] = $paymentProcessorOutcome['payment_processor'] ?? NULL;
     }
     if (!empty($params["is_email_receipt"])) {
       $contributionParams += [
@@ -216,7 +216,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     if (isset($params['non_deductible_amount']) && (!empty($params['non_deductible_amount']))) {
       return $params['non_deductible_amount'];
     }
-    $priceSetId = CRM_Utils_Array::value('priceSetId', $params);
+    $priceSetId = $params['priceSetId'] ?? NULL;
     // return non-deductible amount if it is set at the price field option level
     if ($priceSetId && !empty($form->_lineItem)) {
       $nonDeductibleAmount = CRM_Price_BAO_PriceSet::getNonDeductibleAmountFromPriceSet($priceSetId, $form->_lineItem);
@@ -228,7 +228,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     else {
       if ($financialType->is_deductible) {
         if ($online && isset($params['selectProduct'])) {
-          $selectProduct = CRM_Utils_Array::value('selectProduct', $params);
+          $selectProduct = $params['selectProduct'] ?? NULL;
         }
         if (!$online && isset($params['product_name'][0])) {
           $selectProduct = $params['product_name'][0];
@@ -309,7 +309,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     // if onbehalf-of-organization
     if (!empty($this->_values['onbehalf_profile_id']) && !empty($this->_params['onbehalf']['organization_name'])) {
       if (empty($this->_params['org_option']) && empty($this->_params['organization_id'])) {
-        $this->_params['organization_id'] = CRM_Utils_Array::value('onbehalfof_id', $this->_params);
+        $this->_params['organization_id'] = $this->_params['onbehalfof_id'] ?? NULL;
       }
       $this->_params['organization_name'] = $this->_params['onbehalf']['organization_name'];
       $addressBlocks = [
@@ -514,7 +514,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     }
 
     if (!empty($params['selectProduct']) && $params['selectProduct'] != 'no_thanks') {
-      $option = CRM_Utils_Array::value('options_' . $params['selectProduct'], $params);
+      $option = $params['options_' . $params['selectProduct']] ?? NULL;
       $productID = $params['selectProduct'];
       CRM_Contribute_BAO_Premium::buildPremiumBlock($this, $this->_id, FALSE,
         $productID, $option
@@ -733,7 +733,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
   protected function postProcessPremium($premiumParams, $contribution) {
     $hour = $minute = $second = 0;
     // assigning Premium information to receipt tpl
-    $selectProduct = CRM_Utils_Array::value('selectProduct', $premiumParams);
+    $selectProduct = $premiumParams['selectProduct'] ?? NULL;
     if ($selectProduct &&
       $selectProduct != 'no_thanks'
     ) {
@@ -806,7 +806,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $params = [
         'product_id' => $premiumParams['selectProduct'],
         'contribution_id' => $contribution->id,
-        'product_option' => CRM_Utils_Array::value('options_' . $premiumParams['selectProduct'], $premiumParams),
+        'product_option' => $premiumParams['options_' . $premiumParams['selectProduct']] ?? NULL,
         'quantity' => 1,
         'start_date' => CRM_Utils_Date::customFormat($startDate, '%Y%m%d'),
         'end_date' => CRM_Utils_Date::customFormat($endDate, '%Y%m%d'),
@@ -893,7 +893,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $contactID = $contributionParams['contact_id'];
 
     $isEmailReceipt = !empty($form->_values['is_email_receipt']);
-    $isSeparateMembershipPayment = empty($params['separate_membership_payment']) ? FALSE : TRUE;
+    $isSeparateMembershipPayment = !empty($params['separate_membership_payment']);
     $pledgeID = !empty($params['pledge_id']) ? $params['pledge_id'] : CRM_Utils_Array::value('pledge_id', $form->_values);
     if (!$isSeparateMembershipPayment && !empty($form->_values['pledge_block_id']) &&
       (!empty($params['is_pledge']) || $pledgeID)) {
@@ -918,11 +918,11 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $params['is_email_receipt'] = $isEmailReceipt;
     }
     $params['is_recur'] = $isRecur;
-    $params['payment_instrument_id'] = CRM_Utils_Array::value('payment_instrument_id', $contributionParams);
+    $params['payment_instrument_id'] = $contributionParams['payment_instrument_id'] ?? NULL;
     $recurringContributionID = self::processRecurringContribution($form, $params, $contactID, $financialType);
 
     $now = date('YmdHis');
-    $receiptDate = CRM_Utils_Array::value('receipt_date', $params);
+    $receiptDate = $params['receipt_date'] ?? NULL;
     if ($isEmailReceipt) {
       $receiptDate = $now;
     }
@@ -942,7 +942,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $contribution = CRM_Contribute_BAO_Contribution::add($contributionParams);
 
       $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-      $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+      $invoicing = $invoiceSettings['invoicing'] ?? NULL;
       if ($invoicing) {
         $dataArray = [];
         // @todo - interrogate the line items passed in on the params array.
@@ -954,7 +954,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
                 $dataArray[$value['tax_rate']] = $dataArray[$value['tax_rate']] + CRM_Utils_Array::value('tax_amount', $value);
               }
               else {
-                $dataArray[$value['tax_rate']] = CRM_Utils_Array::value('tax_amount', $value);
+                $dataArray[$value['tax_rate']] = $value['tax_amount'] ?? NULL;
               }
             }
           }
@@ -1053,13 +1053,13 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     }
 
     $recurParams = ['contact_id' => $contactID];
-    $recurParams['amount'] = CRM_Utils_Array::value('amount', $params);
-    $recurParams['auto_renew'] = CRM_Utils_Array::value('auto_renew', $params);
-    $recurParams['frequency_unit'] = CRM_Utils_Array::value('frequency_unit', $params);
-    $recurParams['frequency_interval'] = CRM_Utils_Array::value('frequency_interval', $params);
-    $recurParams['installments'] = CRM_Utils_Array::value('installments', $params);
-    $recurParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params);
-    $recurParams['currency'] = CRM_Utils_Array::value('currency', $params);
+    $recurParams['amount'] = $params['amount'] ?? NULL;
+    $recurParams['auto_renew'] = $params['auto_renew'] ?? NULL;
+    $recurParams['frequency_unit'] = $params['frequency_unit'] ?? NULL;
+    $recurParams['frequency_interval'] = $params['frequency_interval'] ?? NULL;
+    $recurParams['installments'] = $params['installments'] ?? NULL;
+    $recurParams['financial_type_id'] = $params['financial_type_id'] ?? NULL;
+    $recurParams['currency'] = $params['currency'] ?? NULL;
     $recurParams['payment_instrument_id'] = $params['payment_instrument_id'];
 
     // CRM-14354: For an auto-renewing membership with an additional contribution,
@@ -1086,10 +1086,10 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     if (!empty($params['receive_date'])) {
       $recurParams['start_date'] = date('YmdHis', strtotime($params['receive_date']));
     }
-    $recurParams['invoice_id'] = CRM_Utils_Array::value('invoiceID', $params);
+    $recurParams['invoice_id'] = $params['invoiceID'] ?? NULL;
     $recurParams['contribution_status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending');
-    $recurParams['payment_processor_id'] = CRM_Utils_Array::value('payment_processor_id', $params);
-    $recurParams['is_email_receipt'] = CRM_Utils_Array::value('is_email_receipt', $params);
+    $recurParams['payment_processor_id'] = $params['payment_processor_id'] ?? NULL;
+    $recurParams['is_email_receipt'] = $params['is_email_receipt'] ?? NULL;
     // we need to add a unique trxn_id to avoid a unique key error
     // in paypal IPN we reset this when paypal sends us the real trxn id, CRM-2991
     $recurParams['trxn_id'] = CRM_Utils_Array::value('trxn_id', $params, $params['invoiceID']);
@@ -1347,7 +1347,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $membershipType = empty($membershipTypes) ? [] : reset($membershipTypes);
 
     $this->assign('membership_name', CRM_Utils_Array::value('name', $membershipType));
-    $this->_values['membership_name'] = CRM_Utils_Array::value('name', $membershipType);
+    $this->_values['membership_name'] = $membershipType['name'] ?? NULL;
 
     $isPaidMembership = FALSE;
     if ($this->_amount >= 0.0 && isset($membershipParams['amount'])) {
@@ -1366,7 +1366,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $financialTypeID = CRM_Utils_Array::value('financial_type_id', $membershipType, CRM_Utils_Array::value('financial_type_id', $membershipParams));
     }
 
-    if (CRM_Utils_Array::value('membership_source', $this->_params)) {
+    if (!empty($this->_params['membership_source'])) {
       $membershipParams['contribution_source'] = $this->_params['membership_source'];
     }
 
@@ -1513,7 +1513,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
         }
         $i++;
         $numTerms = CRM_Utils_Array::value($memType, $typesTerms, 1);
-        $contributionRecurID = isset($form->_params['contributionRecurID']) ? $form->_params['contributionRecurID'] : NULL;
+        $contributionRecurID = $form->_params['contributionRecurID'] ?? NULL;
 
         $membershipSource = NULL;
         if (!empty($form->_params['membership_source'])) {
@@ -1525,19 +1525,19 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
         }
         $isPayLater = NULL;
         if (isset($form->_params)) {
-          $isPayLater = CRM_Utils_Array::value('is_pay_later', $form->_params);
+          $isPayLater = $form->_params['is_pay_later'] ?? NULL;
         }
         $campaignId = NULL;
         if (isset($form->_values) && is_array($form->_values) && !empty($form->_values)) {
-          $campaignId = CRM_Utils_Array::value('campaign_id', $form->_params);
+          $campaignId = $form->_params['campaign_id'] ?? NULL;
           if (!array_key_exists('campaign_id', $form->_params)) {
-            $campaignId = CRM_Utils_Array::value('campaign_id', $form->_values);
+            $campaignId = $form->_values['campaign_id'] ?? NULL;
           }
         }
 
         // @todo Move this into CRM_Member_BAO_Membership::processMembership
         if (!empty($membershipContribution)) {
-          $pending = ($membershipContribution->contribution_status_id == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending')) ? TRUE : FALSE;
+          $pending = $membershipContribution->contribution_status_id == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending');
         }
         else {
           $pending = $this->getIsPending();
@@ -1706,7 +1706,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $financialType->find(TRUE);
     $tempParams['amount'] = $minimumFee;
     $tempParams['invoiceID'] = md5(uniqid(rand(), TRUE));
-    $isRecur = CRM_Utils_Array::value('is_recur', $tempParams);
+    $isRecur = $tempParams['is_recur'] ?? NULL;
 
     //assign receive date when separate membership payment
     //and contribution amount not selected.
@@ -1926,7 +1926,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $form->_fields['billing_last_name'] = 1;
     // CRM-18854 - Set form values to allow pledge to be created for api test.
     if (!empty($params['pledge_block_id'])) {
-      $form->_values['pledge_id'] = CRM_Utils_Array::value('pledge_id', $params, NULL);
+      $form->_values['pledge_id'] = $params['pledge_id'] ?? NULL;
       $form->_values['pledge_block_id'] = $params['pledge_block_id'];
       $pledgeBlock = CRM_Pledge_BAO_PledgeBlock::getPledgeBlock($params['id']);
       $form->_values['max_reminders'] = $pledgeBlock['max_reminders'];
@@ -1945,7 +1945,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $capabilities[] = (ucfirst($form->_mode) . 'Mode');
     }
     $form->_paymentProcessors = CRM_Financial_BAO_PaymentProcessor::getPaymentProcessors($capabilities);
-    $form->_params['payment_processor_id'] = isset($params['payment_processor_id']) ? $params['payment_processor_id'] : 0;
+    $form->_params['payment_processor_id'] = $params['payment_processor_id'] ?? 0;
     if ($form->_params['payment_processor_id'] !== '') {
       // It can be blank with a $0 transaction - then no processor needs to be selected
       $form->_paymentProcessor = $form->_paymentProcessors[$form->_params['payment_processor_id']];
@@ -2046,7 +2046,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $title = !empty($this->_values['frontend_title']) ? $this->_values['frontend_title'] : $this->_values['title'];
     $this->_params['description'] = ts('Online Contribution') . ': ' . (!empty($this->_pcpInfo['title']) ? $this->_pcpInfo['title'] : $title);
 
-    $this->_params['accountingCode'] = CRM_Utils_Array::value('accountingCode', $this->_values);
+    $this->_params['accountingCode'] = $this->_values['accountingCode'] ?? NULL;
 
     // fix currency ID
     $this->_params['currencyID'] = CRM_Core_Config::singleton()->defaultCurrency;
@@ -2054,11 +2054,11 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     CRM_Contribute_Form_AbstractEditPayment::formatCreditCardDetails($this->_params);
 
     // CRM-18854
-    if (CRM_Utils_Array::value('is_pledge', $this->_params) && !CRM_Utils_Array::value('pledge_id', $this->_values) && CRM_Utils_Array::value('adjust_recur_start_date', $this->_values)) {
+    if (!empty($this->_params['is_pledge']) && empty($this->_values['pledge_id']) && !empty($this->_values['adjust_recur_start_date'])) {
       $pledgeBlock = CRM_Pledge_BAO_PledgeBlock::getPledgeBlock($this->_id);
       if (CRM_Utils_Array::value('start_date', $this->_params) || !CRM_Utils_Array::value('is_pledge_start_date_visible', $pledgeBlock)
           || !CRM_Utils_Array::value('is_pledge_start_date_editable', $pledgeBlock)) {
-        $pledgeStartDate = CRM_Utils_Array::value('start_date', $this->_params, NULL);
+        $pledgeStartDate = $this->_params['start_date'] ?? NULL;
         $this->_params['receive_date'] = CRM_Pledge_BAO_Pledge::getPledgeStartDate($pledgeStartDate, $pledgeBlock);
         $recurParams = CRM_Pledge_BAO_Pledge::buildRecurParams($this->_params);
         $this->_params = array_merge($this->_params, $recurParams);
@@ -2066,7 +2066,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     }
 
     //carry payment processor id.
-    if (CRM_Utils_Array::value('id', $this->_paymentProcessor)) {
+    if (!empty($this->_paymentProcessor['id'])) {
       $this->_params['payment_processor_id'] = $this->_paymentProcessor['id'];
     }
 
@@ -2213,7 +2213,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     //get email primary first if exist
     $subscriptionEmail = ['email' => CRM_Utils_Array::value('email-Primary', $params)];
     if (!$subscriptionEmail['email']) {
-      $subscriptionEmail['email'] = CRM_Utils_Array::value("email-{$this->_bltID}", $params);
+      $subscriptionEmail['email'] = $params["email-{$this->_bltID}"] ?? NULL;
     }
     // subscribing contact to groups
     if (!empty($subscribeGroupIds) && $subscriptionEmail['email']) {
@@ -2276,7 +2276,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       }
       //inherit campaign from contribution page.
       if (!array_key_exists('campaign_id', $membershipParams)) {
-        $membershipParams['campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values);
+        $membershipParams['campaign_id'] = $this->_values['campaign_id'] ?? NULL;
       }
 
       $this->_params = CRM_Core_Payment_Form::mapParams($this->_bltID, $this->_params, $membershipParams, TRUE);
@@ -2478,13 +2478,13 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       try {
         civicrm_api3('contribution', 'completetransaction', [
           'id' => $contributionID,
-          'trxn_id' => CRM_Utils_Array::value('trxn_id', $result),
+          'trxn_id' => $result['trxn_id'] ?? NULL,
           'payment_processor_id' => CRM_Utils_Array::value('payment_processor_id', $result, $this->_paymentProcessor['id']),
           'is_transactional' => FALSE,
-          'fee_amount' => CRM_Utils_Array::value('fee_amount', $result),
-          'receive_date' => CRM_Utils_Array::value('receive_date', $result),
-          'card_type_id' => CRM_Utils_Array::value('card_type_id', $result),
-          'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $result),
+          'fee_amount' => $result['fee_amount'] ?? NULL,
+          'receive_date' => $result['receive_date'] ?? NULL,
+          'card_type_id' => $result['card_type_id'] ?? NULL,
+          'pan_truncation' => $result['pan_truncation'] ?? NULL,
         ]);
       }
       catch (CiviCRM_API3_Exception $e) {
diff --git a/civicrm/CRM/Contribute/Form/Contribution/Main.php b/civicrm/CRM/Contribute/Form/Contribution/Main.php
index 09524cef5c..2c9a0cca8f 100644
--- a/civicrm/CRM/Contribute/Form/Contribution/Main.php
+++ b/civicrm/CRM/Contribute/Form/Contribution/Main.php
@@ -205,7 +205,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
         $selectedCurrentMemTypes = [];
         foreach ($this->_priceSet['fields'] as $key => $val) {
           foreach ($val['options'] as $keys => $values) {
-            $opMemTypeId = CRM_Utils_Array::value('membership_type_id', $values);
+            $opMemTypeId = $values['membership_type_id'] ?? NULL;
             $priceFieldName = 'price_' . $values['price_field_id'];
             $priceFieldValue = CRM_Price_BAO_PriceSet::getPriceFieldValueFromURL($this, $priceFieldName);
             if (!empty($priceFieldValue)) {
@@ -241,7 +241,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
     if (!empty($this->_fields)) {
       //load default campaign from page.
       if (array_key_exists('contribution_campaign_id', $this->_fields)) {
-        $this->_defaults['contribution_campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values);
+        $this->_defaults['contribution_campaign_id'] = $this->_values['campaign_id'] ?? NULL;
       }
 
       //set custom field defaults
@@ -479,7 +479,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
     if (!($allAreBillingModeProcessors && !$this->_values['is_pay_later'])) {
       $submitButton = [
         'type' => 'upload',
-        'name' => CRM_Utils_Array::value('is_confirm_enabled', $this->_values) ? ts('Confirm Contribution') : ts('Contribute'),
+        'name' => !empty($this->_values['is_confirm_enabled']) ? ts('Review your contribution') : ts('Contribute'),
         'spacing' => '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
         'isDefault' => TRUE,
       ];
@@ -528,7 +528,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
       $form->add('hidden', 'frequency_interval', 1);
     }
 
-    $frUnits = CRM_Utils_Array::value('recur_frequency_unit', $form->_values);
+    $frUnits = $form->_values['recur_frequency_unit'] ?? NULL;
     if (empty($frUnits) &&
       $className == 'CRM_Contribute_Form_Contribution'
     ) {
@@ -602,7 +602,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
         $self->_useForMember
       )
     ) {
-      $isTest = ($self->_action & CRM_Core_Action::PREVIEW) ? TRUE : FALSE;
+      $isTest = $self->_action & CRM_Core_Action::PREVIEW;
       $lifeMember = CRM_Member_BAO_Membership::getAllContactMembership($self->_membershipContactID, $isTest, TRUE);
 
       $membershipOrgDetails = CRM_Member_BAO_MembershipType::getMembershipTypeOrganization();
@@ -639,8 +639,8 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
           }
           elseif (!empty($fields["price_{$priceField->id}"])) {
             $otherAmountVal = CRM_Utils_Rule::cleanMoney($fields["price_{$priceField->id}"]);
-            $min = CRM_Utils_Array::value('min_amount', $self->_values);
-            $max = CRM_Utils_Array::value('max_amount', $self->_values);
+            $min = $self->_values['min_amount'] ?? NULL;
+            $max = $self->_values['max_amount'] ?? NULL;
             if ($min && $otherAmountVal < $min) {
               $errors["price_{$priceField->id}"] = ts('Contribution amount must be at least %1',
                 [1 => $min]
@@ -675,7 +675,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
         );
 
         foreach ($self->_values['fee'] as $fieldKey => $fieldValue) {
-          if ($fieldValue['html_type'] != 'Text' && CRM_Utils_Array::value('price_' . $fieldKey, $fields)) {
+          if ($fieldValue['html_type'] != 'Text' && !empty($fields['price_' . $fieldKey])) {
             if (!is_array($fields['price_' . $fieldKey]) && isset($fieldValue['options'][$fields['price_' . $fieldKey]])) {
               if (array_key_exists('membership_type_id', $fieldValue['options'][$fields['price_' . $fieldKey]])
                 && in_array($fieldValue['options'][$fields['price_' . $fieldKey]]['membership_type_id'], $currentMemberships)
@@ -954,15 +954,15 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
     }
     else {
       if (!empty($formValues['amount'])) {
-        $amountID = CRM_Utils_Array::value('amount', $params);
+        $amountID = $params['amount'] ?? NULL;
 
         if ($amountID) {
           // @todo - stop setting amount level in this function & call the CRM_Price_BAO_PriceSet::getAmountLevel
           // function to get correct amount level consistently. Remove setting of the amount level in
           // CRM_Price_BAO_PriceSet::processAmount. Extend the unit tests in CRM_Price_BAO_PriceSetTest
           // to cover all variants.
-          $params['amount_level'] = CRM_Utils_Array::value('label', $formValues[$amountID]);
-          $amount = CRM_Utils_Array::value('value', $formValues[$amountID]);
+          $params['amount_level'] = $formValues[$amountID]['label'] ?? NULL;
+          $amount = $formValues[$amountID]['value'] ?? NULL;
         }
       }
     }
@@ -1019,7 +1019,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
           if (($selectedPriceOptionID = CRM_Utils_Array::value("price_{$priceField->id}", $params)) != FALSE && $selectedPriceOptionID > 0) {
             switch ($priceField->name) {
               case 'membership_amount':
-                $this->_params['selectMembership'] = $params['selectMembership'] = CRM_Utils_Array::value('membership_type_id', $priceOptions[$selectedPriceOptionID]);
+                $this->_params['selectMembership'] = $params['selectMembership'] = $priceOptions[$selectedPriceOptionID]['membership_type_id'] ?? NULL;
                 $this->set('selectMembership', $params['selectMembership']);
 
               case 'contribution_amount':
@@ -1028,12 +1028,12 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
                     ($priceField->name == 'membership_amount' &&
                       CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock) == 0)
                 ) {
-                  $this->_values['amount'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]);
+                  $this->_values['amount'] = $priceOptions[$selectedPriceOptionID]['amount'] ?? NULL;
                 }
-                $this->_values[$selectedPriceOptionID]['value'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]);
-                $this->_values[$selectedPriceOptionID]['label'] = CRM_Utils_Array::value('label', $priceOptions[$selectedPriceOptionID]);
-                $this->_values[$selectedPriceOptionID]['amount_id'] = CRM_Utils_Array::value('id', $priceOptions[$selectedPriceOptionID]);
-                $this->_values[$selectedPriceOptionID]['weight'] = CRM_Utils_Array::value('weight', $priceOptions[$selectedPriceOptionID]);
+                $this->_values[$selectedPriceOptionID]['value'] = $priceOptions[$selectedPriceOptionID]['amount'] ?? NULL;
+                $this->_values[$selectedPriceOptionID]['label'] = $priceOptions[$selectedPriceOptionID]['label'] ?? NULL;
+                $this->_values[$selectedPriceOptionID]['amount_id'] = $priceOptions[$selectedPriceOptionID]['id'] ?? NULL;
+                $this->_values[$selectedPriceOptionID]['weight'] = $priceOptions[$selectedPriceOptionID]['weight'] ?? NULL;
                 break;
 
               case 'other_amount':
@@ -1104,7 +1104,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
             $params['price_' . $key] = CRM_Utils_Rule::cleanMoney($params['price_' . $key]);
             if ($params['price_' . $key] != 0) {
               foreach ($val['options'] as $optionKey => & $options) {
-                $options['amount'] = CRM_Utils_Array::value('price_' . $key, $params);
+                $options['amount'] = $params['price_' . $key] ?? NULL;
                 break;
               }
             }
diff --git a/civicrm/CRM/Contribute/Form/Contribution/ThankYou.php b/civicrm/CRM/Contribute/Form/Contribution/ThankYou.php
index 65d4fb1fa9..41d8077543 100644
--- a/civicrm/CRM/Contribute/Form/Contribution/ThankYou.php
+++ b/civicrm/CRM/Contribute/Form/Contribution/ThankYou.php
@@ -204,7 +204,7 @@ class CRM_Contribute_Form_Contribution_ThankYou extends CRM_Contribute_Form_Cont
       $this->buildCustom($this->_values['onbehalf_profile_id'], 'onbehalfProfile', TRUE, 'onbehalf', $fieldTypes);
     }
 
-    $this->_trxnId = CRM_Utils_Array::value('trxn_id', $this->_params);
+    $this->_trxnId = $this->_params['trxn_id'] ?? NULL;
 
     $this->assign('trxn_id', $this->_trxnId);
 
@@ -283,10 +283,10 @@ class CRM_Contribute_Form_Contribution_ThankYou extends CRM_Contribute_Form_Cont
     try {
       // A payment notification update could have come in at any time. Check at the last minute.
       $contributionStatusID = civicrm_api3('Contribution', 'getvalue', [
-        'id' => CRM_Utils_Array::value('contributionID', $params),
+        'id' => $params['contributionID'] ?? NULL,
         'return' => 'contribution_status_id',
         'is_test'   => ($this->_mode == 'test') ? 1 : 0,
-        'invoice_id' => CRM_Utils_Array::value('invoiceID', $params),
+        'invoice_id' => $params['invoiceID'] ?? NULL,
       ]);
       if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $contributionStatusID) === 'Pending'
         && !empty($params['payment_processor_id'])
diff --git a/civicrm/CRM/Contribute/Form/ContributionBase.php b/civicrm/CRM/Contribute/Form/ContributionBase.php
index aa08c053ce..300ebbbf6c 100644
--- a/civicrm/CRM/Contribute/Form/ContributionBase.php
+++ b/civicrm/CRM/Contribute/Form/ContributionBase.php
@@ -200,7 +200,7 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
    * @return bool
    */
   public function isQuickConfig() {
-    return isset(self::$_quickConfig) ? self::$_quickConfig : FALSE;
+    return self::$_quickConfig ?? FALSE;
   }
 
   /**
@@ -316,8 +316,8 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
       $this->assignBillingType();
 
       // check for is_monetary status
-      $isMonetary = CRM_Utils_Array::value('is_monetary', $this->_values);
-      $isPayLater = CRM_Utils_Array::value('is_pay_later', $this->_values);
+      $isMonetary = $this->_values['is_monetary'] ?? NULL;
+      $isPayLater = $this->_values['is_pay_later'] ?? NULL;
       if (!empty($this->_ccid)) {
         $this->_values['financial_type_id'] = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution',
           $this->_ccid,
@@ -382,10 +382,10 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
       $pledgeBlock = CRM_Pledge_BAO_PledgeBlock::getPledgeBlock($this->_id);
 
       if ($pledgeBlock) {
-        $this->_values['pledge_block_id'] = CRM_Utils_Array::value('id', $pledgeBlock);
-        $this->_values['max_reminders'] = CRM_Utils_Array::value('max_reminders', $pledgeBlock);
-        $this->_values['initial_reminder_day'] = CRM_Utils_Array::value('initial_reminder_day', $pledgeBlock);
-        $this->_values['additional_reminder_day'] = CRM_Utils_Array::value('additional_reminder_day', $pledgeBlock);
+        $this->_values['pledge_block_id'] = $pledgeBlock['id'] ?? NULL;
+        $this->_values['max_reminders'] = $pledgeBlock['max_reminders'] ?? NULL;
+        $this->_values['initial_reminder_day'] = $pledgeBlock['initial_reminder_day'] ?? NULL;
+        $this->_values['additional_reminder_day'] = $pledgeBlock['additional_reminder_day'] ?? NULL;
 
         //set pledge id in values
         $pledgeId = CRM_Utils_Request::retrieve('pledgeId', 'Positive', $this);
@@ -481,8 +481,8 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
     }
 
     // check if billing block is required for pay later
-    if (CRM_Utils_Array::value('is_pay_later', $this->_values)) {
-      $this->_isBillingAddressRequiredForPayLater = CRM_Utils_Array::value('is_billing_required', $this->_values);
+    if (!empty($this->_values['is_pay_later'])) {
+      $this->_isBillingAddressRequiredForPayLater = $this->_values['is_billing_required'] ?? NULL;
       $this->assign('isBillingAddressRequiredForPayLater', $this->_isBillingAddressRequiredForPayLater);
     }
   }
@@ -656,14 +656,14 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
             $field['data_type'] == 'File' || ($viewOnly && $field['name'] == 'image_URL')
           ) {
             //retrieve file value from submitted values on basis of $profileContactType
-            $fileValue = CRM_Utils_Array::value($key, $this->_params);
+            $fileValue = $this->_params[$key] ?? NULL;
             if (!empty($profileContactType) && !empty($this->_params[$profileContactType])) {
-              $fileValue = CRM_Utils_Array::value($key, $this->_params[$profileContactType]);
+              $fileValue = $this->_params[$profileContactType][$key] ?? NULL;
             }
 
             if ($fileValue) {
-              $path = CRM_Utils_Array::value('name', $fileValue);
-              $fileType = CRM_Utils_Array::value('type', $fileValue);
+              $path = $fileValue['name'] ?? NULL;
+              $fileType = $fileValue['type'] ?? NULL;
               $fileValue = CRM_Utils_File::getFileURL($path, $fileType);
             }
 
@@ -951,7 +951,7 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
 
         $form->assign('fieldSetTitle', CRM_Core_BAO_UFGroup::getTitle($form->_values['onbehalf_profile_id']));
 
-        if (CRM_Utils_Array::value('is_for_organization', $form->_values)) {
+        if (!empty($form->_values['is_for_organization'])) {
           if ($form->_values['is_for_organization'] == 2) {
             $form->assign('onBehalfRequired', TRUE);
           }
@@ -1149,12 +1149,12 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
       $this->_currentMemberships = [];
 
       $membershipTypeIds = $membershipTypes = $radio = [];
-      $membershipPriceset = (!empty($this->_priceSetId) && $this->_useForMember) ? TRUE : FALSE;
+      $membershipPriceset = (!empty($this->_priceSetId) && $this->_useForMember);
 
       $allowAutoRenewMembership = $autoRenewOption = FALSE;
       $autoRenewMembershipTypeOptions = [];
 
-      $separateMembershipPayment = CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock);
+      $separateMembershipPayment = $this->_membershipBlock['is_separate_payment'] ?? NULL;
 
       if ($membershipPriceset) {
         foreach ($this->_priceSet['fields'] as $pField) {
@@ -1225,7 +1225,8 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
 
             if ($allowAutoRenewOpt) {
               $javascriptMethod = ['onclick' => "return showHideAutoRenew( this.value );"];
-              $autoRenewMembershipTypeOptions["autoRenewMembershipType_{$value}"] = (int) $memType['auto_renew'] * CRM_Utils_Array::value($value, CRM_Utils_Array::value('auto_renew', $this->_membershipBlock));
+              $isAvailableAutoRenew = $this->_membershipBlock['auto_renew'][$value] ?? 1;
+              $autoRenewMembershipTypeOptions["autoRenewMembershipType_{$value}"] = (int) $memType['auto_renew'] * $isAvailableAutoRenew;
               $allowAutoRenewMembership = TRUE;
             }
             else {
@@ -1283,7 +1284,7 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
       $this->assign('allowAutoRenewMembership', $allowAutoRenewMembership);
       $this->assign('autoRenewMembershipTypeOptions', json_encode($autoRenewMembershipTypeOptions));
       //give preference to user submitted auto_renew value.
-      $takeUserSubmittedAutoRenew = (!empty($_POST) || $this->isSubmitted()) ? TRUE : FALSE;
+      $takeUserSubmittedAutoRenew = (!empty($_POST) || $this->isSubmitted());
       $this->assign('takeUserSubmittedAutoRenew', $takeUserSubmittedAutoRenew);
 
       // Assign autorenew option (0:hide,1:optional,2:required) so we can use it in confirmation etc.
@@ -1346,7 +1347,7 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
    * Arguably the form should start to build $this->_params in the pre-process main page & use that array consistently throughout.
    */
   protected function setRecurringMembershipParams() {
-    $selectedMembershipTypeID = CRM_Utils_Array::value('selectMembership', $this->_params);
+    $selectedMembershipTypeID = $this->_params['selectMembership'] ?? NULL;
     if ($selectedMembershipTypeID) {
       // @todo the price_x fields will ALWAYS allow us to determine the membership - so we should ignore
       // 'selectMembership' and calculate from the price_x fields so we have one method that always works
diff --git a/civicrm/CRM/Contribute/Form/ContributionCharts.php b/civicrm/CRM/Contribute/Form/ContributionCharts.php
index 3b498b6b1a..84da27929d 100644
--- a/civicrm/CRM/Contribute/Form/ContributionCharts.php
+++ b/civicrm/CRM/Contribute/Form/ContributionCharts.php
@@ -139,7 +139,7 @@ class CRM_Contribute_Form_ContributionCharts extends CRM_Core_Form {
     $monthlyChart = $yearlyChart = FALSE;
 
     foreach ($chartData as $chartKey => & $values) {
-      $chartValues = CRM_Utils_Array::value('values', $values);
+      $chartValues = $values['values'] ?? NULL;
 
       if (!is_array($chartValues) || empty($chartValues)) {
         continue;
@@ -214,7 +214,7 @@ class CRM_Contribute_Form_ContributionCharts extends CRM_Core_Form {
     // finally assign this chart data to template.
     $this->assign('hasYearlyChart', $yearlyChart);
     $this->assign('hasByMonthChart', $monthlyChart);
-    $this->assign('hasChart', empty($chartData) ? FALSE : TRUE);
+    $this->assign('hasChart', !empty($chartData));
     $this->assign('chartData', json_encode($chartData ?? []));
   }
 
diff --git a/civicrm/CRM/Contribute/Form/ContributionPage.php b/civicrm/CRM/Contribute/Form/ContributionPage.php
index 1373abedca..ba8bb64ec0 100644
--- a/civicrm/CRM/Contribute/Form/ContributionPage.php
+++ b/civicrm/CRM/Contribute/Form/ContributionPage.php
@@ -156,7 +156,7 @@ class CRM_Contribute_Form_ContributionPage extends CRM_Core_Form {
     $this->applyFilter('__ALL__', 'trim');
 
     $session = CRM_Core_Session::singleton();
-    $this->_cancelURL = CRM_Utils_Array::value('cancelURL', $_POST);
+    $this->_cancelURL = $_POST['cancelURL'] ?? NULL;
 
     if (!$this->_cancelURL) {
       $this->_cancelURL = CRM_Utils_System::url('civicrm/admin/contribute', 'reset=1');
@@ -289,7 +289,7 @@ class CRM_Contribute_Form_ContributionPage extends CRM_Core_Form {
         'is_pledge_start_date_editable',
       ];
       foreach ($pledgeBlock as $key) {
-        $defaults[$key] = CRM_Utils_Array::value($key, $pledgeBlockDefaults);
+        $defaults[$key] = $pledgeBlockDefaults[$key] ?? NULL;
         if ($key == 'pledge_start_date' && !empty($pledgeBlockDefaults[$key])) {
           $defaultPledgeDate = (array) json_decode($pledgeBlockDefaults['pledge_start_date']);
           $pledgeDateFields = [
diff --git a/civicrm/CRM/Contribute/Form/ContributionPage/Amount.php b/civicrm/CRM/Contribute/Form/ContributionPage/Amount.php
index 499af139b7..fa519e68ba 100644
--- a/civicrm/CRM/Contribute/Form/ContributionPage/Amount.php
+++ b/civicrm/CRM/Contribute/Form/ContributionPage/Amount.php
@@ -226,8 +226,8 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
               foreach ($options as $optionId => $optionValue) {
                 $countRow++;
                 $defaults['value'][$countRow] = $optionValue['amount'];
-                $defaults['label'][$countRow] = CRM_Utils_Array::value('label', $optionValue);
-                $defaults['name'][$countRow] = CRM_Utils_Array::value('name', $optionValue);
+                $defaults['label'][$countRow] = $optionValue['label'] ?? NULL;
+                $defaults['name'][$countRow] = $optionValue['name'] ?? NULL;
                 $defaults['weight'][$countRow] = $optionValue['weight'];
 
                 $defaults["price_field_value"][$countRow] = $optionValue['id'];
@@ -339,8 +339,8 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
     if (!empty($fields['amount_block_is_active']) && empty($fields['price_set_id']) && empty($fields['amount_label'])) {
       $errors['amount_label'] = ts('Please enter the contribution amount label.');
     }
-    $minAmount = CRM_Utils_Array::value('min_amount', $fields);
-    $maxAmount = CRM_Utils_Array::value('max_amount', $fields);
+    $minAmount = $fields['min_amount'] ?? NULL;
+    $maxAmount = $fields['max_amount'] ?? NULL;
     if (!empty($minAmount) && !empty($maxAmount)) {
       $minAmount = CRM_Utils_Rule::cleanMoney($minAmount);
       $maxAmount = CRM_Utils_Rule::cleanMoney($maxAmount);
@@ -395,7 +395,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
           !$priceSetId
         ) {
           //get the values of amount block
-          $values = CRM_Utils_Array::value('value', $fields);
+          $values = $fields['value'] ?? NULL;
           $isSetRow = FALSE;
           for ($i = 1; $i < self::NUM_OPTION; $i++) {
             if ((isset($values[$i]) && (strlen(trim($values[$i])) > 0))) {
@@ -439,7 +439,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
     }
 
     // check for price set.
-    $priceSetID = CRM_Utils_Array::value('price_set_id', $params);
+    $priceSetID = $params['price_set_id'] ?? NULL;
 
     // get required fields.
     $fields = [
@@ -565,9 +565,9 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
           // process contribution amount block
           $deleteAmountBlk = FALSE;
 
-          $labels = CRM_Utils_Array::value('label', $params);
-          $values = CRM_Utils_Array::value('value', $params);
-          $default = CRM_Utils_Array::value('default', $params);
+          $labels = $params['label'] ?? NULL;
+          $values = $params['value'] ?? NULL;
+          $default = $params['default'] ?? NULL;
 
           $options = [];
           for ($i = 1; $i < self::NUM_OPTION; $i++) {
@@ -603,7 +603,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
                 $setParams['name'] = $pageTitle . '_' . date('is', $timeSec[0]) . $timeSec[1];
               }
               $setParams['is_quick_config'] = 1;
-              $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
+              $setParams['financial_type_id'] = $this->_values['financial_type_id'] ?? NULL;
               $setParams['extends'] = CRM_Core_Component::getComponentID('CiviContribute');
               $priceSet = CRM_Price_BAO_PriceSet::create($setParams);
               $priceSetId = $priceSet->id;
@@ -620,7 +620,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
                   }
                 }
                 if (implode('', $params['price_field_value'])) {
-                  $fieldParams['id'] = CRM_Utils_Array::value('price_field_id', $params);
+                  $fieldParams['id'] = $params['price_field_id'] ?? NULL;
                   $fieldParams['option_id'] = $params['price_field_value'];
                 }
                 else {
@@ -629,7 +629,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
                 }
               }
               else {
-                $priceFieldId = CRM_Utils_Array::value('price_field_other', $params);
+                $priceFieldId = $params['price_field_other'] ?? NULL;
               }
               $priceSetId = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $priceFieldId, 'price_set_id');
             }
@@ -646,7 +646,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
                 $fieldParams['name'] = strtolower(CRM_Utils_String::munge("Contribution Amount", '_', 245));
               }
               else {
-                $fieldParams['id'] = CRM_Utils_Array::value('id', $editedResults);
+                $fieldParams['id'] = $editedResults['id'] ?? NULL;
               }
 
               $fieldParams['price_set_id'] = $priceSetId;
@@ -663,7 +663,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
               $fieldParams['html_type'] = 'Radio';
               $fieldParams['option_label'] = $params['label'];
               $fieldParams['option_amount'] = $params['value'];
-              $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
+              $fieldParams['financial_type_id'] = $this->_values['financial_type_id'] ?? NULL;
               foreach ($options as $value) {
                 $fieldParams['option_weight'][$value['weight']] = $value['weight'];
               }
@@ -685,7 +685,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
                   'label' => ts('Other Amount'),
                   'price_set_id' => $priceSetId,
                   'html_type' => 'Text',
-                  'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $this->_values),
+                  'financial_type_id' => $this->_values['financial_type_id'] ?? NULL,
                   'is_display_amounts' => 0,
                   'weight' => 3,
                 ];
@@ -759,7 +759,7 @@ class CRM_Contribute_Form_ContributionPage_Amount extends CRM_Contribute_Form_Co
               'is_pledge_start_date_editable',
             ];
             foreach ($pledgeBlock as $key) {
-              $pledgeBlockParams[$key] = CRM_Utils_Array::value($key, $params);
+              $pledgeBlockParams[$key] = $params[$key] ?? NULL;
             }
             $pledgeBlockParams['is_pledge_interval'] = CRM_Utils_Array::value('is_pledge_interval',
               $params, FALSE
diff --git a/civicrm/CRM/Contribute/Form/ContributionRecur.php b/civicrm/CRM/Contribute/Form/ContributionRecur.php
index cae5e1e255..f313d5be22 100644
--- a/civicrm/CRM/Contribute/Form/ContributionRecur.php
+++ b/civicrm/CRM/Contribute/Form/ContributionRecur.php
@@ -192,7 +192,7 @@ class CRM_Contribute_Form_ContributionRecur extends CRM_Core_Form {
    */
   protected function getSubscriptionContactID() {
     $sub = $this->getSubscriptionDetails();
-    return isset($sub->contact_id) ? $sub->contact_id : FALSE;
+    return $sub->contact_id ?? FALSE;
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/Form/Search.php b/civicrm/CRM/Contribute/Form/Search.php
index abe1b63316..3eef9ebb6e 100644
--- a/civicrm/CRM/Contribute/Form/Search.php
+++ b/civicrm/CRM/Contribute/Form/Search.php
@@ -276,7 +276,7 @@ class CRM_Contribute_Form_Search extends CRM_Core_Form_Search {
       CRM_Contact_BAO_Query::processSpecialFormValue($this->_formValues, $specialParams);
 
       // @todo - stop changing formValues - respect submitted form values, change a working array.
-      $tags = CRM_Utils_Array::value('contact_tags', $this->_formValues);
+      $tags = $this->_formValues['contact_tags'] ?? NULL;
       if ($tags && !is_array($tags)) {
         // @todo - stop changing formValues - respect submitted form values, change a working array.
         unset($this->_formValues['contact_tags']);
@@ -291,7 +291,7 @@ class CRM_Contribute_Form_Search extends CRM_Core_Form_Search {
         }
       }
 
-      $group = CRM_Utils_Array::value('group', $this->_formValues);
+      $group = $this->_formValues['group'] ?? NULL;
       if ($group && !is_array($group)) {
         // @todo - stop changing formValues - respect submitted form values, change a working array.
         unset($this->_formValues['group']);
diff --git a/civicrm/CRM/Contribute/Form/SoftCredit.php b/civicrm/CRM/Contribute/Form/SoftCredit.php
index 5b5d9c802f..d8c7bfa8de 100644
--- a/civicrm/CRM/Contribute/Form/SoftCredit.php
+++ b/civicrm/CRM/Contribute/Form/SoftCredit.php
@@ -148,14 +148,14 @@ class CRM_Contribute_Form_SoftCredit {
     if (!empty($form->_softCreditInfo['pcp_id'])) {
       $noPCP = FALSE;
       $pcpInfo = $form->_softCreditInfo;
-      $pcpId = CRM_Utils_Array::value('pcp_id', $pcpInfo);
+      $pcpId = $pcpInfo['pcp_id'] ?? NULL;
       $pcpTitle = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP', $pcpId, 'title');
       $contributionPageTitle = CRM_PCP_BAO_PCP::getPcpPageTitle($pcpId, 'contribute');
       $defaults['pcp_made_through'] = CRM_Utils_Array::value('sort_name', $pcpInfo) . " :: " . $pcpTitle . " :: " . $contributionPageTitle;
-      $defaults['pcp_made_through_id'] = CRM_Utils_Array::value('pcp_id', $pcpInfo);
-      $defaults['pcp_display_in_roll'] = CRM_Utils_Array::value('pcp_display_in_roll', $pcpInfo);
-      $defaults['pcp_roll_nickname'] = CRM_Utils_Array::value('pcp_roll_nickname', $pcpInfo);
-      $defaults['pcp_personal_note'] = CRM_Utils_Array::value('pcp_personal_note', $pcpInfo);
+      $defaults['pcp_made_through_id'] = $pcpInfo['pcp_id'] ?? NULL;
+      $defaults['pcp_display_in_roll'] = $pcpInfo['pcp_display_in_roll'] ?? NULL;
+      $defaults['pcp_roll_nickname'] = $pcpInfo['pcp_roll_nickname'] ?? NULL;
+      $defaults['pcp_personal_note'] = $pcpInfo['pcp_personal_note'] ?? NULL;
     }
 
     $form->assign('noSoftCredit', $noSoftCredit);
diff --git a/civicrm/CRM/Contribute/Form/Task.php b/civicrm/CRM/Contribute/Form/Task.php
index e77b575fe4..16d6116667 100644
--- a/civicrm/CRM/Contribute/Form/Task.php
+++ b/civicrm/CRM/Contribute/Form/Task.php
@@ -57,7 +57,7 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form_Task {
 
     $values = $form->controller->exportValues($form->get('searchFormName'));
 
-    $form->_task = CRM_Utils_Array::value('task', $values);
+    $form->_task = $values['task'] ?? NULL;
     $contributeTasks = CRM_Contribute_Task::tasks();
     $form->assign('taskName', CRM_Utils_Array::value($form->_task, $contributeTasks));
 
diff --git a/civicrm/CRM/Contribute/Form/Task/Batch.php b/civicrm/CRM/Contribute/Form/Task/Batch.php
index 4a35044f43..a22383623e 100644
--- a/civicrm/CRM/Contribute/Form/Task/Batch.php
+++ b/civicrm/CRM/Contribute/Form/Task/Batch.php
@@ -135,7 +135,7 @@ class CRM_Contribute_Form_Task_Batch extends CRM_Contribute_Form_Task {
       foreach ($this->_fields as $name => $field) {
         $entityColumnValue = [];
         if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($name)) {
-          $customValue = CRM_Utils_Array::value($customFieldID, $customFields);
+          $customValue = $customFields[$customFieldID] ?? NULL;
           if (!empty($customValue['extends_entity_column_value'])) {
             $entityColumnValue = explode(CRM_Core_DAO::VALUE_SEPARATOR,
               $customValue['extends_entity_column_value']
diff --git a/civicrm/CRM/Contribute/Form/Task/Email.php b/civicrm/CRM/Contribute/Form/Task/Email.php
index d060bd2f18..f4819c6957 100644
--- a/civicrm/CRM/Contribute/Form/Task/Email.php
+++ b/civicrm/CRM/Contribute/Form/Task/Email.php
@@ -19,23 +19,7 @@
  * This class provides the functionality to email a group of contacts.
  */
 class CRM_Contribute_Form_Task_Email extends CRM_Contribute_Form_Task {
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_single = FALSE;
-
-  public $_noEmails = FALSE;
-
-  /**
-   * All the existing templates in the system.
-   *
-   * @var array
-   */
-  public $_templates = NULL;
+  use CRM_Contact_Form_Task_EmailTrait;
 
   /**
    * Build all the data structures needed to build the form.
@@ -50,23 +34,6 @@ class CRM_Contribute_Form_Task_Email extends CRM_Contribute_Form_Task {
     $this->assign('single', $this->_single);
   }
 
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    //enable form element
-    $this->assign('emailTask', TRUE);
-
-    CRM_Contact_Form_Task_EmailCommon::buildQuickForm($this);
-  }
-
-  /**
-   * Process the form after the input has been submitted and validated.
-   */
-  public function postProcess() {
-    CRM_Contact_Form_Task_EmailCommon::postProcess($this);
-  }
-
   /**
    * List available tokens for this form.
    *
diff --git a/civicrm/CRM/Contribute/Form/Task/Invoice.php b/civicrm/CRM/Contribute/Form/Task/Invoice.php
index d01811b9cd..2be79628b1 100644
--- a/civicrm/CRM/Contribute/Form/Task/Invoice.php
+++ b/civicrm/CRM/Contribute/Form/Task/Invoice.php
@@ -212,9 +212,6 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
     $cancelledStatusId = CRM_Utils_Array::key('Cancelled', $contributionStatusID);
     $pendingStatusId = CRM_Utils_Array::key('Pending', $contributionStatusID);
 
-    // getting data from admin page
-    $prefixValue = Civi::settings()->get('contribution_invoice_settings');
-
     foreach ($invoiceElements['details'] as $contribID => $detail) {
       $input = $ids = $objects = [];
       if (in_array($detail['contact'], $invoiceElements['excludeContactIds'])) {
@@ -227,9 +224,9 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       $ids['contribution'] = $contribID;
       $ids['contributionRecur'] = NULL;
       $ids['contributionPage'] = NULL;
-      $ids['membership'] = CRM_Utils_Array::value('membership', $detail);
-      $ids['participant'] = CRM_Utils_Array::value('participant', $detail);
-      $ids['event'] = CRM_Utils_Array::value('event', $detail);
+      $ids['membership'] = $detail['membership'] ?? NULL;
+      $ids['participant'] = $detail['participant'] ?? NULL;
+      $ids['event'] = $detail['event'] ?? NULL;
 
       if (!$invoiceElements['baseIPN']->validateData($input, $ids, $objects, FALSE)) {
         CRM_Core_Error::fatal();
@@ -268,7 +265,9 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       //to obtain due date for PDF invoice
       $contributionReceiveDate = date('F j,Y', strtotime(date($input['receive_date'])));
       $invoiceDate = date("F j, Y");
-      $dueDate = date('F j, Y', strtotime($contributionReceiveDate . "+" . $prefixValue['due_date'] . "" . $prefixValue['due_date_period']));
+      $dueDateSetting = Civi::settings()->get('invoice_due_date');
+      $dueDatePeriodSetting = Civi::settings()->get('invoice_due_date_period');
+      $dueDate = date('F j, Y', strtotime($contributionReceiveDate . "+" . $dueDateSetting . "" . $dueDatePeriodSetting));
 
       $amountPaid = CRM_Core_BAO_FinancialTrxn::getTotalPayments($contribID, TRUE);
       $amountDue = ($input['amount'] - $amountPaid);
@@ -282,7 +281,7 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
           $dataArray[(string) $taxRate['tax_rate']] = $dataArray[(string) $taxRate['tax_rate']] + CRM_Utils_Array::value('tax_amount', $taxRate);
         }
         else {
-          $dataArray[(string) $taxRate['tax_rate']] = CRM_Utils_Array::value('tax_amount', $taxRate);
+          $dataArray[(string) $taxRate['tax_rate']] = $taxRate['tax_amount'] ?? NULL;
         }
         $subTotal += CRM_Utils_Array::value('subTotal', $taxRate);
       }
@@ -299,11 +298,11 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
           'confirm_from_email',
         ];
         CRM_Core_DAO::commonRetrieveAll($daoName, 'id', $pageId, $mailDetails, $mailElements);
-        $values['title'] = CRM_Utils_Array::value('title', $mailDetails[$contribution->_relatedObjects['event']->id]);
-        $values['confirm_from_name'] = CRM_Utils_Array::value('confirm_from_name', $mailDetails[$contribution->_relatedObjects['event']->id]);
-        $values['confirm_from_email'] = CRM_Utils_Array::value('confirm_from_email', $mailDetails[$contribution->_relatedObjects['event']->id]);
+        $values['title'] = $mailDetails[$contribution->_relatedObjects['event']->id]['title'] ?? NULL;
+        $values['confirm_from_name'] = $mailDetails[$contribution->_relatedObjects['event']->id]['confirm_from_name'] ?? NULL;
+        $values['confirm_from_email'] = $mailDetails[$contribution->_relatedObjects['event']->id]['confirm_from_email'] ?? NULL;
 
-        $title = CRM_Utils_Array::value('title', $mailDetails[$contribution->_relatedObjects['event']->id]);
+        $title = $mailDetails[$contribution->_relatedObjects['event']->id]['title'] ?? NULL;
       }
       elseif ($contribution->_component == 'contribute') {
         $daoName = 'CRM_Contribute_DAO_ContributionPage';
@@ -349,6 +348,8 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
         $countryDomain = '';
       }
 
+      $invoiceNotes = Civi::settings()->get('invoice_notes') ?? NULL;
+
       // parameters to be assign for template
       $tplParams = [
         'title' => $title,
@@ -364,7 +365,7 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
         'amountPaid' => $amountPaid,
         'invoice_date' => $invoiceDate,
         'dueDate' => $dueDate,
-        'notes' => CRM_Utils_Array::value('notes', $prefixValue),
+        'notes' => $invoiceNotes,
         'display_name' => $contribution->_relatedObjects['contact']->display_name,
         'lineItem' => $lineItem,
         'dataArray' => $dataArray,
@@ -374,17 +375,17 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
         'contribution_status_id' => $contribution->contribution_status_id,
         'contributionStatusName' => CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $contribution->contribution_status_id),
         'subTotal' => $subTotal,
-        'street_address' => CRM_Utils_Array::value('street_address', $billingAddress),
-        'supplemental_address_1' => CRM_Utils_Array::value('supplemental_address_1', $billingAddress),
-        'supplemental_address_2' => CRM_Utils_Array::value('supplemental_address_2', $billingAddress),
-        'supplemental_address_3' => CRM_Utils_Array::value('supplemental_address_3', $billingAddress),
-        'city' => CRM_Utils_Array::value('city', $billingAddress),
-        'postal_code' => CRM_Utils_Array::value('postal_code', $billingAddress),
-        'state_province' => CRM_Utils_Array::value('state_province', $billingAddress),
-        'state_province_abbreviation' => CRM_Utils_Array::value('state_province_abbreviation', $billingAddress),
+        'street_address' => $billingAddress['street_address'] ?? NULL,
+        'supplemental_address_1' => $billingAddress['supplemental_address_1'] ?? NULL,
+        'supplemental_address_2' => $billingAddress['supplemental_address_2'] ?? NULL,
+        'supplemental_address_3' => $billingAddress['supplemental_address_3'] ?? NULL,
+        'city' => $billingAddress['city'] ?? NULL,
+        'postal_code' => $billingAddress['postal_code'] ?? NULL,
+        'state_province' => $billingAddress['state_province'] ?? NULL,
+        'state_province_abbreviation' => $billingAddress['state_province_abbreviation'] ?? NULL,
         // Kept for backwards compatibility
-        'stateProvinceAbbreviation' => CRM_Utils_Array::value('state_province_abbreviation', $billingAddress),
-        'country' => CRM_Utils_Array::value('country', $billingAddress),
+        'stateProvinceAbbreviation' => $billingAddress['state_province_abbreviation'] ?? NULL,
+        'country' => $billingAddress['country'] ?? NULL,
         'is_pay_later' => $contribution->is_pay_later,
         'organization_name' => $contribution->_relatedObjects['contact']->organization_name,
         'domain_organization' => $domain->name,
@@ -414,7 +415,7 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       ];
 
       // from email address
-      $fromEmailAddress = CRM_Utils_Array::value('from_email_address', $params);
+      $fromEmailAddress = $params['from_email_address'] ?? NULL;
 
       // condition to check for download PDF Invoice or email Invoice
       if ($invoiceElements['createPdf']) {
@@ -442,8 +443,8 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
         $sendTemplateParams['tplParams'] = array_merge($tplParams, ['email_comment' => $invoiceElements['params']['email_comment']]);
         $sendTemplateParams['from'] = $fromEmailAddress;
         $sendTemplateParams['toEmail'] = $email;
-        $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc_receipt', $values);
-        $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc_receipt', $values);
+        $sendTemplateParams['cc'] = $values['cc_receipt'] ?? NULL;
+        $sendTemplateParams['bcc'] = $values['bcc_receipt'] ?? NULL;
 
         list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
         // functions call for adding activity with attachment
@@ -456,8 +457,8 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
         $sendTemplateParams['tplParams'] = array_merge($tplParams, ['email_comment' => $invoiceElements['params']['email_comment']]);
         $sendTemplateParams['from'] = $fromEmailAddress;
         $sendTemplateParams['toEmail'] = $email;
-        $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc_confirm', $values);
-        $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc_confirm', $values);
+        $sendTemplateParams['cc'] = $values['cc_confirm'] ?? NULL;
+        $sendTemplateParams['bcc'] = $values['bcc_confirm'] ?? NULL;
 
         list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
         // functions call for adding activity with attachment
diff --git a/civicrm/CRM/Contribute/Form/Task/PDF.php b/civicrm/CRM/Contribute/Form/Task/PDF.php
index 9eea32cd4b..8b192d66f6 100644
--- a/civicrm/CRM/Contribute/Form/Task/PDF.php
+++ b/civicrm/CRM/Contribute/Form/Task/PDF.php
@@ -154,9 +154,9 @@ AND    {$this->_componentClause}";
       $ids['contribution'] = $contribID;
       $ids['contributionRecur'] = NULL;
       $ids['contributionPage'] = NULL;
-      $ids['membership'] = CRM_Utils_Array::value('membership', $detail);
-      $ids['participant'] = CRM_Utils_Array::value('participant', $detail);
-      $ids['event'] = CRM_Utils_Array::value('event', $detail);
+      $ids['membership'] = $detail['membership'] ?? NULL;
+      $ids['participant'] = $detail['participant'] ?? NULL;
+      $ids['event'] = $detail['event'] ?? NULL;
 
       if (!$elements['baseIPN']->validateData($input, $ids, $objects, FALSE)) {
         throw new CRM_Core_Exception('invalid data');
@@ -170,7 +170,7 @@ AND    {$this->_componentClause}";
       $input['fee_amount'] = $contribution->fee_amount;
       $input['net_amount'] = $contribution->net_amount;
       $input['trxn_id'] = $contribution->trxn_id;
-      $input['trxn_date'] = isset($contribution->trxn_date) ? $contribution->trxn_date : NULL;
+      $input['trxn_date'] = $contribution->trxn_date ?? NULL;
       $input['receipt_update'] = $params['receipt_update'];
       $input['contribution_status_id'] = $contribution->contribution_status_id;
       $input['paymentProcessor'] = empty($contribution->trxn_id) ? NULL :
diff --git a/civicrm/CRM/Contribute/Form/Task/PDFLetter.php b/civicrm/CRM/Contribute/Form/Task/PDFLetter.php
index 5348321f87..fe602c7fd5 100644
--- a/civicrm/CRM/Contribute/Form/Task/PDFLetter.php
+++ b/civicrm/CRM/Contribute/Form/Task/PDFLetter.php
@@ -77,7 +77,7 @@ class CRM_Contribute_Form_Task_PDFLetter extends CRM_Contribute_Form_Task {
     if (isset($this->_activityId)) {
       $params = ['id' => $this->_activityId];
       CRM_Activity_BAO_Activity::retrieve($params, $defaults);
-      $defaults['html_message'] = CRM_Utils_Array::value('details', $defaults);
+      $defaults['html_message'] = $defaults['details'] ?? NULL;
     }
     else {
       $defaults['thankyou_update'] = 1;
diff --git a/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php b/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php
index 8650ac02c7..a75f2a9c7e 100644
--- a/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php
+++ b/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php
@@ -36,8 +36,8 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
     if (!empty($formValues['email_options'])) {
       $returnProperties['email'] = $returnProperties['on_hold'] = $returnProperties['is_deceased'] = $returnProperties['do_not_email'] = 1;
       $emailParams = [
-        'subject' => CRM_Utils_Array::value('subject', $formValues),
-        'from' => CRM_Utils_Array::value('from_email_address', $formValues),
+        'subject' => $formValues['subject'] ?? NULL,
+        'from' => $formValues['from_email_address'] ?? NULL,
       ];
 
       $emailParams['from'] = CRM_Utils_Mail::formatFromAddress($emailParams['from']);
@@ -49,8 +49,8 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
       }
     }
     // update dates ?
-    $receipt_update = isset($formValues['receipt_update']) ? $formValues['receipt_update'] : FALSE;
-    $thankyou_update = isset($formValues['thankyou_update']) ? $formValues['thankyou_update'] : FALSE;
+    $receipt_update = $formValues['receipt_update'] ?? FALSE;
+    $thankyou_update = $formValues['thankyou_update'] ?? FALSE;
     $nowDate = date('YmdHis');
     $receipts = $thanks = $emailed = 0;
     $updateStatus = '';
@@ -75,8 +75,8 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
     $groupBy = $formValues['group_by'];
 
     // skip some contacts ?
-    $skipOnHold = isset($form->skipOnHold) ? $form->skipOnHold : FALSE;
-    $skipDeceased = isset($form->skipDeceased) ? $form->skipDeceased : TRUE;
+    $skipOnHold = $form->skipOnHold ?? FALSE;
+    $skipDeceased = $form->skipDeceased ?? TRUE;
     $contributionIDs = $form->getVar('_contributionIds');
     if ($form->_includesSoftCredits) {
       //@todo - comment on what is stored there
@@ -258,7 +258,7 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
     $contributions = $contacts = [];
     foreach ($contributionIDs as $item => $contributionId) {
       $contribution = CRM_Contribute_BAO_Contribution::getContributionTokenValues($contributionId, $messageToken)['values'][$contributionId];
-      $contribution['campaign'] = CRM_Utils_Array::value('contribution_campaign_title', $contribution);
+      $contribution['campaign'] = $contribution['contribution_campaign_title'] ?? NULL;
       $contributions[$contributionId] = $contribution;
 
       if ($isIncludeSoftCredits) {
diff --git a/civicrm/CRM/Contribute/Form/Task/Status.php b/civicrm/CRM/Contribute/Form/Task/Status.php
index 225d17470b..09f1285c99 100644
--- a/civicrm/CRM/Contribute/Form/Task/Status.php
+++ b/civicrm/CRM/Contribute/Form/Task/Status.php
@@ -83,6 +83,8 @@ AND    {$this->_componentClause}";
       $status,
       TRUE
     );
+    $this->add('checkbox', 'is_email_receipt', ts('Send e-mail receipt'));
+    $this->setDefaults(['is_email_receipt' => 1]);
 
     $contribIDs = implode(',', $this->_contributionIds);
     $query = "
@@ -210,7 +212,7 @@ AND    co.id IN ( $contribIDs )";
    * @throws \Exception
    */
   public static function processForm($form, $params) {
-    $statusID = CRM_Utils_Array::value('contribution_status_id', $params);
+    $statusID = $params['contribution_status_id'] ?? NULL;
     $baseIPN = new CRM_Core_Payment_BaseIPN();
 
     $transaction = new CRM_Core_Transaction();
@@ -229,9 +231,9 @@ AND    co.id IN ( $contribIDs )";
       $ids['contribution'] = $row['contribution_id'];
       $ids['contributionRecur'] = NULL;
       $ids['contributionPage'] = NULL;
-      $ids['membership'] = CRM_Utils_Array::value('membership', $details[$row['contribution_id']]);
-      $ids['participant'] = CRM_Utils_Array::value('participant', $details[$row['contribution_id']]);
-      $ids['event'] = CRM_Utils_Array::value('event', $details[$row['contribution_id']]);
+      $ids['membership'] = $details[$row['contribution_id']]['membership'] ?? NULL;
+      $ids['participant'] = $details[$row['contribution_id']]['participant'] ?? NULL;
+      $ids['event'] = $details[$row['contribution_id']]['event'] ?? NULL;
 
       if (!$baseIPN->validateData($input, $ids, $objects, FALSE)) {
         CRM_Core_Error::fatal();
@@ -278,6 +280,7 @@ AND    co.id IN ( $contribIDs )";
         $input['trxn_id'] = $contribution->invoice_id;
       }
       $input['trxn_date'] = $params["trxn_date_{$row['contribution_id']}"] . ' ' . date('H:i:s');
+      $input['is_email_receipt'] = !empty($params['is_email_receipt']);
 
       // @todo calling baseIPN like this is a pattern in it's last gasps. Call contribute.completetransaction api.
       $baseIPN->completeTransaction($input, $ids, $objects, $transaction, FALSE);
diff --git a/civicrm/CRM/Contribute/Form/UpdateBilling.php b/civicrm/CRM/Contribute/Form/UpdateBilling.php
index 5b5d97aa8b..1370802e54 100644
--- a/civicrm/CRM/Contribute/Form/UpdateBilling.php
+++ b/civicrm/CRM/Contribute/Form/UpdateBilling.php
@@ -252,7 +252,7 @@ class CRM_Contribute_Form_UpdateBilling extends CRM_Contribute_Form_Contribution
       // format new address for display
       $addressParts = array("street_address", "city", "postal_code", "state_province", "country");
       foreach ($addressParts as $part) {
-        $addressParts[$part] = CRM_Utils_Array::value($part, $processorParams);
+        $addressParts[$part] = $processorParams[$part] ?? NULL;
       }
       $tplParams['address'] = CRM_Utils_Address::format($addressParts);
 
@@ -262,7 +262,7 @@ class CRM_Contribute_Form_UpdateBilling extends CRM_Contribute_Form_Contribution
       $addressParts = array("street_address", "city", "postal_code", "state_province", "country");
       foreach ($addressParts as $part) {
         $key = "{$part}-{$this->_bltID}";
-        $addressParts[$part] = CRM_Utils_Array::value($key, $this->_defaults);
+        $addressParts[$part] = $this->_defaults[$key] ?? NULL;
       }
       $this->_defaults['address'] = CRM_Utils_Address::format($addressParts);
 
diff --git a/civicrm/CRM/Contribute/Form/UpdateSubscription.php b/civicrm/CRM/Contribute/Form/UpdateSubscription.php
index 308d9dd3a4..be18481f5e 100644
--- a/civicrm/CRM/Contribute/Form/UpdateSubscription.php
+++ b/civicrm/CRM/Contribute/Form/UpdateSubscription.php
@@ -133,7 +133,7 @@ class CRM_Contribute_Form_UpdateSubscription extends CRM_Contribute_Form_Contrib
     $this->_defaults['financial_type_id'] = $this->_subscriptionDetails->financial_type_id;
     $this->_defaults['is_notify'] = 1;
     foreach ($this->editableScheduleFields as $field) {
-      $this->_defaults[$field] = isset($this->_subscriptionDetails->$field) ? $this->_subscriptionDetails->$field : NULL;
+      $this->_defaults[$field] = $this->_subscriptionDetails->$field ?? NULL;
     }
 
     return $this->_defaults;
diff --git a/civicrm/CRM/Contribute/Import/Form/MapField.php b/civicrm/CRM/Contribute/Import/Form/MapField.php
index 18fd55e9a4..cb886752c7 100644
--- a/civicrm/CRM/Contribute/Import/Form/MapField.php
+++ b/civicrm/CRM/Contribute/Import/Form/MapField.php
@@ -81,7 +81,7 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
     $this->assign('dataValues', $this->_dataValues);
 
     $skipColumnHeader = $this->controller->exportValue('DataSource', 'skipColumnHeader');
-    $this->_onDuplicate = $this->get('onDuplicate', isset($onDuplicate) ? $onDuplicate : "");
+    $this->_onDuplicate = $this->get('onDuplicate', $onDuplicate ?? "");
 
     if ($skipColumnHeader) {
       $this->assign('skipColumnHeader', $skipColumnHeader);
@@ -201,7 +201,7 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
 
             $mappingHeader = array_keys($this->_mapperFields, $mappingName[$i]);
             // reusing contact_type field array for soft credit
-            $softField = isset($mappingContactType[$i]) ? $mappingContactType[$i] : 0;
+            $softField = $mappingContactType[$i] ?? 0;
 
             if (!$softField) {
               $js .= "{$formName}['mapper[$i][1]'].style.display = 'none';\n";
@@ -338,7 +338,7 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
       ];
       $params = [
         'used' => 'Unsupervised',
-        'contact_type' => isset($contactTypes[$contactTypeId]) ? $contactTypes[$contactTypeId] : '',
+        'contact_type' => $contactTypes[$contactTypeId] ?? '',
       ];
       list($ruleFields, $threshold) = CRM_Dedupe_BAO_RuleGroup::dedupeRuleFieldsWeight($params);
       $weightSum = 0;
@@ -384,7 +384,7 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
     }
 
     if (!empty($fields['saveMapping'])) {
-      $nameField = CRM_Utils_Array::value('saveMappingName', $fields);
+      $nameField = $fields['saveMappingName'] ?? NULL;
       if (empty($nameField)) {
         $errors['saveMappingName'] = ts('Name is required to save Import Mapping');
       }
@@ -446,8 +446,8 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
           $softCreditFields[$i] = $mapperSoftCredit[$i];
         }
         $mapperSoftCreditType[$i] = [
-          'value' => isset($mapperKeys[$i][2]) ? $mapperKeys[$i][2] : '',
-          'label' => isset($softCreditTypes[$mapperKeys[$i][2]]) ? $softCreditTypes[$mapperKeys[$i][2]] : '',
+          'value' => $mapperKeys[$i][2] ?? '',
+          'label' => $softCreditTypes[$mapperKeys[$i][2]] ?? '',
         ];
       }
       else {
@@ -483,7 +483,7 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
         $updateMappingFields->name = $mapper[$i];
 
         //reuse contact_type field in db to store fields associated with soft credit
-        $updateMappingFields->contact_type = isset($mapperSoftCredit[$i]) ? $mapperSoftCredit[$i] : NULL;
+        $updateMappingFields->contact_type = $mapperSoftCredit[$i] ?? NULL;
         $updateMappingFields->save();
       }
     }
@@ -504,7 +504,7 @@ class CRM_Contribute_Import_Form_MapField extends CRM_Import_Form_MapField {
         $saveMappingFields->name = $mapper[$i];
 
         //reuse contact_type field in db to store fields associated with soft credit
-        $saveMappingFields->contact_type = isset($mapperSoftCredit[$i]) ? $mapperSoftCredit[$i] : NULL;
+        $saveMappingFields->contact_type = $mapperSoftCredit[$i] ?? NULL;
         $saveMappingFields->save();
       }
       $this->set('savedMapping', $saveMappingFields->mapping_id);
diff --git a/civicrm/CRM/Contribute/Import/Form/Preview.php b/civicrm/CRM/Contribute/Import/Form/Preview.php
index aac01eef77..b14ea26c39 100644
--- a/civicrm/CRM/Contribute/Import/Form/Preview.php
+++ b/civicrm/CRM/Contribute/Import/Form/Preview.php
@@ -109,7 +109,7 @@ class CRM_Contribute_Import_Form_Preview extends CRM_Import_Form_Preview {
     foreach ($mapper as $key => $value) {
       $mapperKeys[$key] = $mapper[$key][0];
       if (isset($mapper[$key][0]) && $mapper[$key][0] == 'soft_credit' && isset($mapper[$key])) {
-        $mapperSoftCredit[$key] = isset($mapper[$key][1]) ? $mapper[$key][1] : '';
+        $mapperSoftCredit[$key] = $mapper[$key][1] ?? '';
         $mapperSoftCreditType[$key] = $mapperSoftCreditType[$key]['value'];
       }
       else {
diff --git a/civicrm/CRM/Contribute/Import/Parser/Contribution.php b/civicrm/CRM/Contribute/Import/Parser/Contribution.php
index 5bc8cf306e..cda0249e65 100644
--- a/civicrm/CRM/Contribute/Import/Parser/Contribution.php
+++ b/civicrm/CRM/Contribute/Import/Parser/Contribution.php
@@ -266,9 +266,9 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
       // onDuplicate == CRM_Import_Parser::DUPLICATE_UPDATE
       if (!empty($paramValues['invoice_id']) || !empty($paramValues['trxn_id']) || !empty($paramValues['contribution_id'])) {
         $dupeIds = [
-          'id' => CRM_Utils_Array::value('contribution_id', $paramValues),
-          'trxn_id' => CRM_Utils_Array::value('trxn_id', $paramValues),
-          'invoice_id' => CRM_Utils_Array::value('invoice_id', $paramValues),
+          'id' => $paramValues['contribution_id'] ?? NULL,
+          'trxn_id' => $paramValues['trxn_id'] ?? NULL,
+          'invoice_id' => $paramValues['invoice_id'] ?? NULL,
         ];
 
         $ids['contribution'] = CRM_Contribute_BAO_Contribution::checkDuplicateIds($dupeIds);
@@ -679,8 +679,8 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
         ) {
           $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE);
           foreach ($customOption as $customFldID => $customValue) {
-            $val = CRM_Utils_Array::value('value', $customValue);
-            $label = CRM_Utils_Array::value('label', $customValue);
+            $val = $customValue['value'] ?? NULL;
+            $label = $customValue['label'] ?? NULL;
             $label = strtolower($label);
             $value = strtolower(trim($value));
             if (($value == $label) || ($value == strtolower($val))) {
@@ -715,9 +715,9 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
           // import contribution record according to select contact type
           require_once 'CRM/Contact/DAO/Contact.php';
           $contactType = new CRM_Contact_DAO_Contact();
-          $contactId = CRM_Utils_Array::value('contribution_contact_id', $params);
-          $externalId = CRM_Utils_Array::value('external_identifier', $params);
-          $email = CRM_Utils_Array::value('email', $params);
+          $contactId = $params['contribution_contact_id'] ?? NULL;
+          $externalId = $params['external_identifier'] ?? NULL;
+          $email = $params['email'] ?? NULL;
           //when insert mode check contact id or external identifier
           if ($contactId || $externalId) {
             $contactType->id = $contactId;
@@ -825,9 +825,9 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
           $value[$key] = $mismatchContactType = $softCreditContactIds = '';
           if (isset($params[$key]) && is_array($params[$key])) {
             foreach ($params[$key] as $softKey => $softParam) {
-              $contactId = CRM_Utils_Array::value('contact_id', $softParam);
-              $externalId = CRM_Utils_Array::value('external_identifier', $softParam);
-              $email = CRM_Utils_Array::value('email', $softParam);
+              $contactId = $softParam['contact_id'] ?? NULL;
+              $externalId = $softParam['external_identifier'] ?? NULL;
+              $email = $softParam['email'] ?? NULL;
               if ($contactId || $externalId) {
                 require_once 'CRM/Contact/DAO/Contact.php';
                 $contact = new CRM_Contact_DAO_Contact();
@@ -885,9 +885,9 @@ class CRM_Contribute_Import_Parser_Contribution extends CRM_Contribute_Import_Pa
           }
 
           // get total amount of from import fields
-          $totalAmount = CRM_Utils_Array::value('total_amount', $params);
+          $totalAmount = $params['total_amount'] ?? NULL;
 
-          $onDuplicate = CRM_Utils_Array::value('onDuplicate', $params);
+          $onDuplicate = $params['onDuplicate'] ?? NULL;
 
           // we need to get contact id $contributionContactID to
           // retrieve pledge details as well as to validate pledge ID
diff --git a/civicrm/CRM/Contribute/Page/ContributionPage.php b/civicrm/CRM/Contribute/Page/ContributionPage.php
index 407debb1f5..56ae53b7e2 100644
--- a/civicrm/CRM/Contribute/Page/ContributionPage.php
+++ b/civicrm/CRM/Contribute/Page/ContributionPage.php
@@ -245,7 +245,7 @@ class CRM_Contribute_Page_ContributionPage extends CRM_Core_Page {
           'name' => ts('Cumulative'),
           'title' => ts('Cumulative'),
           'url' => $urlString,
-          'qs' => "{$urlParams}&receive_date_low=&receive_date_high=$now",
+          'qs' => "{$urlParams}",
           'uniqueName' => 'cumulative',
         ),
       );
@@ -530,7 +530,7 @@ ORDER BY is_active desc, title asc
       );
 
       //show campaigns on selector.
-      $contribution[$dao->id]['campaign'] = CRM_Utils_Array::value($dao->campaign_id, $allCampaigns);
+      $contribution[$dao->id]['campaign'] = $allCampaigns[$dao->campaign_id] ?? NULL;
     }
 
     if (isset($contribution)) {
@@ -689,7 +689,7 @@ ORDER BY UPPER(LEFT(title, 1))
     // build the formatted configure links.
     $formattedConfLinks = self::configureActionLinks();
     foreach ($formattedConfLinks as $act => & $link) {
-      $sectionName = CRM_Utils_Array::value('uniqueName', $link);
+      $sectionName = $link['uniqueName'] ?? NULL;
       if (!$sectionName) {
         continue;
       }
diff --git a/civicrm/CRM/Contribute/Page/PaymentInfo.php b/civicrm/CRM/Contribute/Page/PaymentInfo.php
index 00072cd0c8..499733c9b3 100644
--- a/civicrm/CRM/Contribute/Page/PaymentInfo.php
+++ b/civicrm/CRM/Contribute/Page/PaymentInfo.php
@@ -27,13 +27,10 @@ class CRM_Contribute_Page_PaymentInfo extends CRM_Core_Page {
     $this->assign('id', $this->_id);
     $this->assign('context', $this->_context);
     $this->assign('component', $this->_component);
-    if ($this->_component != 'event') {
-      $this->assign('hideButtonLinks', TRUE);
-    }
   }
 
   public function browse() {
-    $getTrxnInfo = $this->_context == 'transaction' ? TRUE : FALSE;
+    $getTrxnInfo = $this->_context == 'transaction';
     $paymentInfo = CRM_Contribute_BAO_Contribution::getPaymentInfo($this->_id, $this->_component, $getTrxnInfo, TRUE);
     if ($this->_context == 'payment_info') {
       $this->assign('paymentInfo', $paymentInfo);
diff --git a/civicrm/CRM/Contribute/Page/Tab.php b/civicrm/CRM/Contribute/Page/Tab.php
index c84e1198b8..0a5a4f67e5 100644
--- a/civicrm/CRM/Contribute/Page/Tab.php
+++ b/civicrm/CRM/Contribute/Page/Tab.php
@@ -194,7 +194,7 @@ class CRM_Contribute_Page_Tab extends CRM_Core_Page {
         'contribution_status_id' => ['NOT IN' => CRM_Contribute_BAO_ContributionRecur::getInactiveStatuses()],
         'options' => ['limit' => 0, 'sort' => 'is_test, start_date DESC'],
       ]);
-      $recurContributions = CRM_Utils_Array::value('values', $contributionRecurResult);
+      $recurContributions = $contributionRecurResult['values'] ?? NULL;
     }
     catch (Exception $e) {
       $recurContributions = [];
@@ -216,7 +216,7 @@ class CRM_Contribute_Page_Tab extends CRM_Core_Page {
         'contribution_status_id' => ['IN' => CRM_Contribute_BAO_ContributionRecur::getInactiveStatuses()],
         'options' => ['limit' => 0, 'sort' => 'is_test, start_date DESC'],
       ]);
-      $recurContributions = CRM_Utils_Array::value('values', $contributionRecurResult);
+      $recurContributions = $contributionRecurResult['values'] ?? NULL;
     }
     catch (Exception $e) {
       $recurContributions = NULL;
diff --git a/civicrm/CRM/Contribute/PseudoConstant.php b/civicrm/CRM/Contribute/PseudoConstant.php
index 1e274e0b7c..86f6388175 100644
--- a/civicrm/CRM/Contribute/PseudoConstant.php
+++ b/civicrm/CRM/Contribute/PseudoConstant.php
@@ -69,6 +69,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
   /**
    * Status of personal campaign page
    * @var array
+   * @deprecated
    */
   private static $pcpStatus;
 
@@ -108,7 +109,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
     }
 
     if ($id) {
-      $result = CRM_Utils_Array::value($id, self::$financialType);
+      $result = self::$financialType[$id] ?? NULL;
       return $result;
     }
     return self::$financialType;
@@ -149,7 +150,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
 
     }
     if ($id) {
-      $result = CRM_Utils_Array::value($id, self::$financialAccount[$cacheKey]);
+      $result = self::$financialAccount[$cacheKey][$id] ?? NULL;
       return $result;
     }
     return self::$financialAccount[$cacheKey];
@@ -197,7 +198,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
       );
     }
     if ($id) {
-      $pageTitle = CRM_Utils_Array::value($id, $cacheVarToUse);
+      $pageTitle = $cacheVarToUse[$id] ?? NULL;
       return $pageTitle;
     }
     return $cacheVarToUse;
@@ -300,7 +301,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
     }
     $result = self::$contributionStatus[$cacheKey];
     if ($id) {
-      $result = CRM_Utils_Array::value($id, $result);
+      $result = $result[$id] ?? NULL;
     }
 
     return $result;
@@ -331,7 +332,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
     }
     $result = self::$pcPage[$pageType];
     if ($id) {
-      return $result = CRM_Utils_Array::value($id, $result);
+      return $result = $result[$id] ?? NULL;
     }
 
     return $result;
@@ -342,12 +343,13 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
    *
    * The static array pcpStatus is returned
    *
-   *
+   * @deprecated
    * @param string $column
    * @return array
    *   array reference of all PCP activity statuses
    */
   public static function &pcpStatus($column = 'label') {
+    CRM_Core_Error::deprecatedFunctionWarning('Function pcpStatus will be removed');
     if (NULL === self::$pcpStatus) {
       self::$pcpStatus = [];
     }
@@ -412,7 +414,7 @@ class CRM_Contribute_PseudoConstant extends CRM_Core_PseudoConstant {
     }
 
     if ($id) {
-      $result = CRM_Utils_Array::value($id, self::$batch);
+      $result = self::$batch[$id] ?? NULL;
       return $result;
     }
     return self::$batch;
diff --git a/civicrm/CRM/Contribute/Selector/Search.php b/civicrm/CRM/Contribute/Selector/Search.php
index 91e65fbfa1..010d05116d 100644
--- a/civicrm/CRM/Contribute/Selector/Search.php
+++ b/civicrm/CRM/Contribute/Selector/Search.php
@@ -390,7 +390,7 @@ class CRM_Contribute_Selector_Search extends CRM_Core_Selector_Base implements C
       //carry campaign on selectors.
       // @todo - I can't find any evidence that 'carrying' the campaign on selectors actually
       // results in it being displayed anywhere so why do we do this???
-      $row['campaign'] = CRM_Utils_Array::value($result->contribution_campaign_id, $allCampaigns);
+      $row['campaign'] = $allCampaigns[$result->contribution_campaign_id] ?? NULL;
       $row['campaign_id'] = $result->contribution_campaign_id;
 
       // add contribution status name
diff --git a/civicrm/CRM/Contribute/StateMachine/Search.php b/civicrm/CRM/Contribute/StateMachine/Search.php
index f73e871b0f..86b60a97e0 100644
--- a/civicrm/CRM/Contribute/StateMachine/Search.php
+++ b/civicrm/CRM/Contribute/StateMachine/Search.php
@@ -68,7 +68,7 @@ class CRM_Contribute_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Contribute/Task.php b/civicrm/CRM/Contribute/Task.php
index 12c097c0e5..0acabfa405 100644
--- a/civicrm/CRM/Contribute/Task.php
+++ b/civicrm/CRM/Contribute/Task.php
@@ -112,8 +112,7 @@ class CRM_Contribute_Task extends CRM_Core_Task {
       }
 
       // remove action "Invoices - print or email"
-      $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-      $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+      $invoicing = CRM_Invoicing_Utils::isInvoicingEnabled();
       if (!$invoicing) {
         unset(self::$_tasks[self::PDF_INVOICE]);
       }
diff --git a/civicrm/CRM/Contribute/Tokens.php b/civicrm/CRM/Contribute/Tokens.php
index e773317a23..528e15b13a 100644
--- a/civicrm/CRM/Contribute/Tokens.php
+++ b/civicrm/CRM/Contribute/Tokens.php
@@ -110,7 +110,7 @@ class CRM_Contribute_Tokens extends \Civi\Token\AbstractTokenSubscriber {
    */
   public function evaluateToken(\Civi\Token\TokenRow $row, $entity, $field, $prefetch = NULL) {
     $actionSearchResult = $row->context['actionSearchResult'];
-    $fieldValue = isset($actionSearchResult->{"contrib_$field"}) ? $actionSearchResult->{"contrib_$field"} : NULL;
+    $fieldValue = $actionSearchResult->{"contrib_$field"} ?? NULL;
 
     $aliasTokens = $this->getAliasTokens();
     if (in_array($field, ['total_amount', 'fee_amount', 'net_amount'])) {
diff --git a/civicrm/CRM/Core/Action.php b/civicrm/CRM/Core/Action.php
index 8495b4cea2..a5e7ef11d3 100644
--- a/civicrm/CRM/Core/Action.php
+++ b/civicrm/CRM/Core/Action.php
@@ -140,7 +140,7 @@ class CRM_Core_Action {
    *   the action mask corresponding to the input string
    */
   public static function mapItem($item) {
-    $mask = CRM_Utils_Array::value(trim($item), self::$_names);
+    $mask = self::$_names[trim($item)] ?? NULL;
     return $mask ? $mask : 0;
   }
 
@@ -216,7 +216,7 @@ class CRM_Core_Action {
       if (!$mask || !array_key_exists('bit', $link) || ($mask & $link['bit'])) {
         $extra = isset($link['extra']) ? self::replace($link['extra'], $values) : NULL;
 
-        $frontend = (isset($link['fe'])) ? TRUE : FALSE;
+        $frontend = isset($link['fe']);
 
         if (isset($link['qs']) && !CRM_Utils_System::isNull($link['qs'])) {
           $urlPath = CRM_Utils_System::url(self::replace($link['url'], $values),
diff --git a/civicrm/CRM/Core/BAO/ActionLog.php b/civicrm/CRM/Core/BAO/ActionLog.php
index 7615b97249..c04e3f30cc 100644
--- a/civicrm/CRM/Core/BAO/ActionLog.php
+++ b/civicrm/CRM/Core/BAO/ActionLog.php
@@ -36,7 +36,7 @@ class CRM_Core_BAO_ActionLog extends CRM_Core_DAO_ActionLog {
 
     $actionLog->copyValues($params);
 
-    $edit = ($actionLog->id) ? TRUE : FALSE;
+    $edit = (bool) $actionLog->id;
     if ($edit) {
       CRM_Utils_Hook::pre('edit', 'ActionLog', $actionLog->id, $actionLog);
     }
diff --git a/civicrm/CRM/Core/BAO/ActionSchedule.php b/civicrm/CRM/Core/BAO/ActionSchedule.php
index c3d43ac96d..11d9b209c8 100644
--- a/civicrm/CRM/Core/BAO/ActionSchedule.php
+++ b/civicrm/CRM/Core/BAO/ActionSchedule.php
@@ -57,7 +57,7 @@ class CRM_Core_BAO_ActionSchedule extends CRM_Core_DAO_ActionSchedule {
    */
   public static function getMapping($id) {
     $mappings = self::getMappings();
-    return isset($mappings[$id]) ? $mappings[$id] : NULL;
+    return $mappings[$id] ?? NULL;
   }
 
   /**
@@ -673,7 +673,7 @@ FROM civicrm_action_schedule cas
     //to get primary mobile ph,if not get a first mobile phONE
     if (!empty($toPhoneNumbers)) {
       $toPhoneNumberDetails = reset($toPhoneNumbers);
-      $toPhoneNumber = CRM_Utils_Array::value('phone', $toPhoneNumberDetails);
+      $toPhoneNumber = $toPhoneNumberDetails['phone'] ?? NULL;
       return $toPhoneNumber;
     }
     return NULL;
diff --git a/civicrm/CRM/Core/BAO/Address.php b/civicrm/CRM/Core/BAO/Address.php
index 933d188682..c86d73f8c1 100644
--- a/civicrm/CRM/Core/BAO/Address.php
+++ b/civicrm/CRM/Core/BAO/Address.php
@@ -121,7 +121,7 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
   public static function add(&$params, $fixAddress = FALSE) {
 
     $address = new CRM_Core_DAO_Address();
-    $checkPermissions = isset($params['check_permissions']) ? $params['check_permissions'] : TRUE;
+    $checkPermissions = $params['check_permissions'] ?? TRUE;
 
     // fixAddress mode to be done
     if ($fixAddress) {
@@ -353,7 +353,7 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
         unset($params[$fld]);
       }
       // main parse string.
-      $parseString = CRM_Utils_Array::value('street_address', $params);
+      $parseString = $params['street_address'] ?? NULL;
       $parsedFields = CRM_Core_BAO_Address::parseStreetAddress($parseString);
 
       // merge parse address in to main address block.
@@ -450,7 +450,7 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
     $address = new CRM_Core_BAO_Address();
 
     if (empty($entityBlock['entity_table'])) {
-      $address->$fieldName = CRM_Utils_Array::value($fieldName, $entityBlock);
+      $address->$fieldName = $entityBlock[$fieldName] ?? NULL;
     }
     else {
       $addressIds = [];
@@ -490,7 +490,7 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
 
       // add state and country information: CRM-369
       if (!empty($address->location_type_id)) {
-        $values['location_type'] = CRM_Utils_Array::value($address->location_type_id, $locationTypes);
+        $values['location_type'] = $locationTypes[$address->location_type_id] ?? NULL;
       }
       if (!empty($address->state_province_id)) {
         $address->state = CRM_Core_PseudoConstant::stateProvinceAbbreviation($address->state_province_id, FALSE);
@@ -548,12 +548,12 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
       'supplemental_address_2' => $this->supplemental_address_2,
       'supplemental_address_3' => $this->supplemental_address_3,
       'city' => $this->city,
-      'state_province_name' => isset($this->state_name) ? $this->state_name : "",
-      'state_province' => isset($this->state) ? $this->state : "",
-      'postal_code' => isset($this->postal_code) ? $this->postal_code : "",
-      'postal_code_suffix' => isset($this->postal_code_suffix) ? $this->postal_code_suffix : "",
-      'country' => isset($this->country) ? $this->country : "",
-      'world_region' => isset($this->world_region) ? $this->world_region : "",
+      'state_province_name' => $this->state_name ?? "",
+      'state_province' => $this->state ?? "",
+      'postal_code' => $this->postal_code ?? "",
+      'postal_code_suffix' => $this->postal_code_suffix ?? "",
+      'country' => $this->country ?? "",
+      'world_region' => $this->world_region ?? "",
     ];
 
     if (isset($this->county_id) && $this->county_id) {
@@ -978,8 +978,8 @@ SELECT is_primary,
       }
 
       $nameVal = explode('-', $values['name']);
-      $fldName = CRM_Utils_Array::value(0, $nameVal);
-      $locType = CRM_Utils_Array::value(1, $nameVal);
+      $fldName = $nameVal[0] ?? NULL;
+      $locType = $nameVal[1] ?? NULL;
       if (!empty($values['location_type_id'])) {
         $locType = $values['location_type_id'];
       }
@@ -1033,7 +1033,7 @@ SELECT is_primary,
     }
 
     // Default to TRUE if not set to maintain api backward compatibility.
-    $createRelationship = isset($params['add_relationship']) ? $params['add_relationship'] : TRUE;
+    $createRelationship = $params['add_relationship'] ?? TRUE;
 
     // unset contact id
     $skipFields = ['is_primary', 'location_type_id', 'is_billing', 'contact_id'];
diff --git a/civicrm/CRM/Core/BAO/Block.php b/civicrm/CRM/Core/BAO/Block.php
index 001787d2f3..a36b698e66 100644
--- a/civicrm/CRM/Core/BAO/Block.php
+++ b/civicrm/CRM/Core/BAO/Block.php
@@ -231,7 +231,7 @@ class CRM_Core_BAO_Block {
     //get existing block ids.
     $blockIds = self::getBlockIds($blockName, $contactId, $entityElements);
     foreach ($params[$blockName] as $count => $value) {
-      $blockId = CRM_Utils_Array::value('id', $value);
+      $blockId = $value['id'] ?? NULL;
       if ($blockId) {
         if (is_array($blockIds) && array_key_exists($blockId, $blockIds)) {
           unset($blockIds[$blockId]);
@@ -275,13 +275,13 @@ class CRM_Core_BAO_Block {
         if (empty($value['id']) && $blockValue['locationTypeId'] == CRM_Utils_Array::value('location_type_id', $value) && !$isIdSet) {
           $valueId = FALSE;
           if ($blockName == 'phone') {
-            $phoneTypeBlockValue = CRM_Utils_Array::value('phoneTypeId', $blockValue);
+            $phoneTypeBlockValue = $blockValue['phoneTypeId'] ?? NULL;
             if ($phoneTypeBlockValue == CRM_Utils_Array::value('phone_type_id', $value)) {
               $valueId = TRUE;
             }
           }
           elseif ($blockName == 'im') {
-            $providerBlockValue = CRM_Utils_Array::value('providerId', $blockValue);
+            $providerBlockValue = $blockValue['providerId'] ?? NULL;
             if (!empty($value['provider_id']) && $providerBlockValue == $value['provider_id']) {
               $valueId = TRUE;
             }
@@ -312,7 +312,7 @@ class CRM_Core_BAO_Block {
       }
       $contactFields = [
         'contact_id' => $contactId,
-        'location_type_id' => CRM_Utils_Array::value('location_type_id', $value),
+        'location_type_id' => $value['location_type_id'] ?? NULL,
       ];
 
       $contactFields['is_primary'] = 0;
@@ -399,7 +399,7 @@ class CRM_Core_BAO_Block {
     }
 
     // contact_id in params might be empty or the string 'null' so cast to integer
-    $contactId = (int) CRM_Utils_Array::value('contact_id', $params);
+    $contactId = (int) ($params['contact_id'] ?? 0);
     // If id is set & we haven't been passed a contact_id, retrieve it
     if (!empty($params['id']) && !isset($params['contact_id'])) {
       $entity = new $class();
@@ -474,8 +474,8 @@ class CRM_Core_BAO_Block {
    * @return int
    */
   public static function primaryComparison($location1, $location2) {
-    $l1 = CRM_Utils_Array::value('is_primary', $location1);
-    $l2 = CRM_Utils_Array::value('is_primary', $location2);
+    $l1 = $location1['is_primary'] ?? NULL;
+    $l2 = $location2['is_primary'] ?? NULL;
     if ($l1 == $l2) {
       return 0;
     }
diff --git a/civicrm/CRM/Core/BAO/CMSUser.php b/civicrm/CRM/Core/BAO/CMSUser.php
index c09e557e15..aecd30c4b0 100644
--- a/civicrm/CRM/Core/BAO/CMSUser.php
+++ b/civicrm/CRM/Core/BAO/CMSUser.php
@@ -72,8 +72,8 @@ class CRM_Core_BAO_CMSUser {
     $showCMS = FALSE;
 
     $isDrupal = $config->userSystem->is_drupal;
-    $isJoomla = ucfirst($config->userFramework) == 'Joomla' ? TRUE : FALSE;
-    $isWordPress = $config->userFramework == 'WordPress' ? TRUE : FALSE;
+    $isJoomla = ucfirst($config->userFramework) == 'Joomla';
+    $isWordPress = $config->userFramework == 'WordPress';
 
     if (!$config->userSystem->isUserRegistrationPermitted()) {
       // Do not build form if CMS is not configured to allow creating users.
@@ -148,8 +148,8 @@ class CRM_Core_BAO_CMSUser {
     $config = CRM_Core_Config::singleton();
 
     $isDrupal = $config->userSystem->is_drupal;
-    $isJoomla = ucfirst($config->userFramework) == 'Joomla' ? TRUE : FALSE;
-    $isWordPress = $config->userFramework == 'WordPress' ? TRUE : FALSE;
+    $isJoomla = ucfirst($config->userFramework) == 'Joomla';
+    $isWordPress = $config->userFramework == 'WordPress';
 
     $errors = [];
     if ($isDrupal || $isJoomla || $isWordPress) {
diff --git a/civicrm/CRM/Core/BAO/Cache.php b/civicrm/CRM/Core/BAO/Cache.php
index 9c14476c94..ee678348dd 100644
--- a/civicrm/CRM/Core/BAO/Cache.php
+++ b/civicrm/CRM/Core/BAO/Cache.php
@@ -387,7 +387,7 @@ class CRM_Core_BAO_Cache extends CRM_Core_DAO_Cache {
 
     if ($prevNext) {
       // delete all PrevNext caches
-      CRM_Core_BAO_PrevNextCache::cleanupCache();
+      Civi::service('prevnext')->cleanup();
     }
 
     if ($table) {
diff --git a/civicrm/CRM/Core/BAO/ConfigSetting.php b/civicrm/CRM/Core/BAO/ConfigSetting.php
index e011e4e884..11450b6813 100644
--- a/civicrm/CRM/Core/BAO/ConfigSetting.php
+++ b/civicrm/CRM/Core/BAO/ConfigSetting.php
@@ -128,7 +128,7 @@ class CRM_Core_BAO_ConfigSetting {
    */
   public static function applyLocale($settings, $activatedLocales) {
     // are we in a multi-language setup?
-    $multiLang = $activatedLocales ? TRUE : FALSE;
+    $multiLang = (bool) $activatedLocales;
 
     // set the current language
     $chosenLocale = NULL;
diff --git a/civicrm/CRM/Core/BAO/CustomField.php b/civicrm/CRM/Core/BAO/CustomField.php
index b0e96ea665..05298e5e79 100644
--- a/civicrm/CRM/Core/BAO/CustomField.php
+++ b/civicrm/CRM/Core/BAO/CustomField.php
@@ -1067,7 +1067,12 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
 
     $fieldInfo = ['options' => $field->getOptions()] + (array) $field;
 
-    return self::formatDisplayValue($value, $fieldInfo, $entityId);
+    $displayValue = self::formatDisplayValue($value, $fieldInfo, $entityId);
+
+    // Call hook to alter display value.
+    CRM_Utils_Hook::alterCustomFieldDisplayValue($displayValue, $value, $entityId, $fieldInfo);
+
+    return $displayValue;
   }
 
   /**
@@ -1113,7 +1118,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         elseif (is_array($value)) {
           $v = [];
           foreach ($value as $key => $val) {
-            $v[] = CRM_Utils_Array::value($val, $field['options']);
+            $v[] = $field['options'][$val] ?? NULL;
           }
           $display = implode(', ', $v);
         }
@@ -1130,7 +1135,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         $value = is_array($value) ? CRM_Utils_Array::first($value) : $value;
 
         $actualPHPFormats = CRM_Utils_Date::datePluginToPHPFormats();
-        $format = CRM_Utils_Array::value('date_format', $field);
+        $format = $field['date_format'] ?? NULL;
 
         if ($format) {
           if (array_key_exists($format, $actualPHPFormats)) {
@@ -1966,8 +1971,8 @@ WHERE  id IN ( %1, %2 )
         break;
     }
 
-    $htmlType = CRM_Utils_Array::value('html_type', $params);
-    $dataType = CRM_Utils_Array::value('data_type', $params);
+    $htmlType = $params['html_type'] ?? NULL;
+    $dataType = $params['data_type'] ?? NULL;
     $allowedOptionTypes = ['String', 'Int', 'Float', 'Money'];
 
     // create any option group & values if required
@@ -2450,7 +2455,7 @@ WHERE      f.id IN ($ids)";
 
     //pick up profile fields.
     $profileFields = [];
-    $ufGroupId = CRM_Utils_Array::value('ufGroupId', $params);
+    $ufGroupId = $params['ufGroupId'] ?? NULL;
     if ($ufGroupId) {
       $profileFields = CRM_Core_BAO_UFGroup::getFields($ufGroupId,
         FALSE,
@@ -2474,8 +2479,8 @@ WHERE      f.id IN ($ids)";
       $dataType = $field->data_type;
 
       $profileField = CRM_Utils_Array::value($key, $profileFields, []);
-      $fieldTitle = CRM_Utils_Array::value('title', $profileField);
-      $isRequired = CRM_Utils_Array::value('is_required', $profileField);
+      $fieldTitle = $profileField['title'] ?? NULL;
+      $isRequired = $profileField['is_required'] ?? NULL;
       if (!$fieldTitle) {
         $fieldTitle = $field->label;
       }
diff --git a/civicrm/CRM/Core/BAO/CustomGroup.php b/civicrm/CRM/Core/BAO/CustomGroup.php
index 1bfd2a634c..244c98f316 100644
--- a/civicrm/CRM/Core/BAO/CustomGroup.php
+++ b/civicrm/CRM/Core/BAO/CustomGroup.php
@@ -46,7 +46,7 @@ class CRM_Core_BAO_CustomGroup extends CRM_Core_DAO_CustomGroup {
     }
 
     $extends = CRM_Utils_Array::value('extends', $params, []);
-    $extendsEntity = CRM_Utils_Array::value(0, $extends);
+    $extendsEntity = $extends[0] ?? NULL;
 
     $participantEntities = [
       'ParticipantRole',
@@ -68,7 +68,7 @@ class CRM_Core_BAO_CustomGroup extends CRM_Core_DAO_CustomGroup {
     }
 
     // this is format when form get submit.
-    $extendsChildType = CRM_Utils_Array::value(1, $extends);
+    $extendsChildType = $extends[1] ?? NULL;
     // lets allow user to pass direct child type value, CRM-6893
     if (!empty($params['extends_entity_column_value'])) {
       $extendsChildType = $params['extends_entity_column_value'];
@@ -144,8 +144,8 @@ class CRM_Core_BAO_CustomGroup extends CRM_Core_DAO_CustomGroup {
       }
     }
     else {
-      $group->created_id = CRM_Utils_Array::value('created_id', $params);
-      $group->created_date = CRM_Utils_Array::value('created_date', $params);
+      $group->created_id = $params['created_id'] ?? NULL;
+      $group->created_date = $params['created_date'] ?? NULL;
 
       // we do this only once, so name never changes
       if (isset($params['name'])) {
@@ -273,7 +273,7 @@ class CRM_Core_BAO_CustomGroup extends CRM_Core_DAO_CustomGroup {
     $escapedValue = CRM_Core_DAO::VALUE_SEPARATOR . CRM_Core_DAO::escapeString($columnValue) . CRM_Core_DAO::VALUE_SEPARATOR;
     $dao->whereAdd("extends_entity_column_value LIKE \"%$escapedValue%\"");
     //$dao->extends_entity_column_value = $columnValue;
-    return $dao->find() ? TRUE : FALSE;
+    return (bool) $dao->find();
   }
 
   /**
@@ -673,7 +673,7 @@ ORDER BY civicrm_custom_group.weight,
     if ($getCount) {
       return $recordExists;
     }
-    return $recordExists ? TRUE : FALSE;
+    return (bool) $recordExists;
   }
 
   /**
@@ -1556,7 +1556,7 @@ ORDER BY civicrm_custom_group.weight,
     foreach ($groupTree as $id => $group) {
       CRM_Core_ShowHideBlocks::links($form, $group['title'], '', '');
       foreach ($group['fields'] as $field) {
-        $required = CRM_Utils_Array::value('is_required', $field);
+        $required = $field['is_required'] ?? NULL;
         //fix for CRM-1620
         if ($field['data_type'] == 'File') {
           if (!empty($field['element_value']['data'])) {
@@ -1815,21 +1815,21 @@ SELECT IF( EXISTS(SELECT name FROM civicrm_contact_type WHERE name like %1), 1,
       }
 
       // add group information
-      $formattedGroupTree[$key]['name'] = CRM_Utils_Array::value('name', $value);
-      $formattedGroupTree[$key]['title'] = CRM_Utils_Array::value('title', $value);
-      $formattedGroupTree[$key]['help_pre'] = CRM_Utils_Array::value('help_pre', $value);
-      $formattedGroupTree[$key]['help_post'] = CRM_Utils_Array::value('help_post', $value);
-      $formattedGroupTree[$key]['collapse_display'] = CRM_Utils_Array::value('collapse_display', $value);
-      $formattedGroupTree[$key]['collapse_adv_display'] = CRM_Utils_Array::value('collapse_adv_display', $value);
-      $formattedGroupTree[$key]['style'] = CRM_Utils_Array::value('style', $value);
+      $formattedGroupTree[$key]['name'] = $value['name'] ?? NULL;
+      $formattedGroupTree[$key]['title'] = $value['title'] ?? NULL;
+      $formattedGroupTree[$key]['help_pre'] = $value['help_pre'] ?? NULL;
+      $formattedGroupTree[$key]['help_post'] = $value['help_post'] ?? NULL;
+      $formattedGroupTree[$key]['collapse_display'] = $value['collapse_display'] ?? NULL;
+      $formattedGroupTree[$key]['collapse_adv_display'] = $value['collapse_adv_display'] ?? NULL;
+      $formattedGroupTree[$key]['style'] = $value['style'] ?? NULL;
 
       // this params needed of bulding multiple values
-      $formattedGroupTree[$key]['is_multiple'] = CRM_Utils_Array::value('is_multiple', $value);
-      $formattedGroupTree[$key]['extends'] = CRM_Utils_Array::value('extends', $value);
-      $formattedGroupTree[$key]['extends_entity_column_id'] = CRM_Utils_Array::value('extends_entity_column_id', $value);
-      $formattedGroupTree[$key]['extends_entity_column_value'] = CRM_Utils_Array::value('extends_entity_column_value', $value);
-      $formattedGroupTree[$key]['subtype'] = CRM_Utils_Array::value('subtype', $value);
-      $formattedGroupTree[$key]['max_multiple'] = CRM_Utils_Array::value('max_multiple', $value);
+      $formattedGroupTree[$key]['is_multiple'] = $value['is_multiple'] ?? NULL;
+      $formattedGroupTree[$key]['extends'] = $value['extends'] ?? NULL;
+      $formattedGroupTree[$key]['extends_entity_column_id'] = $value['extends_entity_column_id'] ?? NULL;
+      $formattedGroupTree[$key]['extends_entity_column_value'] = $value['extends_entity_column_value'] ?? NULL;
+      $formattedGroupTree[$key]['subtype'] = $value['subtype'] ?? NULL;
+      $formattedGroupTree[$key]['max_multiple'] = $value['max_multiple'] ?? NULL;
 
       // add field information
       foreach ($value['fields'] as $k => $properties) {
@@ -1894,7 +1894,7 @@ SELECT IF( EXISTS(SELECT name FROM civicrm_contact_type WHERE name like %1), 1,
    * @param int $entityId
    *
    * @return array|int
-   * @throws \Exception
+   * @throws \CRM_Core_Exception
    */
   public static function buildCustomDataView(&$form, &$groupTree, $returnCount = FALSE, $gID = NULL, $prefix = NULL, $customValueId = NULL, $entityId = NULL) {
     $details = [];
@@ -1910,19 +1910,19 @@ SELECT IF( EXISTS(SELECT name FROM civicrm_contact_type WHERE name like %1), 1,
             if (!empty($customValueId) && $customValueId != $values['id']) {
               continue;
             }
-            $details[$groupID][$values['id']]['title'] = CRM_Utils_Array::value('title', $group);
-            $details[$groupID][$values['id']]['name'] = CRM_Utils_Array::value('name', $group);
-            $details[$groupID][$values['id']]['help_pre'] = CRM_Utils_Array::value('help_pre', $group);
-            $details[$groupID][$values['id']]['help_post'] = CRM_Utils_Array::value('help_post', $group);
-            $details[$groupID][$values['id']]['collapse_display'] = CRM_Utils_Array::value('collapse_display', $group);
-            $details[$groupID][$values['id']]['collapse_adv_display'] = CRM_Utils_Array::value('collapse_adv_display', $group);
-            $details[$groupID][$values['id']]['style'] = CRM_Utils_Array::value('style', $group);
+            $details[$groupID][$values['id']]['title'] = $group['title'] ?? NULL;
+            $details[$groupID][$values['id']]['name'] = $group['name'] ?? NULL;
+            $details[$groupID][$values['id']]['help_pre'] = $group['help_pre'] ?? NULL;
+            $details[$groupID][$values['id']]['help_post'] = $group['help_post'] ?? NULL;
+            $details[$groupID][$values['id']]['collapse_display'] = $group['collapse_display'] ?? NULL;
+            $details[$groupID][$values['id']]['collapse_adv_display'] = $group['collapse_adv_display'] ?? NULL;
+            $details[$groupID][$values['id']]['style'] = $group['style'] ?? NULL;
             $details[$groupID][$values['id']]['fields'][$k] = [
-              'field_title' => CRM_Utils_Array::value('label', $properties),
-              'field_type' => CRM_Utils_Array::value('html_type', $properties),
-              'field_data_type' => CRM_Utils_Array::value('data_type', $properties),
+              'field_title' => $properties['label'] ?? NULL,
+              'field_type' => $properties['html_type'] ?? NULL,
+              'field_data_type' => $properties['data_type'] ?? NULL,
               'field_value' => CRM_Core_BAO_CustomField::displayValue($values['data'], $properties['id'], $entityId),
-              'options_per_line' => CRM_Utils_Array::value('options_per_line', $properties),
+              'options_per_line' => $properties['options_per_line'] ?? NULL,
             ];
             // editable = whether this set contains any non-read-only fields
             if (!isset($details[$groupID][$values['id']]['editable'])) {
@@ -1938,18 +1938,18 @@ SELECT IF( EXISTS(SELECT name FROM civicrm_contact_type WHERE name like %1), 1,
               $details[$groupID][$values['id']]['fields'][$k]['field_data_type'] ==
               'ContactReference'
             ) {
-              $details[$groupID][$values['id']]['fields'][$k]['contact_ref_id'] = CRM_Utils_Array::value('data', $values);
+              $details[$groupID][$values['id']]['fields'][$k]['contact_ref_id'] = $values['data'] ?? NULL;
             }
           }
         }
         else {
-          $details[$groupID][0]['title'] = CRM_Utils_Array::value('title', $group);
-          $details[$groupID][0]['name'] = CRM_Utils_Array::value('name', $group);
-          $details[$groupID][0]['help_pre'] = CRM_Utils_Array::value('help_pre', $group);
-          $details[$groupID][0]['help_post'] = CRM_Utils_Array::value('help_post', $group);
-          $details[$groupID][0]['collapse_display'] = CRM_Utils_Array::value('collapse_display', $group);
-          $details[$groupID][0]['collapse_adv_display'] = CRM_Utils_Array::value('collapse_adv_display', $group);
-          $details[$groupID][0]['style'] = CRM_Utils_Array::value('style', $group);
+          $details[$groupID][0]['title'] = $group['title'] ?? NULL;
+          $details[$groupID][0]['name'] = $group['name'] ?? NULL;
+          $details[$groupID][0]['help_pre'] = $group['help_pre'] ?? NULL;
+          $details[$groupID][0]['help_post'] = $group['help_post'] ?? NULL;
+          $details[$groupID][0]['collapse_display'] = $group['collapse_display'] ?? NULL;
+          $details[$groupID][0]['collapse_adv_display'] = $group['collapse_adv_display'] ?? NULL;
+          $details[$groupID][0]['style'] = $group['style'] ?? NULL;
           $details[$groupID][0]['fields'][$k] = ['field_title' => CRM_Utils_Array::value('label', $properties)];
         }
       }
@@ -2103,7 +2103,7 @@ SELECT  civicrm_custom_group.id as groupID, civicrm_custom_group.title as groupT
   public static function hasReachedMaxLimit($customGroupId, $entityId) {
     // check whether the group is multiple
     $isMultiple = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $customGroupId, 'is_multiple');
-    $isMultiple = ($isMultiple) ? TRUE : FALSE;
+    $isMultiple = (bool) $isMultiple;
     $hasReachedMax = FALSE;
     if ($isMultiple &&
       ($maxMultiple = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $customGroupId, 'max_multiple'))
diff --git a/civicrm/CRM/Core/BAO/CustomValueTable.php b/civicrm/CRM/Core/BAO/CustomValueTable.php
index 0b352b4c09..1fa9a508a8 100644
--- a/civicrm/CRM/Core/BAO/CustomValueTable.php
+++ b/civicrm/CRM/Core/BAO/CustomValueTable.php
@@ -92,7 +92,7 @@ class CRM_Core_BAO_CustomValueTable {
                       CRM_Core_PseudoConstant::stateProvinceAbbreviation(), TRUE
                     );
                   }
-                  $validStates[] = CRM_Utils_Array::value('state_province_id', $states);
+                  $validStates[] = $states['state_province_id'] ?? NULL;
                 }
                 $value = implode(CRM_Core_DAO::VALUE_SEPARATOR,
                   $validStates
@@ -132,7 +132,7 @@ class CRM_Core_BAO_CustomValueTable {
                       CRM_Core_PseudoConstant::countryIsoCode(), TRUE
                     );
                   }
-                  $validCountries[] = CRM_Utils_Array::value('country_id', $countries);
+                  $validCountries[] = $countries['country_id'] ?? NULL;
                 }
                 $value = implode(CRM_Core_DAO::VALUE_SEPARATOR,
                   $validCountries
@@ -217,7 +217,7 @@ class CRM_Core_BAO_CustomValueTable {
             $count++;
           }
 
-          $fieldExtends = CRM_Utils_Array::value('extends', $field);
+          $fieldExtends = $field['extends'] ?? NULL;
           if (
             CRM_Utils_Array::value('entity_table', $field) == 'civicrm_contact'
             || $fieldExtends == 'Contact'
@@ -225,7 +225,7 @@ class CRM_Core_BAO_CustomValueTable {
             || $fieldExtends == 'Organization'
             || $fieldExtends == 'Household'
           ) {
-            $paramFieldsExtendContactForEntities[$entityID]['custom_' . CRM_Utils_Array::value('custom_field_id', $field)] = CRM_Utils_Array::value('custom_field_id', $field);
+            $paramFieldsExtendContactForEntities[$entityID]['custom_' . CRM_Utils_Array::value('custom_field_id', $field)] = $field['custom_field_id'] ?? NULL;
           }
         }
 
@@ -345,7 +345,7 @@ class CRM_Core_BAO_CustomValueTable {
           'custom_group_id' => $customValue['custom_group_id'],
           'table_name' => $customValue['table_name'],
           'column_name' => $customValue['column_name'],
-          'is_multiple' => CRM_Utils_Array::value('is_multiple', $customValue),
+          'is_multiple' => $customValue['is_multiple'] ?? NULL,
           'file_id' => $customValue['file_id'],
         ];
 
@@ -473,7 +473,7 @@ AND    $cond
       }
       $fields[$dao->table_name][] = $dao->fieldID;
       $select[$dao->table_name][] = "{$dao->column_name} AS custom_{$dao->fieldID}";
-      $isMultiple[$dao->table_name] = $dao->is_multiple ? TRUE : FALSE;
+      $isMultiple[$dao->table_name] = (bool) $dao->is_multiple;
       $file[$dao->table_name][$dao->fieldID] = $dao->fieldDataType;
     }
 
diff --git a/civicrm/CRM/Core/BAO/Dashboard.php b/civicrm/CRM/Core/BAO/Dashboard.php
index b45df60c31..eb9d0b0063 100644
--- a/civicrm/CRM/Core/BAO/Dashboard.php
+++ b/civicrm/CRM/Core/BAO/Dashboard.php
@@ -120,7 +120,7 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
           'label' => $item['dashboard_id.label'],
           'url' => $item['dashboard_id.url'],
           'cache_minutes' => $item['dashboard_id.cache_minutes'],
-          'fullscreen_url' => CRM_Utils_Array::value('dashboard_id.fullscreen_url', $item),
+          'fullscreen_url' => $item['dashboard_id.fullscreen_url'] ?? NULL,
         ];
       }
     }
@@ -203,7 +203,7 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
             'label' => $dashlet['label'],
             'cache_minutes' => $dashlet['cache_minutes'],
             'url' => $dashlet['url'],
-            'fullscreen_url' => CRM_Utils_Array::value('fullscreen_url', $dashlet),
+            'fullscreen_url' => $dashlet['fullscreen_url'] ?? NULL,
           ];
         }
       }
@@ -387,7 +387,7 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
   public static function addDashlet(&$params) {
 
     // special case to handle duplicate entries for report instances
-    $dashboardID = CRM_Utils_Array::value('id', $params);
+    $dashboardID = $params['id'] ?? NULL;
 
     if (!empty($params['instanceURL'])) {
       $query = "SELECT id
@@ -399,33 +399,20 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
     $dashlet = new CRM_Core_DAO_Dashboard();
 
     if (!$dashboardID) {
-
       // Assign domain before search to allow identical dashlets in different domains.
-      if (empty($params['domain_id'])) {
-        $dashlet->domain_id = CRM_Core_Config::domainID();
-      }
-      else {
-        $dashlet->domain_id = CRM_Utils_Array::value('domain_id', $params);
-      }
+      $dashlet->domain_id = $params['domain_id'] ?? CRM_Core_Config::domainID();
 
       // Try and find an existing dashlet - it will be updated if found.
-      if (!empty($params['name'])) {
-        $dashlet->name = CRM_Utils_Array::value('name', $params);
-        $dashlet->find(TRUE);
-      }
-      else {
-        $dashlet->url = CRM_Utils_Array::value('url', $params);
+      if (!empty($params['name']) || !empty($params['url'])) {
+        $dashlet->name = $params['name'] ?? NULL;
+        $dashlet->url = $params['url'] ?? NULL;
         $dashlet->find(TRUE);
       }
-
     }
     else {
       $dashlet->id = $dashboardID;
     }
 
-    if (is_array(CRM_Utils_Array::value('permission', $params))) {
-      $params['permission'] = implode(',', $params['permission']);
-    }
     $dashlet->copyValues($params);
     $dashlet->save();
 
@@ -494,9 +481,9 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
     $valuesString = NULL;
     $columns = [];
     foreach ($params as $dashboardIDs) {
-      $contactID = CRM_Utils_Array::value('contact_id', $dashboardIDs);
-      $dashboardID = CRM_Utils_Array::value('dashboard_id', $dashboardIDs);
-      $column = CRM_Utils_Array::value('column_no', $dashboardIDs, 0);
+      $contactID = $dashboardIDs['contact_id'] ?? NULL;
+      $dashboardID = $dashboardIDs['dashboard_id'] ?? NULL;
+      $column = $dashboardIDs['column_no'] ?? 0;
       $columns[$column][$dashboardID] = 0;
     }
     self::saveDashletChanges($columns, $contactID);
@@ -504,19 +491,18 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
   }
 
   /**
-   * Delete Dashlet.
-   *
+   * @deprecated
    * @param int $dashletID
-   *
    * @return bool
    */
   public static function deleteDashlet($dashletID) {
-    $dashlet = new CRM_Core_DAO_Dashboard();
-    $dashlet->id = $dashletID;
-    if (!$dashlet->find(TRUE)) {
+    CRM_Core_Error::deprecatedFunctionWarning('CRM_Core_DAO_Dashboard::deleteRecord');
+    try {
+      CRM_Core_DAO_Dashboard::deleteRecord(['id' => $dashletID]);
+    }
+    catch (CRM_Core_Exception $e) {
       return FALSE;
     }
-    $dashlet->delete();
     return TRUE;
   }
 
diff --git a/civicrm/CRM/Core/BAO/Domain.php b/civicrm/CRM/Core/BAO/Domain.php
index 8cf1de41a1..4f6cc26161 100644
--- a/civicrm/CRM/Core/BAO/Domain.php
+++ b/civicrm/CRM/Core/BAO/Domain.php
@@ -70,6 +70,8 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    * @param bool $skipUsingCache
    *
    * @return null|string
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function version($skipUsingCache = FALSE) {
     return CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain',
@@ -85,6 +87,8 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    *
    * @return array
    *   Location::getValues
+   *
+   * @throws \CRM_Core_Exception
    */
   public function &getLocationValues() {
     if ($this->_location == NULL) {
@@ -107,8 +111,7 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    * @param array $params
    * @param int $id
    *
-   * @return array
-   *   domain
+   * @return CRM_Core_DAO_Domain
    */
   public static function edit(&$params, &$id) {
     CRM_Utils_Hook::pre('edit', 'Domain', CRM_Utils_Array::value('id', $params), $params);
@@ -125,8 +128,7 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    *
    * @param array $params
    *
-   * @return array
-   *   domain
+   * @return CRM_Core_DAO_Domain
    */
   public static function create($params) {
     $hook = empty($params['id']) ? 'create' : 'edit';
@@ -146,19 +148,21 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
 
     $numberDomains = $session->get('numberDomains');
     if (!$numberDomains) {
-      $query = "SELECT count(*) from civicrm_domain";
+      $query = 'SELECT count(*) from civicrm_domain';
       $numberDomains = CRM_Core_DAO::singleValueQuery($query);
       $session->set('numberDomains', $numberDomains);
     }
-    return $numberDomains > 1 ? TRUE : FALSE;
+    return $numberDomains > 1;
   }
 
   /**
    * @param bool $skipFatal
    * @param bool $returnString
+   *
    * @return array
    *   name & email for domain
-   * @throws Exception
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function getNameAndEmail($skipFatal = FALSE, $returnString = FALSE) {
     $fromEmailAddress = CRM_Core_OptionGroup::values('from_email_address', NULL, NULL, NULL, ' AND is_default = 1');
@@ -170,7 +174,7 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
       foreach ($fromEmailAddress as $key => $value) {
         $email = CRM_Utils_Mail::pluckEmailFromHeader($value);
         $fromArray = explode('"', $value);
-        $fromName = CRM_Utils_Array::value(1, $fromArray);
+        $fromName = $fromArray[1] ?? NULL;
         break;
       }
       return [$fromName, $email];
@@ -185,13 +189,15 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
     );
     $status = ts("There is no valid default from email address configured for the domain. You can configure here <a href='%1'>Configure From Email Address.</a>", [1 => $url]);
 
-    CRM_Core_Error::fatal($status);
+    throw new CRM_Core_Exception($status);
   }
 
   /**
    * @param int $contactID
    *
    * @return bool|null|object|string
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function addContactToDomainGroup($contactID) {
     $groupID = self::getGroupId();
@@ -207,6 +213,8 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
 
   /**
    * @return bool|null|object|string
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function getGroupId() {
     static $groupID = NULL;
@@ -237,14 +245,18 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    * @param int $groupId
    *
    * @return bool
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function isDomainGroup($groupId) {
     $domainGroupID = self::getGroupId();
-    return $domainGroupID == $groupId ? TRUE : FALSE;
+    return $domainGroupID == (bool) $groupId;
   }
 
   /**
    * @return array
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function getChildGroupIds() {
     $domainGroupID = self::getGroupId();
@@ -261,6 +273,8 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    * Retrieve a list of contact-ids that belongs to current domain/site.
    *
    * @return array
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function getContactList() {
     $siteGroups = CRM_Core_BAO_Domain::getChildGroupIds();
@@ -285,6 +299,8 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain {
    * CRM-20308 & CRM-19657
    * Return domain information / user information for the usage in receipts
    * Try default from address then fall back to using logged in user details
+   *
+   * @throws \CiviCRM_API3_Exception
    */
   public static function getDefaultReceiptFrom() {
     $domain = civicrm_api3('domain', 'getsingle', ['id' => CRM_Core_Config::domainID()]);
diff --git a/civicrm/CRM/Core/BAO/EntityTag.php b/civicrm/CRM/Core/BAO/EntityTag.php
index 88d8ab9fc5..cbd60e2cd6 100644
--- a/civicrm/CRM/Core/BAO/EntityTag.php
+++ b/civicrm/CRM/Core/BAO/EntityTag.php
@@ -483,4 +483,38 @@ class CRM_Core_BAO_EntityTag extends CRM_Core_DAO_EntityTag {
     return $options;
   }
 
+  /**
+   * This function deletes entity tags when a related entity is called.
+   *
+   * It is registered as a listener in \Civi\Core\Container::createEventDispatcher
+   *
+   * @param \Civi\Core\DAO\Event\PreDelete $event
+   */
+  public static function preDeleteOtherEntity($event) {
+    if (
+      $event->object instanceof CRM_Core_DAO_EntityTag
+      // Activity can call the pre hook for delete with no ID - this seems to be isolated to activity....
+      // @todo - what is the correct way to standardise activity delete?
+      || ($event->object instanceof CRM_Activity_DAO_Activity && !$event->object->id)
+
+    ) {
+      return;
+    }
+    // This is probably fairly mild in terms of helping performance - a case could be made to check if tags
+    // exist before deleting (further down) as delete is a locking action.
+    $entity = CRM_Core_DAO_AllCoreTables::getBriefName(get_class($event->object));
+    if (!isset(Civi::$statics[__CLASS__]['tagged_entities'][$entity])) {
+      $tableName = CRM_Core_DAO_AllCoreTables::getTableForEntityName($entity);
+      $used_for = CRM_Core_OptionGroup::values('tag_used_for');
+      Civi::$statics[__CLASS__]['tagged_entities'][$entity] = !empty($used_for[$tableName]) ? $tableName : FALSE;
+    }
+
+    if (Civi::$statics[__CLASS__]['tagged_entities'][$entity]) {
+      CRM_Core_DAO::executeQuery('DELETE FROM civicrm_entity_tag WHERE entity_table = %1 AND entity_id = %2',
+        [1 => [Civi::$statics[__CLASS__]['tagged_entities'][$entity], 'String'], 2 => [$event->object->id, 'Integer']]
+      );
+    }
+
+  }
+
 }
diff --git a/civicrm/CRM/Core/BAO/File.php b/civicrm/CRM/Core/BAO/File.php
index 207f02ea6c..3e78e3ffea 100644
--- a/civicrm/CRM/Core/BAO/File.php
+++ b/civicrm/CRM/Core/BAO/File.php
@@ -565,7 +565,7 @@ AND       CEF.entity_id    = %2";
         $extraParams = [
           'description' => $formValues[$attachDesc],
           'tag' => $tagParams,
-          'attachment_taglist' => CRM_Utils_Array::value($attachFreeTags, $formValues, []),
+          'attachment_taglist' => $formValues[$attachFreeTags] ?? [],
         ];
 
         CRM_Utils_File::formatFile($formValues, $attachName, $extraParams);
@@ -805,8 +805,8 @@ AND       CEF.entity_id    = %2";
    */
   public static function validateFileHash($hash, $entityId, $fileId) {
     $input = CRM_Utils_System::explode('_', $hash, 3);
-    $inputTs = CRM_Utils_Array::value(1, $input);
-    $inputLF = CRM_Utils_Array::value(2, $input);
+    $inputTs = $input[1] ?? NULL;
+    $inputLF = $input[2] ?? NULL;
     $testHash = CRM_Core_BAO_File::generateFileHash($entityId, $fileId, $inputTs, $inputLF);
     if (hash_equals($testHash, $hash)) {
       $now = time();
diff --git a/civicrm/CRM/Core/BAO/FinancialTrxn.php b/civicrm/CRM/Core/BAO/FinancialTrxn.php
index 6abb1bdb83..e7aaa4b49e 100644
--- a/civicrm/CRM/Core/BAO/FinancialTrxn.php
+++ b/civicrm/CRM/Core/BAO/FinancialTrxn.php
@@ -184,7 +184,7 @@ LIMIT 1;";
    */
   public static function getRefundTransactionTrxnID($contributionID) {
     $ids = self::getRefundTransactionIDs($contributionID);
-    return isset($ids['trxn_id']) ? $ids['trxn_id'] : NULL;
+    return $ids['trxn_id'] ?? NULL;
   }
 
   /**
@@ -348,8 +348,8 @@ WHERE ceft.entity_id = %1";
         'to_financial_account_id' => CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($params['financial_type_id'], $toFinancialAccountType),
         'from_financial_account_id' => CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($params['financial_type_id'], $fromFinancialAccountType),
         'trxn_date' => date('YmdHis'),
-        'total_amount' => CRM_Utils_Array::value('cost', $params) ? $params['cost'] : 0,
-        'currency' => CRM_Utils_Array::value('currency', $params),
+        'total_amount' => $params['cost'] ?? 0,
+        'currency' => $params['currency'] ?? NULL,
         'status_id' => array_search('Completed', $contributionStatuses),
         'entity_table' => 'civicrm_contribution',
         'entity_id' => $params['contributionId'],
@@ -364,9 +364,9 @@ WHERE ceft.entity_id = %1";
       $productDetails = [];
       CRM_Contribute_BAO_Product::retrieve($premiumParams, $productDetails);
       $params = [
-        'cost' => CRM_Utils_Array::value('cost', $productDetails),
-        'currency' => CRM_Utils_Array::value('currency', $productDetails),
-        'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $productDetails),
+        'cost' => $productDetails['cost'] ?? NULL,
+        'currency' => $productDetails['currency'] ?? NULL,
+        'financial_type_id' => $productDetails['financial_type_id'] ?? NULL,
         'contributionId' => $params['oldPremium']['contribution_id'],
         'isDeleted' => TRUE,
       ];
@@ -392,7 +392,7 @@ WHERE ceft.entity_id = %1";
     if (!$amount) {
       return FALSE;
     }
-    $contributionId = isset($params['contribution']->id) ? $params['contribution']->id : $params['contribution_id'];
+    $contributionId = $params['contribution']->id ?? $params['contribution_id'];
     if (empty($params['financial_type_id'])) {
       $financialTypeId = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'financial_type_id', 'id');
     }
@@ -667,7 +667,7 @@ WHERE ceft.entity_id = %1";
     }
 
     $financialTrxn = $financialTrxn['values'][$financialTrxn['id']];
-    $paymentProcessorID = CRM_Utils_Array::value('financial_trxn_id.payment_processor_id', $financialTrxn);
+    $paymentProcessorID = $financialTrxn['financial_trxn_id.payment_processor_id'] ?? NULL;
 
     if ($paymentProcessorID) {
       return NULL;
@@ -696,7 +696,7 @@ WHERE ceft.entity_id = %1";
     // ensure that there are all the information in updated contribution object identified by $currentContribution
     $currentContribution->find(TRUE);
 
-    $deferredFinancialAccount = CRM_Utils_Array::value('deferred_financial_account_id', $inputParams);
+    $deferredFinancialAccount = $inputParams['deferred_financial_account_id'] ?? NULL;
     if (empty($deferredFinancialAccount)) {
       $deferredFinancialAccount = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($prevContribution->financial_type_id, 'Deferred Revenue Account is');
     }
diff --git a/civicrm/CRM/Core/BAO/Location.php b/civicrm/CRM/Core/BAO/Location.php
index 77d3e338bd..ec50cd15f0 100644
--- a/civicrm/CRM/Core/BAO/Location.php
+++ b/civicrm/CRM/Core/BAO/Location.php
@@ -285,57 +285,6 @@ WHERE e.id = %1";
     }
   }
 
-  /**
-   * Copy or update location block.
-   *
-   * @param int $locBlockId
-   *   Location block id.
-   * @param int $updateLocBlockId
-   *   Update location block id.
-   *
-   * @return int
-   *   newly created/updated location block id.
-   */
-  public static function copyLocBlock($locBlockId, $updateLocBlockId = NULL) {
-    CRM_Core_Error::deprecatedFunctionWarning('unused function which will be removed');
-    //get the location info.
-    $defaults = $updateValues = [];
-    $locBlock = ['id' => $locBlockId];
-    CRM_Core_DAO::commonRetrieve('CRM_Core_DAO_LocBlock', $locBlock, $defaults);
-
-    if ($updateLocBlockId) {
-      //get the location info for update.
-      $copyLocationParams = ['id' => $updateLocBlockId];
-      CRM_Core_DAO::commonRetrieve('CRM_Core_DAO_LocBlock', $copyLocationParams, $updateValues);
-      foreach ($updateValues as $key => $value) {
-        if ($key != 'id') {
-          $copyLocationParams[$key] = 'null';
-        }
-      }
-    }
-
-    //copy all location blocks (email, phone, address, etc)
-    foreach ($defaults as $key => $value) {
-      if ($key != 'id') {
-        $tbl = explode("_", $key);
-        $name = ucfirst($tbl[0]);
-        $updateParams = NULL;
-        if ($updateId = CRM_Utils_Array::value($key, $updateValues)) {
-          $updateParams = ['id' => $updateId];
-        }
-
-        $copy = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_' . $name, ['id' => $value], $updateParams);
-        $copyLocationParams[$key] = $copy->id;
-      }
-    }
-
-    $copyLocation = CRM_Core_DAO::copyGeneric('CRM_Core_DAO_LocBlock',
-      ['id' => $locBlock['id']],
-      $copyLocationParams
-    );
-    return $copyLocation->id;
-  }
-
   /**
    * Make sure contact should have only one primary block, CRM-5051.
    *
diff --git a/civicrm/CRM/Core/BAO/Mapping.php b/civicrm/CRM/Core/BAO/Mapping.php
index b82a0c5dbb..19c6ec2290 100644
--- a/civicrm/CRM/Core/BAO/Mapping.php
+++ b/civicrm/CRM/Core/BAO/Mapping.php
@@ -795,16 +795,16 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
     $locationTypeId = NULL;
     $saveMappingFields = $defaults;
 
-    $saveMappingFields['name'] = CRM_Utils_Array::value('1', $v);
-    $saveMappingFields['contact_type'] = CRM_Utils_Array::value('0', $v);
-    $locationId = CRM_Utils_Array::value('2', $v);
+    $saveMappingFields['name'] = $v['1'] ?? NULL;
+    $saveMappingFields['contact_type'] = $v['0'] ?? NULL;
+    $locationId = $v['2'] ?? NULL;
     $saveMappingFields['location_type_id'] = is_numeric($locationId) ? $locationId : NULL;
 
     if ($v[1] == 'phone') {
-      $saveMappingFields['phone_type_id'] = CRM_Utils_Array::value('3', $v);
+      $saveMappingFields['phone_type_id'] = $v['3'] ?? NULL;
     }
     elseif ($v[1] == 'im') {
-      $saveMappingFields['im_provider_id'] = CRM_Utils_Array::value('3', $v);
+      $saveMappingFields['im_provider_id'] = $v['3'] ?? NULL;
     }
 
     // Handle mapping for 'related contact' fields
@@ -813,17 +813,17 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
       if (($first == 'a' && $second == 'b') || ($first == 'b' && $second == 'a')) {
 
         if (!empty($v['2'])) {
-          $saveMappingFields['name'] = CRM_Utils_Array::value('2', $v);
+          $saveMappingFields['name'] = $v['2'] ?? NULL;
         }
         elseif (!empty($v['4'])) {
-          $saveMappingFields['name'] = CRM_Utils_Array::value('4', $v);
+          $saveMappingFields['name'] = $v['4'] ?? NULL;
         }
 
         if (is_numeric(CRM_Utils_Array::value('3', $v))) {
-          $locationTypeId = CRM_Utils_Array::value('3', $v);
+          $locationTypeId = $v['3'] ?? NULL;
         }
         elseif (is_numeric(CRM_Utils_Array::value('5', $v))) {
-          $locationTypeId = CRM_Utils_Array::value('5', $v);
+          $locationTypeId = $v['5'] ?? NULL;
         }
 
         if (is_numeric(CRM_Utils_Array::value('4', $v))) {
@@ -831,11 +831,11 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
             $saveMappingFields['im_provider_id'] = $v[4];
           }
           else {
-            $saveMappingFields['phone_type_id'] = CRM_Utils_Array::value('4', $v);
+            $saveMappingFields['phone_type_id'] = $v['4'] ?? NULL;
           }
         }
         elseif (is_numeric(CRM_Utils_Array::value('6', $v))) {
-          $saveMappingFields['phone_type_id'] = CRM_Utils_Array::value('6', $v);
+          $saveMappingFields['phone_type_id'] = $v['6'] ?? NULL;
         }
 
         $saveMappingFields['location_type_id'] = is_numeric($locationTypeId) ? $locationTypeId : NULL;
@@ -870,17 +870,17 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
    * @return array
    */
   protected static function loadSavedMapping($mappingLocation, int $x, int $i, $mappingName, $mapperFields, $mappingContactType, $mappingRelation, array $specialFields, $mappingPhoneType, array $defaults, array $noneArray, $mappingImProvider, $mappingOperator, $mappingValue) {
-    $locationId = isset($mappingLocation[$x][$i]) ? $mappingLocation[$x][$i] : 0;
+    $locationId = $mappingLocation[$x][$i] ?? 0;
     if (isset($mappingName[$x][$i])) {
       if (is_array($mapperFields[$mappingContactType[$x][$i]])) {
 
         if (isset($mappingRelation[$x][$i])) {
-          $relLocationId = isset($mappingLocation[$x][$i]) ? $mappingLocation[$x][$i] : 0;
+          $relLocationId = $mappingLocation[$x][$i] ?? 0;
           if (!$relLocationId && in_array($mappingName[$x][$i], $specialFields)) {
             $relLocationId = " ";
           }
 
-          $relPhoneType = isset($mappingPhoneType[$x][$i]) ? $mappingPhoneType[$x][$i] : NULL;
+          $relPhoneType = $mappingPhoneType[$x][$i] ?? NULL;
 
           $defaults["mapper[$x][$i]"] = [
             $mappingContactType[$x][$i],
@@ -910,8 +910,8 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
           $noneArray[] = [$x, $i, 2];
         }
         else {
-          $phoneType = isset($mappingPhoneType[$x][$i]) ? $mappingPhoneType[$x][$i] : NULL;
-          $imProvider = isset($mappingImProvider[$x][$i]) ? $mappingImProvider[$x][$i] : NULL;
+          $phoneType = $mappingPhoneType[$x][$i] ?? NULL;
+          $imProvider = $mappingImProvider[$x][$i] ?? NULL;
           if (!$locationId && in_array($mappingName[$x][$i], $specialFields)) {
             $locationId = " ";
           }
@@ -940,11 +940,11 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
         $jsSet = TRUE;
 
         if (CRM_Utils_Array::value($i, CRM_Utils_Array::value($x, $mappingOperator))) {
-          $defaults["operator[$x][$i]"] = CRM_Utils_Array::value($i, $mappingOperator[$x]);
+          $defaults["operator[$x][$i]"] = $mappingOperator[$x][$i] ?? NULL;
         }
 
         if (CRM_Utils_Array::value($i, CRM_Utils_Array::value($x, $mappingValue))) {
-          $defaults["value[$x][$i]"] = CRM_Utils_Array::value($i, $mappingValue[$x]);
+          $defaults["value[$x][$i]"] = $mappingValue[$x][$i] ?? NULL;
         }
       }
     }
@@ -1024,12 +1024,12 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
         }
         if (!empty($v['1'])) {
           $fldName = $v[1];
-          $v2 = CRM_Utils_Array::value('2', $v);
+          $v2 = $v['2'] ?? NULL;
           if ($v2 && trim($v2)) {
             $fldName .= "-{$v[2]}";
           }
 
-          $v3 = CRM_Utils_Array::value('3', $v);
+          $v3 = $v['3'] ?? NULL;
           if ($v3 && trim($v3)) {
             $fldName .= "-{$v[3]}";
           }
diff --git a/civicrm/CRM/Core/BAO/MessageTemplate.php b/civicrm/CRM/Core/BAO/MessageTemplate.php
index 7f9ca16c5a..bf12a16a20 100644
--- a/civicrm/CRM/Core/BAO/MessageTemplate.php
+++ b/civicrm/CRM/Core/BAO/MessageTemplate.php
@@ -30,7 +30,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    * @param array $defaults
    *   (reference ) an assoc array to hold the flattened values.
    *
-   * @return CRM_Core_BAO_MessageTemplate
+   * @return CRM_Core_DAO_MessageTemplate
    */
   public static function retrieve(&$params, &$defaults) {
     $messageTemplates = new CRM_Core_DAO_MessageTemplate();
@@ -65,6 +65,8 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    *
    *
    * @return object
+   * @throws \CiviCRM_API3_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
    */
   public static function add(&$params) {
     // System Workflow Templates have a specific wodkflow_id in them but normal user end message templates don't
@@ -85,8 +87,10 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
           }
         }
         else {
-          if (!empty($params['workflow_id']) && !CRM_Core_Permission::check('edit system workflow message templates')) {
-            throw new \Civi\API\Exception\UnauthorizedException(ts('%1', [1 => $systemWorkflowPermissionDeniedMessage]));
+          if (!empty($params['workflow_id'])) {
+            if (!CRM_Core_Permission::check('edit system workflow message templates')) {
+              throw new \Civi\API\Exception\UnauthorizedException(ts('%1', [1 => $systemWorkflowPermissionDeniedMessage]));
+            }
           }
           elseif (!CRM_Core_Permission::check('edit user-driven message templates')) {
             throw new \Civi\API\Exception\UnauthorizedException(ts('%1', [1 => $userWorkflowPermissionDeniedMessage]));
@@ -129,11 +133,13 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    * Delete the Message Templates.
    *
    * @param int $messageTemplatesID
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function del($messageTemplatesID) {
     // make sure messageTemplatesID is an integer
     if (!CRM_Utils_Rule::positiveInteger($messageTemplatesID)) {
-      CRM_Core_Error::fatal(ts('Invalid Message template'));
+      throw new CRM_Core_Exception(ts('Invalid Message template'));
     }
 
     // Set mailing msg template col to NULL
@@ -158,7 +164,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    *
    * @param bool $isSMS
    *
-   * @return object
+   * @return array
    */
   public static function getMessageTemplates($all = TRUE, $isSMS = FALSE) {
     $msgTpls = [];
@@ -185,6 +191,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    * @param $from
    *
    * @return bool|NULL
+   * @throws \CRM_Core_Exception
    */
   public static function sendReminder($contactId, $email, $messageTemplateID, $from) {
 
@@ -301,6 +308,8 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    * Revert a message template to its default subject+text+HTML state.
    *
    * @param int $id id of the template
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function revert($id) {
     $diverted = new CRM_Core_BAO_MessageTemplate();
@@ -308,7 +317,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
     $diverted->find(1);
 
     if ($diverted->N != 1) {
-      CRM_Core_Error::fatal(ts('Did not find a message template with id of %1.', [1 => $id]));
+      throw new CRM_Core_Exception(ts('Did not find a message template with id of %1.', [1 => $id]));
     }
 
     $orig = new CRM_Core_BAO_MessageTemplate();
@@ -317,7 +326,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
     $orig->find(1);
 
     if ($orig->N != 1) {
-      CRM_Core_Error::fatal(ts('Message template with id of %1 does not have a default to revert to.', [1 => $id]));
+      throw new CRM_Core_Exception(ts('Message template with id of %1 does not have a default to revert to.', [1 => $id]));
     }
 
     $diverted->msg_subject = $orig->msg_subject;
@@ -335,6 +344,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
    *
    * @return array
    *   Array of four parameters: a boolean whether the email was sent, and the subject, text and HTML templates
+   * @throws \CRM_Core_Exception
    */
   public static function sendTemplate($params) {
     $defaults = [
@@ -381,7 +391,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
       ) &&
       !$params['messageTemplateID']
     ) {
-      CRM_Core_Error::fatal(ts("Message template's option group and/or option value or ID missing."));
+      throw new CRM_Core_Exception(ts("Message template's option group and/or option value or ID missing."));
     }
 
     if ($params['messageTemplateID']) {
@@ -405,14 +415,12 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
 
     if (!$dao->N) {
       if ($params['messageTemplateID']) {
-        CRM_Core_Error::fatal(ts('No such message template: id=%1.', [1 => $params['messageTemplateID']]));
-      }
-      else {
-        CRM_Core_Error::fatal(ts('No such message template: option group %1, option value %2.', [
-          1 => $params['groupName'],
-          2 => $params['valueName'],
-        ]));
+        throw new CRM_Core_Exception(ts('No such message template: id=%1.', [1 => $params['messageTemplateID']]));
       }
+      throw new CRM_Core_Exception(ts('No such message template: option group %1, option value %2.', [
+        1 => $params['groupName'],
+        2 => $params['valueName'],
+      ]));
     }
 
     $mailContent = [
@@ -453,7 +461,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
     CRM_Utils_Hook::tokens($hookTokens);
     $categories = array_keys($hookTokens);
 
-    $contactID = CRM_Utils_Array::value('contactId', $params);
+    $contactID = $params['contactId'] ?? NULL;
 
     if ($contactID) {
       $contactParams = ['contact_id' => $contactID];
@@ -545,11 +553,11 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
 
       $prefs = array_pop($contact);
 
-      if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'HTML') {
+      if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] === 'HTML') {
         $params['text'] = NULL;
       }
 
-      if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] == 'Text') {
+      if (isset($prefs['preferred_mail_format']) and $prefs['preferred_mail_format'] === 'Text') {
         $params['html'] = NULL;
       }
 
diff --git a/civicrm/CRM/Core/BAO/Navigation.php b/civicrm/CRM/Core/BAO/Navigation.php
index 755d708267..43391cf4d8 100644
--- a/civicrm/CRM/Core/BAO/Navigation.php
+++ b/civicrm/CRM/Core/BAO/Navigation.php
@@ -366,7 +366,7 @@ FROM civicrm_navigation WHERE domain_id = $domainID";
   public static function checkPermission($item) {
     if (!empty($item['permission'])) {
       $permissions = explode(',', $item['permission']);
-      $operator = CRM_Utils_Array::value('operator', $item);
+      $operator = $item['operator'] ?? NULL;
       $hasPermission = FALSE;
       foreach ($permissions as $key) {
         $key = trim($key);
@@ -486,7 +486,7 @@ FROM civicrm_navigation WHERE domain_id = $domainID";
     $referenceID = (int) str_replace("node_", "", $params['ref_id']);
     $position = $params['ps'];
     $type = $params['type'];
-    $label = CRM_Utils_Array::value('data', $params);
+    $label = $params['data'] ?? NULL;
 
     switch ($type) {
       case "move":
diff --git a/civicrm/CRM/Core/BAO/Note.php b/civicrm/CRM/Core/BAO/Note.php
index d210f6b60b..86a95fd080 100644
--- a/civicrm/CRM/Core/BAO/Note.php
+++ b/civicrm/CRM/Core/BAO/Note.php
@@ -35,8 +35,12 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
    * @return string
    *   the note text or NULL if note not found
    *
+   * @throws \CRM_Core_Exception
+   *
+   * @deprecated
    */
   public static function getNoteText($id) {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function');
     return CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Note', $id, 'note');
   }
 
@@ -49,6 +53,7 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
    * @return string
    *   the note subject or NULL if note not found
    *
+   * @throws \CRM_Core_Exception
    */
   public static function getNoteSubject($id) {
     return CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Note', $id, 'subject');
@@ -69,8 +74,8 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
       return FALSE;
     }
 
-    $noteValues = array();
-    if (is_object($note) && get_class($note) == 'CRM_Core_DAO_Note') {
+    $noteValues = [];
+    if (is_object($note) && get_class($note) === 'CRM_Core_DAO_Note') {
       CRM_Core_DAO::storeValues($note, $noteValues);
     }
     else {
@@ -145,7 +150,7 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
         $note->contact_id = $params['entity_id'];
       }
     }
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('id', $ids));
+    $id = $params['id'] ?? $ids['id'] ?? NULL;
     if ($id) {
       $note->id = $id;
     }
@@ -174,7 +179,7 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
         }
       }
 
-      $recentOther = array();
+      $recentOther = [];
       if ($noteActions) {
         $recentOther = array(
           'editUrl' => CRM_Utils_System::url('civicrm/contact/view/note',
@@ -229,8 +234,7 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
    * @param int $numNotes
    *   The maximum number of notes to return (0 if all).
    *
-   * @return object
-   *   $notes  Object of CRM_Core_BAO_Note
+   * @return array
    */
   public static function &getValues(&$params, &$values, $numNotes = self::MAX_NOTES) {
     if (empty($params)) {
@@ -248,10 +252,10 @@ class CRM_Core_BAO_Note extends CRM_Core_DAO_Note {
     $note->limit($numNotes);
     $note->find();
 
-    $notes = array();
+    $notes = [];
     $count = 0;
     while ($note->fetch()) {
-      $values['note'][$note->id] = array();
+      $values['note'][$note->id] = [];
       CRM_Core_DAO::storeValues($note, $values['note'][$note->id]);
       $notes[] = $note;
 
diff --git a/civicrm/CRM/Core/BAO/OptionValue.php b/civicrm/CRM/Core/BAO/OptionValue.php
index 2aefe0e14c..3f4031b98d 100644
--- a/civicrm/CRM/Core/BAO/OptionValue.php
+++ b/civicrm/CRM/Core/BAO/OptionValue.php
@@ -31,17 +31,14 @@ class CRM_Core_BAO_OptionValue extends CRM_Core_DAO_OptionValue {
    * @param array $params
    *   Input parameters.
    *
-   * @return object
+   * @return CRM_Core_DAO_OptionValue
+   * @throws \CRM_Core_Exception
    */
   public static function create($params) {
     if (empty($params['id'])) {
       self::setDefaults($params);
     }
-    $ids = [];
-    if (!empty($params['id'])) {
-      $ids = ['optionValue' => $params['id']];
-    }
-    return CRM_Core_BAO_OptionValue::add($params, $ids);
+    return CRM_Core_BAO_OptionValue::add($params);
   }
 
   /**
@@ -151,10 +148,15 @@ class CRM_Core_BAO_OptionValue extends CRM_Core_DAO_OptionValue {
    *   deprecated Reference array contains the id.
    *
    * @return \CRM_Core_DAO_OptionValue
+   *
    * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public static function add(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('optionValue', $ids));
+    if (!empty($ids['optionValue']) && empty($params['id'])) {
+      CRM_Core_Error::deprecatedFunctionWarning('$params[\'id\'] should be set, $ids is deprecated');
+    }
+    $id = $params['id'] ?? $ids['optionValue'] ?? NULL;
     // CRM-10921: do not reset attributes to default if this is an update
     //@todo consider if defaults are being set in the right place. 'dumb' defaults like
     // these would be usefully set @ the api layer so they are visible to api users
diff --git a/civicrm/CRM/Core/BAO/PrevNextCache.php b/civicrm/CRM/Core/BAO/PrevNextCache.php
index e7aa7b4382..4eae51e91a 100644
--- a/civicrm/CRM/Core/BAO/PrevNextCache.php
+++ b/civicrm/CRM/Core/BAO/PrevNextCache.php
@@ -326,6 +326,7 @@ FROM   civicrm_prevnext_cache pn
    * @return array
    */
   public static function convertSetItemValues($sqlValues) {
+    CRM_Core_Error::deprecatedFunctionWarning('Deprecated function');
     $closingBrace = strpos($sqlValues, ')') - strlen($sqlValues);
     $valueArray = array_map('trim', explode(', ', substr($sqlValues, strpos($sqlValues, '(') + 1, $closingBrace - 1)));
     foreach ($valueArray as $key => &$value) {
@@ -338,6 +339,8 @@ FROM   civicrm_prevnext_cache pn
   }
 
   /**
+   * @deprecated
+   *
    * @param array|string $entity_table
    * @param int $entity_id1
    * @param int $entity_id2
@@ -345,6 +348,7 @@ FROM   civicrm_prevnext_cache pn
    * @param string $data
    */
   public static function setItem($entity_table = NULL, $entity_id1 = NULL, $entity_id2 = NULL, $cacheKey = NULL, $data = NULL) {
+    CRM_Core_Error::deprecatedFunctionWarning('Deprecated function');
     // If entity table is an array we are passing in an older format where this function only had 1 param $values. We put a deprecation warning.
     if (!empty($entity_table) && is_array($entity_table)) {
       Civi::log()->warning('Deprecated code path. Values should not be set this is going away in the future in favour of specific function params for each column.', array('civi.tag' => 'deprecated'));
@@ -459,7 +463,13 @@ WHERE (pn.cachekey $op %1 OR pn.cachekey $op %2)
     }
   }
 
+  /**
+   * Old function to clean up he cache.
+   *
+   * @deprecated.
+   */
   public static function cleanupCache() {
+    CRM_Core_Error::deprecatedFunctionWarning('Deprecated function');
     Civi::service('prevnext')->cleanup();
   }
 
@@ -473,6 +483,7 @@ WHERE (pn.cachekey $op %1 OR pn.cachekey $op %2)
    * @see CRM_Core_PrevNextCache_Sql::getSelection()
    */
   public static function getSelection($cacheKey, $action = 'get') {
+    CRM_Core_Error::deprecatedFunctionWarning('Deprecated function');
     return Civi::service('prevnext')->getSelection($cacheKey, $action);
   }
 
@@ -530,6 +541,8 @@ WHERE (pn.cachekey $op %1 OR pn.cachekey $op %2)
    * @param array $fieldDef
    * @param int $counter
    *   The globally-unique ID of the test object.
+   *
+   * @throws \CRM_Core_Exception
    */
   protected function assignTestValue($fieldName, &$fieldDef, $counter) {
     if ($fieldName === 'cachekey') {
diff --git a/civicrm/CRM/Core/BAO/RecurringEntity.php b/civicrm/CRM/Core/BAO/RecurringEntity.php
index 6e16f1da75..9c6a73513a 100644
--- a/civicrm/CRM/Core/BAO/RecurringEntity.php
+++ b/civicrm/CRM/Core/BAO/RecurringEntity.php
@@ -319,7 +319,7 @@ class CRM_Core_BAO_RecurringEntity extends CRM_Core_DAO_RecurringEntity {
 
     $recursionDates = [];
     if (is_a($this->recursion, 'When\When')) {
-      $initialCount = CRM_Utils_Array::value('start_action_offset', $this->schedule);
+      $initialCount = $this->schedule['start_action_offset'] ?? NULL;
 
       $exRangeStart = $exRangeEnd = NULL;
       if (!empty($this->excludeDateRangeColumns)) {
@@ -894,7 +894,7 @@ class CRM_Core_BAO_RecurringEntity extends CRM_Core_DAO_RecurringEntity {
     //For Repeats on:(weekly case)
     if ($formParams['repetition_frequency_unit'] == 'week') {
       if (!empty($formParams['start_action_condition'])) {
-        $repeats_on = CRM_Utils_Array::value('start_action_condition', $formParams);
+        $repeats_on = $formParams['start_action_condition'] ?? NULL;
         $dbParams['start_action_condition'] = implode(",", array_keys($repeats_on));
       }
     }
@@ -1146,7 +1146,7 @@ class CRM_Core_BAO_RecurringEntity extends CRM_Core_DAO_RecurringEntity {
   public static function updateModeLinkedEntity($entityId, $linkedEntityTable, $mainEntityTable) {
     $result = [];
     if ($entityId && $linkedEntityTable && $mainEntityTable) {
-      if (CRM_Utils_Array::value($linkedEntityTable, self::$_tableDAOMapper)) {
+      if (!empty(self::$_tableDAOMapper[$linkedEntityTable])) {
         $dao = self::$_tableDAOMapper[$linkedEntityTable];
       }
       else {
diff --git a/civicrm/CRM/Core/BAO/SchemaHandler.php b/civicrm/CRM/Core/BAO/SchemaHandler.php
index 2f3f70241e..c6757015f0 100644
--- a/civicrm/CRM/Core/BAO/SchemaHandler.php
+++ b/civicrm/CRM/Core/BAO/SchemaHandler.php
@@ -585,8 +585,7 @@ MODIFY      {$columnName} varchar( $length )
   public static function checkIfFieldExists($tableName, $columnName, $i18nRewrite = TRUE) {
     $query = "SHOW COLUMNS FROM $tableName LIKE '%1'";
     $dao = CRM_Core_DAO::executeQuery($query, [1 => [$columnName, 'Alphanumeric']], TRUE, NULL, FALSE, $i18nRewrite);
-    $result = $dao->fetch() ? TRUE : FALSE;
-    return $result;
+    return (bool) $dao->fetch();
   }
 
   /**
diff --git a/civicrm/CRM/Core/BAO/Setting.php b/civicrm/CRM/Core/BAO/Setting.php
index 225f44926a..7518e37dc2 100644
--- a/civicrm/CRM/Core/BAO/Setting.php
+++ b/civicrm/CRM/Core/BAO/Setting.php
@@ -110,7 +110,7 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting {
     foreach ($domains as $domainID) {
       $result[$domainID] = [];
       foreach ($fieldsToGet as $name => $value) {
-        $contactID = CRM_Utils_Array::value('contact_id', $params);
+        $contactID = $params['contact_id'] ?? NULL;
         $setting = CRM_Core_BAO_Setting::getItem(NULL, $name, NULL, NULL, $contactID, $domainID);
         if (!is_null($setting)) {
           // we won't return if not set - helps in return all scenario - otherwise we can't indentify the missing ones
diff --git a/civicrm/CRM/Core/BAO/StatusPreference.php b/civicrm/CRM/Core/BAO/StatusPreference.php
index c09308f04f..2f225ee9fe 100644
--- a/civicrm/CRM/Core/BAO/StatusPreference.php
+++ b/civicrm/CRM/Core/BAO/StatusPreference.php
@@ -59,7 +59,7 @@ class CRM_Core_BAO_StatusPreference extends CRM_Core_DAO_StatusPreference {
 
     $statusPreference->copyValues($params);
 
-    $edit = ($statusPreference->id) ? TRUE : FALSE;
+    $edit = (bool) $statusPreference->id;
     if ($edit) {
       CRM_Utils_Hook::pre('edit', 'StatusPreference', $statusPreference->id, $statusPreference);
     }
diff --git a/civicrm/CRM/Core/BAO/Tag.php b/civicrm/CRM/Core/BAO/Tag.php
index ae94d043ea..2ef3afb411 100644
--- a/civicrm/CRM/Core/BAO/Tag.php
+++ b/civicrm/CRM/Core/BAO/Tag.php
@@ -333,10 +333,10 @@ class CRM_Core_BAO_Tag extends CRM_Core_DAO_Tag {
       $allTags[$id] = [
         'text' => $tag['name'],
         'id' => $id,
-        'description' => CRM_Utils_Array::value('description', $tag),
-        'parent_id' => CRM_Utils_Array::value('parent_id', $tag),
-        'used_for' => CRM_Utils_Array::value('used_for', $tag),
-        'color' => CRM_Utils_Array::value('color', $tag),
+        'description' => $tag['description'] ?? NULL,
+        'parent_id' => $tag['parent_id'] ?? NULL,
+        'used_for' => $tag['used_for'] ?? NULL,
+        'color' => $tag['color'] ?? NULL,
       ];
       if (!$allowSelectingNonSelectable && empty($tag['is_selectable'])) {
         $allTags[$id]['disabled'] = TRUE;
@@ -393,7 +393,7 @@ class CRM_Core_BAO_Tag extends CRM_Core_DAO_Tag {
    *   object on success, otherwise null
    */
   public static function add(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('tag', $ids));
+    $id = $params['id'] ?? $ids['tag'] ?? NULL;
     if (!$id && !self::dataExists($params)) {
       return NULL;
     }
@@ -453,6 +453,8 @@ class CRM_Core_BAO_Tag extends CRM_Core_DAO_Tag {
       );
     }
 
+    CRM_Core_PseudoConstant::flush();
+
     return $tag;
   }
 
diff --git a/civicrm/CRM/Core/BAO/UFField.php b/civicrm/CRM/Core/BAO/UFField.php
index aaec9715ec..2e1a4dc56d 100644
--- a/civicrm/CRM/Core/BAO/UFField.php
+++ b/civicrm/CRM/Core/BAO/UFField.php
@@ -37,7 +37,7 @@ class CRM_Core_BAO_UFField extends CRM_Core_DAO_UFField {
    * @throws \API_Exception
    */
   public static function create($params) {
-    $id = CRM_Utils_Array::value('id', $params);
+    $id = $params['id'] ?? NULL;
 
     $op = empty($id) ? 'create' : 'edit';
     CRM_Utils_Hook::pre('UFField', $op, $id, $params);
@@ -180,18 +180,18 @@ class CRM_Core_BAO_UFField extends CRM_Core_DAO_UFField {
    */
   public static function duplicateField($params) {
     $ufField = new CRM_Core_DAO_UFField();
-    $ufField->uf_group_id = CRM_Utils_Array::value('uf_group_id', $params);
-    $ufField->field_type = CRM_Utils_Array::value('field_type', $params);
-    $ufField->field_name = CRM_Utils_Array::value('field_name', $params);
-    $ufField->website_type_id = CRM_Utils_Array::value('website_type_id', $params);
+    $ufField->uf_group_id = $params['uf_group_id'] ?? NULL;
+    $ufField->field_type = $params['field_type'] ?? NULL;
+    $ufField->field_name = $params['field_name'] ?? NULL;
+    $ufField->website_type_id = $params['website_type_id'] ?? NULL;
     if (is_null(CRM_Utils_Array::value('location_type_id', $params, ''))) {
       // primary location type have NULL value in DB
       $ufField->whereAdd("location_type_id IS NULL");
     }
     else {
-      $ufField->location_type_id = CRM_Utils_Array::value('location_type_id', $params);
+      $ufField->location_type_id = $params['location_type_id'] ?? NULL;
     }
-    $ufField->phone_type_id = CRM_Utils_Array::value('phone_type_id', $params);
+    $ufField->phone_type_id = $params['phone_type_id'] ?? NULL;
 
     if (!empty($params['id'])) {
       $ufField->whereAdd("id <> " . $params['id']);
diff --git a/civicrm/CRM/Core/BAO/UFGroup.php b/civicrm/CRM/Core/BAO/UFGroup.php
index 43995fc555..ca4d9f9502 100644
--- a/civicrm/CRM/Core/BAO/UFGroup.php
+++ b/civicrm/CRM/Core/BAO/UFGroup.php
@@ -69,7 +69,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
         $cType = $type;
       }
       elseif (array_key_exists($type, $validSubTypes)) {
-        $cType = CRM_Utils_Array::value('parent', $validSubTypes[$type]);
+        $cType = $validSubTypes[$type]['parent'] ?? NULL;
       }
       if ($cType) {
         break;
@@ -464,7 +464,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
     if (isset($field->phone_type_id)) {
       $name .= "-{$field->phone_type_id}";
     }
-    $fieldMetaData = CRM_Utils_Array::value($name, $importableFields, (isset($importableFields[$field->field_name]) ? $importableFields[$field->field_name] : []));
+    $fieldMetaData = CRM_Utils_Array::value($name, $importableFields, ($importableFields[$field->field_name] ?? []));
 
     // No lie: this is bizarre; why do we need to mix so many UFGroup properties into UFFields?
     // I guess to make field self sufficient with all the required data and avoid additional calls
@@ -485,12 +485,12 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
       'visibility' => $field->visibility,
       'in_selector' => $field->in_selector,
       'rule' => CRM_Utils_Array::value('rule', CRM_Utils_Array::value($field->field_name, $importableFields)),
-      'location_type_id' => isset($field->location_type_id) ? $field->location_type_id : NULL,
-      'website_type_id' => isset($field->website_type_id) ? $field->website_type_id : NULL,
-      'phone_type_id' => isset($field->phone_type_id) ? $field->phone_type_id : NULL,
+      'location_type_id' => $field->location_type_id ?? NULL,
+      'website_type_id' => $field->website_type_id ?? NULL,
+      'phone_type_id' => $field->phone_type_id ?? NULL,
       'group_id' => $group->id,
-      'add_to_group_id' => isset($group->add_to_group_id) ? $group->add_to_group_id : NULL,
-      'add_captcha' => isset($group->add_captcha) ? $group->add_captcha : NULL,
+      'add_to_group_id' => $group->add_to_group_id ?? NULL,
+      'add_captcha' => $group->add_captcha ?? NULL,
       'field_type' => $field->field_type,
       'field_id' => $field->id,
       'pseudoconstant' => CRM_Utils_Array::value(
@@ -504,7 +504,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
       ),
       'skipDisplay' => 0,
       'data_type' => CRM_Utils_Type::getDataTypeFromFieldMetadata($fieldMetaData),
-      'bao' => CRM_Utils_Array::value('bao', $fieldMetaData),
+      'bao' => $fieldMetaData['bao'] ?? NULL,
     ];
 
     $formattedField = CRM_Utils_Date::addDateMetadataToField($fieldMetaData, $formattedField);
@@ -846,7 +846,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
       $controller->setEmbedded(TRUE);
 
       //CRM-5839 - though we want to process form, get the control back.
-      $controller->setSkipRedirection(($doNotProcess) ? FALSE : TRUE);
+      $controller->setSkipRedirection(!$doNotProcess);
 
       $controller->run();
 
@@ -907,7 +907,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
         $controller->setEmbedded(TRUE);
 
         //CRM-5846 - give the control back to drupal.
-        $controller->setSkipRedirection(($doNotProcess) ? FALSE : TRUE);
+        $controller->setSkipRedirection(!$doNotProcess);
         $controller->run();
 
         $template = CRM_Core_Smarty::singleton();
@@ -932,7 +932,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
         if (!empty($_POST)) {
           // get the new email
           $config = CRM_Core_Config::singleton();
-          $email = CRM_Utils_Array::value('mail', $_POST);
+          $email = $_POST['mail'] ?? NULL;
 
           if (CRM_Utils_Rule::email($email) && ($email != $userEmail[1])) {
             CRM_Core_BAO_UFMatch::updateContactEmail($userID, $email);
@@ -1115,7 +1115,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
               // field_type is only set when we are retrieving profile values
               // when sending email, we call the same function to get custom field
               // values etc, i.e. emulating a profile
-              $fieldType = CRM_Utils_Array::value('field_type', $field);
+              $fieldType = $field['field_type'] ?? NULL;
 
               if ($htmlType == 'File') {
                 $entityId = $cid;
@@ -1218,7 +1218,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
             $locationTypeName = 1;
           }
           else {
-            $locationTypeName = CRM_Utils_Array::value($id, $locationTypes);
+            $locationTypeName = $locationTypes[$id] ?? NULL;
           }
 
           if (!$locationTypeName) {
@@ -1448,8 +1448,8 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
       $params[$field] = CRM_Utils_Array::value($field, $params, FALSE);
     }
 
-    $params['limit_listings_group_id'] = CRM_Utils_Array::value('group', $params);
-    $params['add_to_group_id'] = CRM_Utils_Array::value('add_contact_to_group', $params);
+    $params['limit_listings_group_id'] = $params['group'] ?? NULL;
+    $params['add_to_group_id'] = $params['add_contact_to_group'] ?? NULL;
 
     //CRM-15427
     if (!empty($params['group_type']) && is_array($params['group_type'])) {
@@ -1804,7 +1804,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     $rule = $field['rule'];
     $view = $field['is_view'];
     $required = ($mode == CRM_Profile_Form::MODE_SEARCH) ? FALSE : $field['is_required'];
-    $search = ($mode == CRM_Profile_Form::MODE_SEARCH) ? TRUE : FALSE;
+    $search = $mode == CRM_Profile_Form::MODE_SEARCH;
     $isShared = CRM_Utils_Array::value('is_shared', $field, 0);
 
     // do not display view fields in drupal registration form
@@ -2288,7 +2288,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     if (!$componentId) {
       //get the contact details
       $contactDetails = CRM_Contact_BAO_Contact::getHierContactDetails($contactId, $fields);
-      $details = CRM_Utils_Array::value($contactId, $contactDetails);
+      $details = $contactDetails[$contactId] ?? NULL;
       $multipleFields = ['website' => 'url'];
 
       //start of code to set the default values
@@ -2397,7 +2397,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
                           }
                         }
                         else {
-                          $phoneDefault = CRM_Utils_Array::value('phone', $value);
+                          $phoneDefault = $value['phone'] ?? NULL;
                           // CRM-9216
                           if (!is_array($phoneDefault)) {
                             $defaults[$fldName] = $phoneDefault;
@@ -2440,7 +2440,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
                 && !empty($details['website'])
                 && !empty($details['website'][$locTypeId])
               ) {
-                $defaults[$fldName] = CRM_Utils_Array::value('url', $details['website'][$locTypeId]);
+                $defaults[$fldName] = $details['website'][$locTypeId]['url'] ?? NULL;
               }
             }
           }
@@ -2573,7 +2573,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
         }
       }
 
-      $validProfile = (empty($required)) ? TRUE : FALSE;
+      $validProfile = (empty($required));
     }
 
     return $validProfile;
diff --git a/civicrm/CRM/Core/BAO/UFJoin.php b/civicrm/CRM/Core/BAO/UFJoin.php
index caffd2c500..f9850e515a 100644
--- a/civicrm/CRM/Core/BAO/UFJoin.php
+++ b/civicrm/CRM/Core/BAO/UFJoin.php
@@ -53,9 +53,9 @@ class CRM_Core_BAO_UFJoin extends CRM_Core_DAO_UFJoin {
    * @param array $params
    */
   public static function deleteAll(&$params) {
-    $module = CRM_Utils_Array::value('module', $params);
-    $entityTable = CRM_Utils_Array::value('entity_table', $params);
-    $entityID = CRM_Utils_Array::value('entity_id', $params);
+    $module = $params['module'] ?? NULL;
+    $entityTable = $params['entity_table'] ?? NULL;
+    $entityID = $params['entity_id'] ?? NULL;
 
     if (empty($entityTable) ||
       empty($entityID) ||
@@ -90,10 +90,10 @@ class CRM_Core_BAO_UFJoin extends CRM_Core_DAO_UFJoin {
 
     // CRM-4377 (ab)uses the module column
     if (isset($params['module'])) {
-      $dao->module = CRM_Utils_Array::value('module', $params);
+      $dao->module = $params['module'] ?? NULL;
     }
-    $dao->entity_table = CRM_Utils_Array::value('entity_table', $params);
-    $dao->entity_id = CRM_Utils_Array::value('entity_id', $params);
+    $dao->entity_table = $params['entity_table'] ?? NULL;
+    $dao->entity_id = $params['entity_id'] ?? NULL;
     // user reg / my account can have multiple entries, so we return if thats
     // the case. (since entity_table/id is empty in those cases
     if (!$dao->entity_table ||
@@ -101,7 +101,7 @@ class CRM_Core_BAO_UFJoin extends CRM_Core_DAO_UFJoin {
     ) {
       return NULL;
     }
-    $dao->weight = CRM_Utils_Array::value('weight', $params);
+    $dao->weight = $params['weight'] ?? NULL;
     if ($dao->find(TRUE)) {
       return $dao->id;
     }
@@ -122,10 +122,10 @@ class CRM_Core_BAO_UFJoin extends CRM_Core_DAO_UFJoin {
 
     $dao = new CRM_Core_DAO_UFJoin();
 
-    $dao->entity_table = CRM_Utils_Array::value('entity_table', $params);
-    $dao->entity_id = CRM_Utils_Array::value('entity_id', $params);
-    $dao->weight = CRM_Utils_Array::value('weight', $params);
-    $dao->module = CRM_Utils_Array::value('module', $params);
+    $dao->entity_table = $params['entity_table'] ?? NULL;
+    $dao->entity_id = $params['entity_id'] ?? NULL;
+    $dao->weight = $params['weight'] ?? NULL;
+    $dao->module = $params['module'] ?? NULL;
     if ($dao->find(TRUE)) {
       return $dao->uf_group_id;
     }
@@ -143,10 +143,10 @@ class CRM_Core_BAO_UFJoin extends CRM_Core_DAO_UFJoin {
 
     // CRM-4377 (ab)uses the module column
     if (isset($params['module'])) {
-      $dao->module = CRM_Utils_Array::value('module', $params);
+      $dao->module = $params['module'] ?? NULL;
     }
-    $dao->entity_table = CRM_Utils_Array::value('entity_table', $params);
-    $dao->entity_id = CRM_Utils_Array::value('entity_id', $params);
+    $dao->entity_table = $params['entity_table'] ?? NULL;
+    $dao->entity_id = $params['entity_id'] ?? NULL;
     $dao->orderBy('weight asc');
     $dao->find();
     $first = $firstActive = NULL;
diff --git a/civicrm/CRM/Core/BAO/UFMatch.php b/civicrm/CRM/Core/BAO/UFMatch.php
index 58996fd30a..116ebd141c 100644
--- a/civicrm/CRM/Core/BAO/UFMatch.php
+++ b/civicrm/CRM/Core/BAO/UFMatch.php
@@ -519,9 +519,11 @@ AND    domain_id    = %4
   }
 
   /**
+   * @deprecated
    * @return bool
    */
   public static function isEmptyTable() {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
     $sql = "SELECT count(id) FROM civicrm_uf_match";
     return CRM_Core_DAO::singleValueQuery($sql) > 0 ? FALSE : TRUE;
   }
@@ -529,11 +531,12 @@ AND    domain_id    = %4
   /**
    * Get the list of contact_id.
    *
-   *
+   * @deprecated
    * @return int
    *   contact_id on success, null otherwise
    */
   public static function getContactIDs() {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
     $id = [];
     $dao = new CRM_Core_DAO_UFMatch();
     $dao->find();
@@ -546,13 +549,14 @@ AND    domain_id    = %4
   /**
    * See if this user exists, and if so, if they're allowed to login
    *
-   *
+   * @deprecated
    * @param int $openId
    *
    * @return bool
    *   true if allowed to login, false otherwise
    */
   public static function getAllowedToLogin($openId) {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
     $ufmatch = new CRM_Core_DAO_UFMatch();
     $ufmatch->uf_name = $openId;
     $ufmatch->allowed_to_login = 1;
@@ -566,11 +570,12 @@ AND    domain_id    = %4
    * Get the next unused uf_id value, since the standalone UF doesn't
    * have id's (it uses OpenIDs, which go in a different field)
    *
-   *
+   * @deprecated
    * @return int
    *   next highest unused value for uf_id
    */
   public static function getNextUfIdValue() {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
     $query = "SELECT MAX(uf_id)+1 AS next_uf_id FROM civicrm_uf_match";
     $dao = CRM_Core_DAO::executeQuery($query);
     if ($dao->fetch()) {
@@ -585,10 +590,11 @@ AND    domain_id    = %4
 
   /**
    * @param $email
-   *
+   * @deprecated
    * @return bool
    */
   public static function isDuplicateUser($email) {
+    CRM_Core_Error::deprecatedFunctionWarning('unused function to be removed');
     $session = CRM_Core_Session::singleton();
     $contactID = $session->get('userID');
     if (!empty($email) && isset($contactID)) {
diff --git a/civicrm/CRM/Core/BAO/Website.php b/civicrm/CRM/Core/BAO/Website.php
index 4c008b4b38..dadea5710c 100644
--- a/civicrm/CRM/Core/BAO/Website.php
+++ b/civicrm/CRM/Core/BAO/Website.php
@@ -83,7 +83,7 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
 
     $ids = self::allWebsites($contactID);
     foreach ($params as $key => $values) {
-      $id = CRM_Utils_Array::value('id', $values);
+      $id = $values['id'] ?? NULL;
       if (array_key_exists($id, $ids)) {
         unset($ids[$id]);
       }
diff --git a/civicrm/CRM/Core/BAO/WordReplacement.php b/civicrm/CRM/Core/BAO/WordReplacement.php
index e5e215a46c..d8fe9df6b3 100644
--- a/civicrm/CRM/Core/BAO/WordReplacement.php
+++ b/civicrm/CRM/Core/BAO/WordReplacement.php
@@ -232,7 +232,7 @@ WHERE  domain_id = %1
           $localCustomData = $localeCustomArray[$lang];
           // Traverse status array "enabled" "disabled"
           foreach ($localCustomData as $status => $matchTypes) {
-            $params["is_active"] = ($status == "enabled") ? TRUE : FALSE;
+            $params["is_active"] = $status == "enabled";
             // Traverse Match Type array "wildcardMatch" "exactMatch"
             foreach ($matchTypes as $matchType => $words) {
               $params["match_type"] = $matchType;
diff --git a/civicrm/CRM/Core/Block.php b/civicrm/CRM/Core/Block.php
index f624810dda..2194e46882 100644
--- a/civicrm/CRM/Core/Block.php
+++ b/civicrm/CRM/Core/Block.php
@@ -175,7 +175,7 @@ class CRM_Core_Block {
     if (!(self::$_properties)) {
       self::initProperties();
     }
-    return isset(self::$_properties[$id][$property]) ? self::$_properties[$id][$property] : NULL;
+    return self::$_properties[$id][$property] ?? NULL;
   }
 
   /**
@@ -439,7 +439,7 @@ class CRM_Core_Block {
       $value['url'] = CRM_Utils_System::url($short['path'], $short['query'], FALSE);
     }
     $value['title'] = $short['title'];
-    $value['ref'] = isset($short['ref']) ? $short['ref'] : '';
+    $value['ref'] = $short['ref'] ?? '';
     if (!empty($short['shortCuts'])) {
       foreach ($short['shortCuts'] as $shortCut) {
         $value['shortCuts'][] = self::setShortcutValues($shortCut);
@@ -477,7 +477,7 @@ class CRM_Core_Block {
         $value['url'] = CRM_Utils_System::url($dash['path'], $dash['query'], FALSE);
       }
       $value['title'] = $dash['title'];
-      $value['key'] = CRM_Utils_Array::value('key', $dash);
+      $value['key'] = $dash['key'] ?? NULL;
       $values[] = $value;
     }
     self::setProperty(self::DASHBOARD, 'templateValues', array('dashboardLinks' => $values));
diff --git a/civicrm/CRM/Core/CodeGen/Util/Xml.php b/civicrm/CRM/Core/CodeGen/Util/Xml.php
index 8d64be7006..4a629b5014 100644
--- a/civicrm/CRM/Core/CodeGen/Util/Xml.php
+++ b/civicrm/CRM/Core/CodeGen/Util/Xml.php
@@ -12,6 +12,8 @@ class CRM_Core_CodeGen_Util_Xml {
    * @return SimpleXMLElement|bool
    */
   public static function parse($file) {
+    // xinclude() only works with forward slashes
+    $file = str_replace(DIRECTORY_SEPARATOR, '/', $file);
     $dom = new DomDocument();
     $xmlString = file_get_contents($file);
     $dom->loadXML($xmlString);
diff --git a/civicrm/CRM/Core/Component.php b/civicrm/CRM/Core/Component.php
index 73cb707a5a..10b302d5f5 100644
--- a/civicrm/CRM/Core/Component.php
+++ b/civicrm/CRM/Core/Component.php
@@ -63,7 +63,7 @@ class CRM_Core_Component {
   public static function get($name, $attribute = NULL) {
     $comp = CRM_Utils_Array::value($name, self::_info());
     if ($attribute) {
-      return CRM_Utils_Array::value($attribute, $comp->info);
+      return $comp->info[$attribute] ?? NULL;
     }
     return $comp;
   }
diff --git a/civicrm/CRM/Core/Component/Info.php b/civicrm/CRM/Core/Component/Info.php
index 5106a0f99f..33dabe3639 100644
--- a/civicrm/CRM/Core/Component/Info.php
+++ b/civicrm/CRM/Core/Component/Info.php
@@ -305,7 +305,7 @@ abstract class CRM_Core_Component_Info {
    *   true if component needs search integration
    */
   public function usesSearch() {
-    return $this->info['search'] ? TRUE : FALSE;
+    return (bool) $this->info['search'];
   }
 
   /**
diff --git a/civicrm/CRM/Core/Config.php b/civicrm/CRM/Core/Config.php
index 4025c5d5ac..2b4623ef51 100644
--- a/civicrm/CRM/Core/Config.php
+++ b/civicrm/CRM/Core/Config.php
@@ -421,7 +421,7 @@ class CRM_Core_Config extends CRM_Core_Config_MagicMerge {
         $urlVar = 'task';
       }
 
-      $path = CRM_Utils_Array::value($urlVar, $_GET);
+      $path = $_GET[$urlVar] ?? NULL;
     }
 
     if ($path && preg_match('/^civicrm\/upgrade(\/.*)?$/', $path)) {
diff --git a/civicrm/CRM/Core/Config/MagicMerge.php b/civicrm/CRM/Core/Config/MagicMerge.php
index 84f27ed990..88110b6432 100644
--- a/civicrm/CRM/Core/Config/MagicMerge.php
+++ b/civicrm/CRM/Core/Config/MagicMerge.php
@@ -224,7 +224,7 @@ class CRM_Core_Config_MagicMerge {
     }
 
     $type = $this->map[$k][0];
-    $name = isset($this->map[$k][1]) ? $this->map[$k][1] : $k;
+    $name = $this->map[$k][1] ?? $k;
 
     switch ($type) {
       case 'setting':
@@ -358,7 +358,7 @@ class CRM_Core_Config_MagicMerge {
     }
     unset($this->cache[$k]);
     $type = $this->map[$k][0];
-    $name = isset($this->map[$k][1]) ? $this->map[$k][1] : $k;
+    $name = $this->map[$k][1] ?? $k;
 
     switch ($type) {
       case 'setting':
diff --git a/civicrm/CRM/Core/Controller.php b/civicrm/CRM/Core/Controller.php
index 6f2ea70368..8bfbc6de4c 100644
--- a/civicrm/CRM/Core/Controller.php
+++ b/civicrm/CRM/Core/Controller.php
@@ -208,7 +208,7 @@ class CRM_Core_Controller extends HTML_QuickForm_Controller {
 
     parent::__construct($name, $modal);
 
-    $snippet = CRM_Utils_Array::value('snippet', $_REQUEST);
+    $snippet = $_REQUEST['snippet'] ?? NULL;
     if ($snippet) {
       if ($snippet == 3) {
         $this->_print = CRM_Core_Smarty::PRINT_PDF;
@@ -284,7 +284,7 @@ class CRM_Core_Controller extends HTML_QuickForm_Controller {
       return NULL;
     }
 
-    $key = CRM_Utils_Array::value('qfKey', $_REQUEST, NULL);
+    $key = $_REQUEST['qfKey'] ?? NULL;
     if (!$key && $_SERVER['REQUEST_METHOD'] === 'GET') {
       $key = CRM_Core_Key::get($name, $addSequence);
     }
@@ -417,8 +417,8 @@ class CRM_Core_Controller extends HTML_QuickForm_Controller {
     $pages = $stateMachine->getPages();
     foreach ($pages as $name => $value) {
       $className = CRM_Utils_Array::value('className', $value, $name);
-      $title = CRM_Utils_Array::value('title', $value);
-      $options = CRM_Utils_Array::value('options', $value);
+      $title = $value['title'] ?? NULL;
+      $options = $value['options'] ?? NULL;
       $stateName = CRM_Utils_String::getClassName($className);
       if (!empty($value['className'])) {
         $formName = $name;
@@ -464,7 +464,7 @@ class CRM_Core_Controller extends HTML_QuickForm_Controller {
    */
   public function getButtonName() {
     $data = &$this->container();
-    return CRM_Utils_Array::value('_qf_button_name', $data);
+    return $data['_qf_button_name'] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO.php b/civicrm/CRM/Core/DAO.php
index 53503b1ee2..e6e301e508 100644
--- a/civicrm/CRM/Core/DAO.php
+++ b/civicrm/CRM/Core/DAO.php
@@ -202,8 +202,8 @@ class CRM_Core_DAO extends DB_DataObject {
    * @param array $params
    */
   protected function assignTestFK($fieldName, $fieldDef, $params) {
-    $required = CRM_Utils_Array::value('required', $fieldDef);
-    $FKClassName = CRM_Utils_Array::value('FKClassName', $fieldDef);
+    $required = $fieldDef['required'] ?? NULL;
+    $FKClassName = $fieldDef['FKClassName'] ?? NULL;
     $dbName = $fieldDef['name'];
     $daoName = str_replace('_BAO_', '_DAO_', get_class($this));
 
@@ -343,7 +343,7 @@ class CRM_Core_DAO extends DB_DataObject {
           }
           else {
             $this->$dbName = $dbName . '_' . $counter;
-            $maxlength = CRM_Utils_Array::value('maxlength', $fieldDef);
+            $maxlength = $fieldDef['maxlength'] ?? NULL;
             if ($maxlength > 0 && strlen($this->$dbName) > $maxlength) {
               $this->$dbName = substr($this->$dbName, 0, $fieldDef['maxlength']);
             }
@@ -672,7 +672,7 @@ class CRM_Core_DAO extends DB_DataObject {
           $allNull = FALSE;
         }
         else {
-          $maxLength = CRM_Utils_Array::value('maxlength', $field);
+          $maxLength = $field['maxlength'] ?? NULL;
           if (!is_array($value) && $maxLength && mb_strlen($value) > $maxLength && empty($field['pseudoconstant'])) {
             Civi::log()->warning(ts('A string for field $dbName has been truncated. The original string was %1', [CRM_Utils_Type::escape($value, 'String')]));
             // The string is too long - what to do what to do? Well losing data is generally bad so lets' truncate
@@ -721,8 +721,8 @@ class CRM_Core_DAO extends DB_DataObject {
   public static function makeAttribute($field) {
     if ($field) {
       if (CRM_Utils_Array::value('type', $field) == CRM_Utils_Type::T_STRING) {
-        $maxLength = CRM_Utils_Array::value('maxlength', $field);
-        $size = CRM_Utils_Array::value('size', $field);
+        $maxLength = $field['maxlength'] ?? NULL;
+        $size = $field['size'] ?? NULL;
         if ($maxLength || $size) {
           $attributes = [];
           if ($maxLength) {
@@ -735,11 +735,11 @@ class CRM_Core_DAO extends DB_DataObject {
         }
       }
       elseif (CRM_Utils_Array::value('type', $field) == CRM_Utils_Type::T_TEXT) {
-        $rows = CRM_Utils_Array::value('rows', $field);
+        $rows = $field['rows'] ?? NULL;
         if (!isset($rows)) {
           $rows = 2;
         }
-        $cols = CRM_Utils_Array::value('cols', $field);
+        $cols = $field['cols'] ?? NULL;
         if (!isset($cols)) {
           $cols = 80;
         }
@@ -775,7 +775,7 @@ class CRM_Core_DAO extends DB_DataObject {
     $object = new $class();
     $fields = $object->fields();
     if ($fieldName != NULL) {
-      $field = CRM_Utils_Array::value($fieldName, $fields);
+      $field = $fields[$fieldName] ?? NULL;
       return self::makeAttribute($field);
     }
     else {
@@ -794,6 +794,62 @@ class CRM_Core_DAO extends DB_DataObject {
     return NULL;
   }
 
+  /**
+   * Create or update a record from supplied params.
+   *
+   * If 'id' is supplied, an existing record will be updated
+   * Otherwise a new record will be created.
+   *
+   * @param array $record
+   * @return CRM_Core_DAO
+   * @throws CRM_Core_Exception
+   */
+  public static function writeRecord(array $record) {
+    $hook = empty($record['id']) ? 'create' : 'edit';
+    $className = CRM_Core_DAO_AllCoreTables::getCanonicalClassName(static::class);
+    if ($className === 'CRM_Core_DAO') {
+      throw new CRM_Core_Exception('Function writeRecord must be called on a subclass of CRM_Core_DAO');
+    }
+    $entityName = CRM_Core_DAO_AllCoreTables::getBriefName($className);
+
+    \CRM_Utils_Hook::pre($hook, $entityName, $record['id'] ?? NULL, $record);
+    $instance = new $className();
+    $instance->copyValues($record);
+    $instance->save();
+    \CRM_Utils_Hook::post($hook, $entityName, $instance->id, $instance);
+
+    return $instance;
+  }
+
+  /**
+   * Delete a record from supplied params.
+   *
+   * @param array $record
+   *   'id' is required.
+   * @return CRM_Core_DAO
+   * @throws CRM_Core_Exception
+   */
+  public static function deleteRecord(array $record) {
+    $className = CRM_Core_DAO_AllCoreTables::getCanonicalClassName(static::class);
+    if ($className === 'CRM_Core_DAO') {
+      throw new CRM_Core_Exception('Function deleteRecord must be called on a subclass of CRM_Core_DAO');
+    }
+    $entityName = CRM_Core_DAO_AllCoreTables::getBriefName($className);
+    if (empty($record['id'])) {
+      throw new CRM_Core_Exception("Cannot delete {$entityName} with no id.");
+    }
+
+    CRM_Utils_Hook::pre('delete', $entityName, $record['id'], $record);
+    $instance = new $className();
+    $instance->id = $record['id'];
+    if (!$instance->delete()) {
+      throw new CRM_Core_Exception("Could not delete {$entityName} id {$record['id']}");
+    }
+    CRM_Utils_Hook::post('delete', $entityName, $record['id'], $instance);
+
+    return $instance;
+  }
+
   /**
    * Check if there is a record with the same name in the db.
    *
@@ -821,7 +877,7 @@ class CRM_Core_DAO extends DB_DataObject {
     }
 
     if ($object->find(TRUE)) {
-      return ($daoID && $object->id == $daoID) ? TRUE : FALSE;
+      return $daoID && $object->id == $daoID;
     }
     else {
       return TRUE;
@@ -920,7 +976,7 @@ class CRM_Core_DAO extends DB_DataObject {
       $show[$tableName] = $dao->Create_Table;
     }
 
-    return preg_match("/\b$constraint\b/i", $show[$tableName]) ? TRUE : FALSE;
+    return (bool) preg_match("/\b$constraint\b/i", $show[$tableName]);
   }
 
   /**
@@ -947,7 +1003,7 @@ class CRM_Core_DAO extends DB_DataObject {
         $show[$tableName] = $dao->Create_Table;
       }
 
-      $result = preg_match("/\bCONSTRAINT\b\s/i", $show[$tableName]) ? TRUE : FALSE;
+      $result = (bool) preg_match("/\bCONSTRAINT\b\s/i", $show[$tableName]);
       if ($result == TRUE) {
         continue;
       }
@@ -985,7 +1041,7 @@ class CRM_Core_DAO extends DB_DataObject {
     }
     $constraint = "`FK_{$tableName}_{$columnName}`";
     $pattern = "/\bCONSTRAINT\b\s+%s\s+\bFOREIGN\s+KEY\b\s/i";
-    return preg_match(sprintf($pattern, $constraint), $show[$tableName]) ? TRUE : FALSE;
+    return (bool) preg_match(sprintf($pattern, $constraint), $show[$tableName]);
   }
 
   /**
@@ -1037,8 +1093,7 @@ LIKE %1
     $params = [1 => [$tableName, 'String']];
 
     $dao = CRM_Core_DAO::executeQuery($query, $params);
-    $result = $dao->fetch() ? TRUE : FALSE;
-    return $result;
+    return (bool) $dao->fetch();
   }
 
   /**
@@ -1064,7 +1119,7 @@ SELECT version
 FROM   civicrm_domain
 ";
     $dbVersion = CRM_Core_DAO::singleValueQuery($query);
-    return trim($version) == trim($dbVersion) ? TRUE : FALSE;
+    return trim($version) == trim($dbVersion);
   }
 
   /**
@@ -1171,7 +1226,7 @@ FROM   civicrm_domain
    * @param bool $force
    *   Skip use of the cache.
    *
-   * @return string|null
+   * @return string|int|null
    *   Value of $returnColumn in the retrieved record
    *
    * @throws \CRM_Core_Exception
@@ -1993,8 +2048,8 @@ SELECT contact_id
       $fields = $object->fields();
       foreach ($fields as $fieldName => $fieldDef) {
         $dbName = $fieldDef['name'];
-        $FKClassName = CRM_Utils_Array::value('FKClassName', $fieldDef);
-        $required = CRM_Utils_Array::value('required', $fieldDef);
+        $FKClassName = $fieldDef['FKClassName'] ?? NULL;
+        $required = $fieldDef['required'] ?? NULL;
 
         if (CRM_Utils_Array::value($dbName, $params) !== NULL && !is_array($params[$dbName])) {
           $object->$dbName = $params[$dbName];
@@ -2046,7 +2101,7 @@ SELECT contact_id
     $config->backtrace = TRUE;
 
     $object = new $daoName();
-    $object->id = CRM_Utils_Array::value('id', $params);
+    $object->id = $params['id'] ?? NULL;
 
     // array(array(0 => $daoName, 1 => $daoParams))
     $deletions = [];
@@ -2057,8 +2112,8 @@ SELECT contact_id
 
         $dbName = $value['name'];
 
-        $FKClassName = CRM_Utils_Array::value('FKClassName', $value);
-        $required = CRM_Utils_Array::value('required', $value);
+        $FKClassName = $value['FKClassName'] ?? NULL;
+        $required = $value['required'] ?? NULL;
         if ($FKClassName != NULL
           && $object->$dbName
           && !in_array($FKClassName, CRM_Core_DAO::$_testEntitiesToSkip)
@@ -2526,7 +2581,7 @@ SELECT contact_id
       throw new Exception('Cannot call getOptionLabels on CRM_Core_DAO');
     }
     foreach ($fields as $field) {
-      $name = CRM_Utils_Array::value('name', $field);
+      $name = $field['name'] ?? NULL;
       if ($name && isset($this->$name)) {
         $label = CRM_Core_PseudoConstant::getLabel(get_class($this), $name, $this->$name);
         if ($label !== FALSE) {
@@ -2573,7 +2628,7 @@ SELECT contact_id
     // Support "unique names" as well as sql names
     $fieldKey = $fieldName;
     if (empty($fields[$fieldKey])) {
-      $fieldKey = CRM_Utils_Array::value($fieldName, $fieldKeys);
+      $fieldKey = $fieldKeys[$fieldName] ?? NULL;
     }
     // If neither worked then this field doesn't exist. Return false.
     if (empty($fields[$fieldKey])) {
diff --git a/civicrm/CRM/Core/DAO/AllCoreTables.php b/civicrm/CRM/Core/DAO/AllCoreTables.php
index 41e71b0e48..0fee62521c 100644
--- a/civicrm/CRM/Core/DAO/AllCoreTables.php
+++ b/civicrm/CRM/Core/DAO/AllCoreTables.php
@@ -45,8 +45,8 @@ class CRM_Core_DAO_AllCoreTables {
         $entityType['name'],
         $entityType['class'],
         $entityType['table'],
-        isset($entityType['fields_callback']) ? $entityType['fields_callback'] : NULL,
-        isset($entityType['links_callback']) ? $entityType['links_callback'] : NULL
+        $entityType['fields_callback'] ?? NULL,
+        $entityType['links_callback'] ?? NULL
       );
     }
 
@@ -254,6 +254,17 @@ class CRM_Core_DAO_AllCoreTables {
       self::tables());
   }
 
+  /**
+   * Convert the entity name into a table name.
+   *
+   * @param string $entityBriefName
+   *
+   * @return FALSE|string
+   */
+  public static function getTableForEntityName($entityBriefName) {
+    return self::getTableForClass(self::getFullName($entityBriefName));
+  }
+
   /**
    * Reinitialise cache.
    *
diff --git a/civicrm/CRM/Core/DAO/County.php b/civicrm/CRM/Core/DAO/County.php
index 7c183f5de0..4a1524d510 100644
--- a/civicrm/CRM/Core/DAO/County.php
+++ b/civicrm/CRM/Core/DAO/County.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/County.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9af9ee85c4e413dda6398cc51e9e4f82)
+ * (GenCodeChecksum:c22121afe6539d3ec7c51e905de299d7)
  */
 
 /**
@@ -141,6 +141,11 @@ class CRM_Core_DAO_County extends CRM_Core_DAO {
           'bao' => 'CRM_Core_DAO_County',
           'localizable' => 0,
           'FKClassName' => 'CRM_Core_DAO_StateProvince',
+          'pseudoconstant' => [
+            'table' => 'civicrm_state_province',
+            'keyColumn' => 'id',
+            'labelColumn' => 'name',
+          ],
         ],
       ];
       CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
diff --git a/civicrm/CRM/Core/DAO/Dashboard.php b/civicrm/CRM/Core/DAO/Dashboard.php
index 13fbdbf5d1..65facfb0fc 100644
--- a/civicrm/CRM/Core/DAO/Dashboard.php
+++ b/civicrm/CRM/Core/DAO/Dashboard.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Dashboard.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6b9dee0261c55c757550983c4fbd9aea)
+ * (GenCodeChecksum:06a6051f8aa495ae244afaa0e75aa7e0)
  */
 
 /**
@@ -214,6 +214,7 @@ class CRM_Core_DAO_Dashboard extends CRM_Core_DAO {
           'entity' => 'Dashboard',
           'bao' => 'CRM_Core_BAO_Dashboard',
           'localizable' => 0,
+          'serialize' => self::SERIALIZE_COMMA,
         ],
         'permission_operator' => [
           'name' => 'permission_operator',
diff --git a/civicrm/CRM/Core/DAO/Discount.php b/civicrm/CRM/Core/DAO/Discount.php
index 416cfc9903..26a7419da2 100644
--- a/civicrm/CRM/Core/DAO/Discount.php
+++ b/civicrm/CRM/Core/DAO/Discount.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Discount.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:65e21ec2893577e8026e3194864cdad3)
+ * (GenCodeChecksum:856b526f1fe395e4460ebf886a258d4f)
  */
 
 /**
@@ -152,6 +152,11 @@ class CRM_Core_DAO_Discount extends CRM_Core_DAO {
           'bao' => 'CRM_Core_BAO_Discount',
           'localizable' => 0,
           'FKClassName' => 'CRM_Price_DAO_PriceSet',
+          'pseudoconstant' => [
+            'table' => 'civicrm_price_set',
+            'keyColumn' => 'id',
+            'labelColumn' => 'title',
+          ],
         ],
         'start_date' => [
           'name' => 'start_date',
diff --git a/civicrm/CRM/Core/DAO/Factory.php b/civicrm/CRM/Core/DAO/Factory.php
index 519f4c4341..66dd5a9d74 100644
--- a/civicrm/CRM/Core/DAO/Factory.php
+++ b/civicrm/CRM/Core/DAO/Factory.php
@@ -27,7 +27,7 @@ class CRM_Core_DAO_Factory {
    * @throws Exception
    */
   public static function create($className) {
-    $type = CRM_Utils_Array::value($className, self::$_classes);
+    $type = self::$_classes[$className] ?? NULL;
     if (!$type) {
       CRM_Core_Error::fatal("class $className not found");
     }
diff --git a/civicrm/CRM/Core/DAO/OpenID.php b/civicrm/CRM/Core/DAO/OpenID.php
index 56fc736a9c..fcce8503fb 100644
--- a/civicrm/CRM/Core/DAO/OpenID.php
+++ b/civicrm/CRM/Core/DAO/OpenID.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/OpenID.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4baa608e9caa3e118ac02d28032b8bc2)
+ * (GenCodeChecksum:2afae5cc76cd5df22b314276138fc122)
  */
 
 /**
@@ -135,6 +135,11 @@ class CRM_Core_DAO_OpenID extends CRM_Core_DAO {
           'entity' => 'OpenID',
           'bao' => 'CRM_Core_BAO_OpenID',
           'localizable' => 0,
+          'pseudoconstant' => [
+            'table' => 'civicrm_location_type',
+            'keyColumn' => 'id',
+            'labelColumn' => 'display_name',
+          ],
         ],
         'openid' => [
           'name' => 'openid',
diff --git a/civicrm/CRM/Core/DAO/PrintLabel.php b/civicrm/CRM/Core/DAO/PrintLabel.php
index a131268c36..45737762f2 100644
--- a/civicrm/CRM/Core/DAO/PrintLabel.php
+++ b/civicrm/CRM/Core/DAO/PrintLabel.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/PrintLabel.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2fb53845aa61d793ae0981a2481bbb79)
+ * (GenCodeChecksum:b8dffa0c7640137bb8dede0fd7c67cff)
  */
 
 /**
@@ -34,7 +34,7 @@ class CRM_Core_DAO_PrintLabel extends CRM_Core_DAO {
   public $id;
 
   /**
-   * User title for for this label layout
+   * User title for this label layout
    *
    * @var string
    */
@@ -149,7 +149,7 @@ class CRM_Core_DAO_PrintLabel extends CRM_Core_DAO {
           'name' => 'title',
           'type' => CRM_Utils_Type::T_STRING,
           'title' => ts('Title'),
-          'description' => ts('User title for for this label layout'),
+          'description' => ts('User title for this label layout'),
           'maxlength' => 255,
           'size' => CRM_Utils_Type::HUGE,
           'where' => 'civicrm_print_label.title',
diff --git a/civicrm/CRM/Core/DAO/Tag.php b/civicrm/CRM/Core/DAO/Tag.php
index f1578b2624..397ebf2a4a 100644
--- a/civicrm/CRM/Core/DAO/Tag.php
+++ b/civicrm/CRM/Core/DAO/Tag.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Tag.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7267e5b21f5bc822a58ffffc23b6dec1)
+ * (GenCodeChecksum:18f8021635fed59be1eabc246f6b88cb)
  */
 
 /**
@@ -182,6 +182,11 @@ class CRM_Core_DAO_Tag extends CRM_Core_DAO {
           'bao' => 'CRM_Core_BAO_Tag',
           'localizable' => 0,
           'FKClassName' => 'CRM_Core_DAO_Tag',
+          'pseudoconstant' => [
+            'table' => 'civicrm_tag',
+            'keyColumn' => 'id',
+            'labelColumn' => 'name',
+          ],
         ],
         'is_selectable' => [
           'name' => 'is_selectable',
diff --git a/civicrm/CRM/Core/DAO/permissions.php b/civicrm/CRM/Core/DAO/permissions.php
index 56c4938811..45fe4f8c09 100644
--- a/civicrm/CRM/Core/DAO/permissions.php
+++ b/civicrm/CRM/Core/DAO/permissions.php
@@ -44,5 +44,5 @@ function _civicrm_api3_permissions($entity, $action, &$params) {
   // Translate specific actions into their generic equivalents
   $action = CRM_Core_Permission::getGenericAction($action);
 
-  return isset($perm[$action]) ? $perm[$action] : $perm['default'];
+  return $perm[$action] ?? $perm['default'];
 }
diff --git a/civicrm/CRM/Core/Error.php b/civicrm/CRM/Core/Error.php
index 1f0b4d40db..a36bb5ce7d 100644
--- a/civicrm/CRM/Core/Error.php
+++ b/civicrm/CRM/Core/Error.php
@@ -570,7 +570,7 @@ class CRM_Core_Error extends PEAR_ErrorStack {
     if (!empty(\Civi::$statics[__CLASS__]['userFrameworkLogging'])) {
       // should call $config->userSystem->logger($message) here - but I got a situation where userSystem was not an object - not sure why
       if ($config->userSystem->is_drupal and function_exists('watchdog')) {
-        watchdog('civicrm', '%message', ['%message' => $message], isset($priority) ? $priority : WATCHDOG_DEBUG);
+        watchdog('civicrm', '%message', ['%message' => $message], $priority ?? WATCHDOG_DEBUG);
       }
     }
 
@@ -726,11 +726,11 @@ class CRM_Core_Error extends PEAR_ErrorStack {
     $ret = [];
     foreach ($backTrace as $trace) {
       $args = [];
-      $fnName = CRM_Utils_Array::value('function', $trace);
+      $fnName = $trace['function'] ?? NULL;
       $className = isset($trace['class']) ? ($trace['class'] . $trace['type']) : '';
 
       // Do not show args for a few password related functions
-      $skipArgs = ($className == 'DB::' && $fnName == 'connect') ? TRUE : FALSE;
+      $skipArgs = $className == 'DB::' && $fnName == 'connect';
 
       if (!empty($trace['args'])) {
         foreach ($trace['args'] as $arg) {
@@ -1005,8 +1005,8 @@ class CRM_Core_Error extends PEAR_ErrorStack {
    */
   public static function deprecatedFunctionWarning($newMethod) {
     $dbt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
-    $callerFunction = isset($dbt[1]['function']) ? $dbt[1]['function'] : NULL;
-    $callerClass = isset($dbt[1]['class']) ? $dbt[1]['class'] : NULL;
+    $callerFunction = $dbt[1]['function'] ?? NULL;
+    $callerClass = $dbt[1]['class'] ?? NULL;
     Civi::log()->warning("Deprecated function $callerClass::$callerFunction, use $newMethod.", ['civi.tag' => 'deprecated']);
   }
 
diff --git a/civicrm/CRM/Core/Form.php b/civicrm/CRM/Core/Form.php
index c8b1d2b8ad..1ab3ccc876 100644
--- a/civicrm/CRM/Core/Form.php
+++ b/civicrm/CRM/Core/Form.php
@@ -413,6 +413,12 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         }
       }
     }
+    $optionContext = NULL;
+    if (!empty($extra['option_context'])) {
+      $optionContext = $extra['option_context'];
+      unset($extra['option_context']);
+    }
+
     $element = $this->addElement($type, $name, $label, $attributes, $extra);
     if (HTML_QuickForm::isError($element)) {
       CRM_Core_Error::fatal(HTML_QuickForm::errorMessage($element));
@@ -435,9 +441,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     }
 
     // Add context for the editing of option groups
-    if (isset($extra['option_context'])) {
-      $context = json_encode($extra['option_context']);
-      $element->setAttribute('data-option-edit-context', $context);
+    if ($optionContext) {
+      $element->setAttribute('data-option-edit-context', json_encode($optionContext));
     }
 
     return $element;
@@ -487,7 +492,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       $this->ajaxResponse['buttonName'] = str_replace('_qf_' . $this->getAttribute('id') . '_', '', $this->controller->getButtonName());
       $this->ajaxResponse['action'] = $this->_action;
       if (isset($this->_id) || isset($this->id)) {
-        $this->ajaxResponse['id'] = isset($this->id) ? $this->id : $this->_id;
+        $this->ajaxResponse['id'] = $this->id ?? $this->_id;
       }
       CRM_Core_Page_AJAX::returnJsonResponse($this->ajaxResponse);
     }
@@ -878,8 +883,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     $this->_paymentProcessorID = NULL;
     if ($this->_paymentProcessors) {
       if (!empty($this->_submitValues)) {
-        $this->_paymentProcessorID = CRM_Utils_Array::value('payment_processor_id', $this->_submitValues);
-        $this->_paymentProcessor = CRM_Utils_Array::value($this->_paymentProcessorID, $this->_paymentProcessors);
+        $this->_paymentProcessorID = $this->_submitValues['payment_processor_id'] ?? NULL;
+        $this->_paymentProcessor = $this->_paymentProcessors[$this->_paymentProcessorID] ?? NULL;
         $this->set('type', $this->_paymentProcessorID);
         $this->set('mode', $this->_mode);
         $this->set('paymentProcessor', $this->_paymentProcessor);
@@ -911,7 +916,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     // minimums with the payment processor minimums. This would lead to fields like 'postal_code'
     // only being on the form if either the admin has configured it as wanted or the processor
     // requires it.
-    $this->assign('billing_profile_id', (CRM_Utils_Array::value('is_billing_required', $this->_values) ? 'billing' : ''));
+    $this->assign('billing_profile_id', (!empty($this->_values['is_billing_required']) ? 'billing' : ''));
   }
 
   /**
@@ -929,7 +934,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
   protected function handlePreApproval(&$params) {
     try {
       $payment = Civi\Payment\System::singleton()->getByProcessor($this->_paymentProcessor);
-      $params['component'] = 'contribute';
+      $params['component'] = $params['component'] ?? 'contribute';
       $result = $payment->doPreApproval($params);
       if (empty($result)) {
         // This could happen, for example, when paypal looks at the button value & decides it is not paypal express.
@@ -1315,6 +1320,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * @param bool $displayTime
    */
   public function addDateRange($name, $from = '_from', $to = '_to', $label = 'From:', $dateFormat = 'searchDate', $required = FALSE, $displayTime = FALSE) {
+    CRM_Core_Error::deprecatedFunctionWarning('Use CRM_Core_Form::addDatePickerRange insted');
     if ($displayTime) {
       $this->addDateTime($name . $from, $label, $required, ['formatType' => $dateFormat]);
       $this->addDateTime($name . $to, ts('To:'), $required, ['formatType' => $dateFormat]);
@@ -1335,14 +1341,24 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * @param bool $required
    * @param string $fromLabel
    * @param string $toLabel
+   * @param array $additionalOptions
+   * @param string $to string to append to the to field.
+   * @param string $from string to append to the from field.
    */
-  public function addDatePickerRange($fieldName, $label, $isDateTime = FALSE, $required = FALSE, $fromLabel = 'From', $toLabel = 'To') {
+  public function addDatePickerRange($fieldName, $label, $isDateTime = FALSE, $required = FALSE, $fromLabel = 'From', $toLabel = 'To', $additionalOptions = [],
+    $to = '_high', $from = '_low') {
 
     $options = [
       '' => ts('- any -'),
       0 => ts('Choose Date Range'),
     ] + CRM_Core_OptionGroup::values('relative_date_filters');
 
+    if ($additionalOptions) {
+      foreach ($additionalOptions as $key => $optionLabel) {
+        $options[$key] = $optionLabel;
+      }
+    }
+
     $this->add('select',
       "{$fieldName}_relative",
       $label,
@@ -1352,8 +1368,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     );
     $attributes = ['format' => 'searchDate'];
     $extra = ['time' => $isDateTime];
-    $this->add('datepicker', $fieldName . '_low', ts($fromLabel), $attributes, $required, $extra);
-    $this->add('datepicker', $fieldName . '_high', ts($toLabel), $attributes, $required, $extra);
+    $this->add('datepicker', $fieldName . $from, ts($fromLabel), $attributes, $required, $extra);
+    $this->add('datepicker', $fieldName . $to, ts($toLabel), $attributes, $required, $extra);
   }
 
   /**
@@ -1442,7 +1458,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     // Handle custom field
     if (strpos($name, 'custom_') === 0 && is_numeric($name[7])) {
       list(, $id) = explode('_', $name);
-      $label = isset($props['label']) ? $props['label'] : CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomField', 'label', $id);
+      $label = $props['label'] ?? CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomField', 'label', $id);
       $gid = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomField', 'option_group_id', $id);
       if (CRM_Utils_Array::value('context', $props) != 'search') {
         $props['data-option-edit-path'] = array_key_exists('option_url', $props) ? $props['option_url'] : 'civicrm/admin/options/' . CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', $gid);
@@ -1460,7 +1476,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
           break;
         }
       }
-      $label = isset($props['label']) ? $props['label'] : $fieldSpec['title'];
+      $label = $props['label'] ?? $fieldSpec['title'];
       if (CRM_Utils_Array::value('context', $props) != 'search') {
         $props['data-option-edit-path'] = array_key_exists('option_url', $props) ? $props['option_url'] : CRM_Core_PseudoConstant::getOptionEditUrl($fieldSpec);
       }
@@ -1525,10 +1541,10 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     // Core field - get metadata.
     $fieldSpec = civicrm_api3($props['entity'], 'getfield', $props);
     $fieldSpec = $fieldSpec['values'];
-    $fieldSpecLabel = isset($fieldSpec['html']['label']) ? $fieldSpec['html']['label'] : CRM_Utils_Array::value('title', $fieldSpec);
+    $fieldSpecLabel = $fieldSpec['html']['label'] ?? CRM_Utils_Array::value('title', $fieldSpec);
     $label = CRM_Utils_Array::value('label', $props, $fieldSpecLabel);
 
-    $widget = isset($props['type']) ? $props['type'] : $fieldSpec['html']['type'];
+    $widget = $props['type'] ?? $fieldSpec['html']['type'];
     if ($widget == 'TextArea' && $context == 'search') {
       $widget = 'Text';
     }
@@ -1547,7 +1563,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         $options = $props['options'];
       }
       else {
-        $options = isset($fieldSpec['options']) ? $fieldSpec['options'] : NULL;
+        $options = $fieldSpec['options'] ?? NULL;
       }
       if ($context == 'search') {
         $widget = $widget == 'Select2' ? $widget : 'Select';
@@ -1579,7 +1595,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       case 'Number':
       case 'Email':
         //TODO: Autodetect ranges
-        $props['size'] = isset($props['size']) ? $props['size'] : 60;
+        $props['size'] = $props['size'] ?? 60;
         return $this->add(strtolower($widget), $name, $label, $props, $required);
 
       case 'hidden':
@@ -1587,8 +1603,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
 
       case 'TextArea':
         //Set default columns and rows for textarea.
-        $props['rows'] = isset($props['rows']) ? $props['rows'] : 4;
-        $props['cols'] = isset($props['cols']) ? $props['cols'] : 60;
+        $props['rows'] = $props['rows'] ?? 4;
+        $props['cols'] = $props['cols'] ?? 60;
         if (empty($props['maxlength']) && isset($fieldSpec['length'])) {
           $props['maxlength'] = $fieldSpec['length'];
         }
@@ -1610,7 +1626,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         }
 
       case 'Radio':
-        $separator = isset($props['separator']) ? $props['separator'] : NULL;
+        $separator = $props['separator'] ?? NULL;
         unset($props['separator']);
         if (!isset($props['allowClear'])) {
           $props['allowClear'] = !$required;
@@ -1645,13 +1661,13 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
           $this->addYesNo($name, $label, TRUE, FALSE, $props);
           return;
         }
-        $text = isset($props['text']) ? $props['text'] : NULL;
+        $text = $props['text'] ?? NULL;
         unset($props['text']);
         return $this->addElement('checkbox', $name, $label, $text, $props);
 
       //add support for 'Advcheckbox' field
       case 'advcheckbox':
-        $text = isset($props['text']) ? $props['text'] : NULL;
+        $text = $props['text'] ?? NULL;
         unset($props['text']);
         return $this->addElement('advcheckbox', $name, $label, $text, $props);
 
@@ -1671,7 +1687,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         return $this->addEntityRef($name, $label, $props, $required);
 
       case 'Password':
-        $props['size'] = isset($props['size']) ? $props['size'] : 60;
+        $props['size'] = $props['size'] ?? 60;
         return $this->add('password', $name, $label, $props, $required);
 
       // Check datatypes of fields
@@ -1771,7 +1787,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * @return null
    */
   public function getVar($name) {
-    return isset($this->$name) ? $this->$name : NULL;
+    return $this->$name ?? NULL;
   }
 
   /**
@@ -2522,7 +2538,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * @return string
    */
   public function getCurrency($submittedValues = []) {
-    $currency = CRM_Utils_Array::value('currency', $this->_values);
+    $currency = $this->_values['currency'] ?? NULL;
     // For event forms, currency is in a different spot
     if (empty($currency)) {
       $currency = CRM_Utils_Array::value('currency', CRM_Utils_Array::value('event', $this->_values));
diff --git a/civicrm/CRM/Core/Form/RecurringEntity.php b/civicrm/CRM/Core/Form/RecurringEntity.php
index e8796ba916..37532c8749 100644
--- a/civicrm/CRM/Core/Form/RecurringEntity.php
+++ b/civicrm/CRM/Core/Form/RecurringEntity.php
@@ -400,8 +400,8 @@ class CRM_Core_Form_RecurringEntity {
         //Delete relations if any from recurring entity tables before inserting new relations for this entity id
         if ($params['entity_id']) {
           //If entity has any pre delete function, consider that first
-          if (CRM_Utils_Array::value('pre_delete_func', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) &&
-            CRM_Utils_Array::value('helper_class', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']])
+          if (!empty(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['pre_delete_func']) &&
+            !empty(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['helper_class'])
           ) {
             $preDeleteResult = call_user_func_array(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['pre_delete_func'], [$params['entity_id']]);
             if (!empty($preDeleteResult)) {
@@ -409,8 +409,8 @@ class CRM_Core_Form_RecurringEntity {
             }
           }
           //Ready to execute delete on entities if it has delete function set
-          if (CRM_Utils_Array::value('delete_func', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]) &&
-            CRM_Utils_Array::value('helper_class', CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']])
+          if (!empty(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['delete_func']) &&
+            !empty(CRM_Core_BAO_RecurringEntity::$_recurringEntityHelper[$params['entity_table']]['helper_class'])
           ) {
             //Check if pre delete function has some ids to be deleted
             if (!empty(CRM_Core_BAO_RecurringEntity::$_entitiesToBeDeleted)) {
diff --git a/civicrm/CRM/Core/Form/Renderer.php b/civicrm/CRM/Core/Form/Renderer.php
index c6161b0fad..8a4f16c02e 100644
--- a/civicrm/CRM/Core/Form/Renderer.php
+++ b/civicrm/CRM/Core/Form/Renderer.php
@@ -172,7 +172,7 @@ class CRM_Core_Form_Renderer extends HTML_QuickForm_Renderer_ArraySmarty {
       if ($type == 'text' || $type == 'password') {
         $size = $element->getAttribute('size');
         if (!empty($size)) {
-          $class = CRM_Utils_Array::value($size, self::$_sizeMapper);
+          $class = self::$_sizeMapper[$size] ?? NULL;
         }
       }
     }
diff --git a/civicrm/CRM/Core/Form/ShortCode.php b/civicrm/CRM/Core/Form/ShortCode.php
index 5f8129296a..3a2b084b5f 100644
--- a/civicrm/CRM/Core/Form/ShortCode.php
+++ b/civicrm/CRM/Core/Form/ShortCode.php
@@ -82,6 +82,14 @@ class CRM_Core_Form_ShortCode extends CRM_Core_Form {
           'select' => ['minimumInputLength' => 0],
         ],
       ];
+      $this->components['pcp'] = [
+        'label' => ts("Personal Campaign Page"),
+        'select' => [
+          'key' => 'id',
+          'entity' => 'Pcp',
+          'select' => ['minimumInputLength' => 0],
+        ],
+      ];
     }
 
     if (in_array('CiviEvent', $config->enableComponents)) {
@@ -122,7 +130,7 @@ class CRM_Core_Form_ShortCode extends CRM_Core_Form {
       ],
       [
         'key' => 'mode',
-        'components' => ['contribution', 'event'],
+        'components' => ['contribution', 'pcp', 'event'],
         'options' => [
           'live' => ts('Live Mode'),
           'test' => ts('Test Drive'),
diff --git a/civicrm/CRM/Core/Form/Task/Batch.php b/civicrm/CRM/Core/Form/Task/Batch.php
index 655622639e..9e65231ceb 100644
--- a/civicrm/CRM/Core/Form/Task/Batch.php
+++ b/civicrm/CRM/Core/Form/Task/Batch.php
@@ -134,7 +134,7 @@ class CRM_Core_Form_Task_Batch extends CRM_Core_Form_Task {
       $typeId = CRM_Core_DAO::getFieldValue('CRM_' . ucfirst($this::$entityShortname) . '_DAO_' . ucfirst($this::$entityShortname), $entityId, $this::$entityShortname . '_type_id');
       foreach ($this->_fields as $name => $field) {
         if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($name)) {
-          $customValue = CRM_Utils_Array::value($customFieldID, $customFields);
+          $customValue = $customFields[$customFieldID] ?? NULL;
           $entityColumnValue = [];
           if (!empty($customValue['extends_entity_column_value'])) {
             $entityColumnValue = explode(CRM_Core_DAO::VALUE_SEPARATOR,
diff --git a/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php b/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php
index 0ec70a5b1b..14e19c7a8c 100644
--- a/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php
+++ b/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php
@@ -225,7 +225,7 @@ class CRM_Core_Form_Task_PDFLetterCommon {
    * @return string $html_message
    */
   public static function processTemplate(&$formValues) {
-    $html_message = CRM_Utils_Array::value('html_message', $formValues);
+    $html_message = $formValues['html_message'] ?? NULL;
 
     // process message template
     if (!empty($formValues['saveTemplate']) || !empty($formValues['updateTemplate'])) {
diff --git a/civicrm/CRM/Core/Invoke.php b/civicrm/CRM/Core/Invoke.php
index 2cd7117fa8..52c2fdf551 100644
--- a/civicrm/CRM/Core/Invoke.php
+++ b/civicrm/CRM/Core/Invoke.php
@@ -281,7 +281,7 @@ class CRM_Core_Invoke {
         $result = $wrapper->run(
           CRM_Utils_Array::value('page_callback', $item),
           CRM_Utils_Array::value('title', $item),
-          isset($pageArgs) ? $pageArgs : NULL
+          $pageArgs ?? NULL
         );
       }
       else {
@@ -291,7 +291,7 @@ class CRM_Core_Invoke {
           $mode = $pageArgs['mode'];
           unset($pageArgs['mode']);
         }
-        $title = CRM_Utils_Array::value('title', $item);
+        $title = $item['title'] ?? NULL;
         if (strstr($item['page_callback'], '_Page') || strstr($item['page_callback'], '\\Page\\')) {
           $object = new $item['page_callback']($title, $mode);
           $object->urlPath = explode('/', $_GET[$config->userFrameworkURLVar]);
diff --git a/civicrm/CRM/Core/Key.php b/civicrm/CRM/Core/Key.php
index 382c65f86e..83317ac149 100644
--- a/civicrm/CRM/Core/Key.php
+++ b/civicrm/CRM/Core/Key.php
@@ -135,7 +135,7 @@ class CRM_Core_Key {
     }
 
     // ensure that hash is a 32 digit hex number
-    return preg_match('#[0-9a-f]{32}#i', $hash) ? TRUE : FALSE;
+    return (bool) preg_match('#[0-9a-f]{32}#i', $hash);
   }
 
 }
diff --git a/civicrm/CRM/Core/ManagedEntities.php b/civicrm/CRM/Core/ManagedEntities.php
index cf47fa6918..22d9f12f82 100644
--- a/civicrm/CRM/Core/ManagedEntities.php
+++ b/civicrm/CRM/Core/ManagedEntities.php
@@ -246,12 +246,12 @@ class CRM_Core_ManagedEntities {
     $dao->name = $todo['name'];
     $dao->entity_type = $todo['entity'];
     $dao->entity_id = $result['id'];
-    $dao->cleanup = CRM_Utils_Array::value('cleanup', $todo);
+    $dao->cleanup = $todo['cleanup'] ?? NULL;
     $dao->save();
   }
 
   /**
-   * Update an entity which (a) is believed to exist and which (b) ought to be active.
+   * Update an entity which is believed to exist.
    *
    * @param CRM_Core_DAO_Managed $dao
    * @param array $todo
@@ -262,12 +262,26 @@ class CRM_Core_ManagedEntities {
     $doUpdate = ($policy == 'always');
 
     if ($doUpdate) {
-      $defaults = [
-        'id' => $dao->entity_id,
-      // FIXME: test whether is_active is valid
-        'is_active' => 1,
-      ];
+      $defaults = ['id' => $dao->entity_id, 'is_active' => 1];
       $params = array_merge($defaults, $todo['params']);
+
+      $manager = CRM_Extension_System::singleton()->getManager();
+      if ($dao->entity_type === 'Job' && !$manager->extensionIsBeingInstalledOrEnabled($dao->module)) {
+        // Special treatment for scheduled jobs:
+        //
+        // If we're being called as part of enabling/installing a module then
+        // we want the default behaviour of setting is_active = 1.
+        //
+        // However, if we're just being called by a normal cache flush then we
+        // should not re-enable a job that an administrator has decided to disable.
+        //
+        // Without this logic there was a problem: site admin might disable
+        // a job, but then when there was a flush op, the job was re-enabled
+        // which can cause significant embarrassment, depending on the job
+        // ("Don't worry, sending mailings is disabled right now...").
+        unset($params['is_active']);
+      }
+
       $result = civicrm_api($dao->entity_type, 'create', $params);
       if ($result['is_error']) {
         $this->onApiError($dao->entity_type, 'create', $params, $result);
diff --git a/civicrm/CRM/Core/Menu.php b/civicrm/CRM/Core/Menu.php
index f370b8cacb..5ec868771e 100644
--- a/civicrm/CRM/Core/Menu.php
+++ b/civicrm/CRM/Core/Menu.php
@@ -216,7 +216,7 @@ class CRM_Core_Menu {
     );
     $fieldsPresent = array();
     foreach ($fieldsToPropagate as $field) {
-      $fieldsPresent[$field] = CRM_Utils_Array::value($field, $menu[$path]) !== NULL ? TRUE : FALSE;
+      $fieldsPresent[$field] = isset($menu[$path][$field]);
     }
 
     $args = explode('/', $path);
@@ -227,9 +227,10 @@ class CRM_Core_Menu {
 
       foreach ($fieldsToPropagate as $field) {
         if (!$fieldsPresent[$field]) {
-          if (CRM_Utils_Array::value($field, CRM_Utils_Array::value($parentPath, $menu)) !== NULL) {
+          $fieldInParentMenu = $menu[$parentPath][$field] ?? NULL;
+          if ($fieldInParentMenu !== NULL) {
             $fieldsPresent[$field] = TRUE;
-            $menu[$path][$field] = $menu[$parentPath][$field];
+            $menu[$path][$field] = $fieldInParentMenu;
           }
         }
       }
@@ -349,7 +350,7 @@ class CRM_Core_Menu {
 
       $value = array(
         'title' => $item['title'],
-        'desc' => CRM_Utils_Array::value('desc', $item),
+        'desc' => $item['desc'] ?? NULL,
         'id' => strtr($item['title'], array(
           '(' => '_',
           ')' => '',
@@ -365,14 +366,13 @@ class CRM_Core_Menu {
           // forceBackend; CRM-14439 work-around; acceptable for now because we don't display breadcrumbs on frontend
           TRUE
         ),
-        'icon' => CRM_Utils_Array::value('icon', $item),
-        'extra' => CRM_Utils_Array::value('extra', $item),
+        'icon' => $item['icon'] ?? NULL,
+        'extra' => $item['extra'] ?? NULL,
       );
       if (!array_key_exists($item['adminGroup'], $values)) {
         $values[$item['adminGroup']] = array();
         $values[$item['adminGroup']]['fields'] = array();
       }
-      $weight = CRM_Utils_Array::value('weight', $item, 0);
       $values[$item['adminGroup']]['fields']["{weight}.{$item['title']}"] = $value;
       $values[$item['adminGroup']]['component_id'] = $item['component_id'];
     }
@@ -501,6 +501,8 @@ class CRM_Core_Menu {
   /**
    * @param $menu
    * @param $path
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function fillComponentIds(&$menu, $path) {
     static $cache = array();
@@ -524,7 +526,7 @@ class CRM_Core_Menu {
       $menu[$path]['component_id'] = $cache[$compPath];
     }
     else {
-      if (CRM_Utils_Array::value('component', CRM_Utils_Array::value($compPath, $menu))) {
+      if (!empty($menu[$compPath]['component'])) {
         $componentId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Component',
           $menu[$compPath]['component'],
           'id', 'name'
diff --git a/civicrm/CRM/Core/OptionGroup.php b/civicrm/CRM/Core/OptionGroup.php
index 97af275ded..2540c15471 100644
--- a/civicrm/CRM/Core/OptionGroup.php
+++ b/civicrm/CRM/Core/OptionGroup.php
@@ -478,11 +478,11 @@ WHERE  v.option_group_id = g.id
         $value->option_group_id = $group->id;
         $value->label = $v['label'];
         $value->value = $v['value'];
-        $value->name = CRM_Utils_Array::value('name', $v);
-        $value->description = CRM_Utils_Array::value('description', $v);
-        $value->weight = CRM_Utils_Array::value('weight', $v);
-        $value->is_default = CRM_Utils_Array::value('is_default', $v);
-        $value->is_active = CRM_Utils_Array::value('is_active', $v);
+        $value->name = $v['name'] ?? NULL;
+        $value->description = $v['description'] ?? NULL;
+        $value->weight = $v['weight'] ?? NULL;
+        $value->is_default = $v['is_default'] ?? NULL;
+        $value->is_active = $v['is_active'] ?? NULL;
         $value->save();
 
         if ($value->is_default) {
diff --git a/civicrm/CRM/Core/OptionValue.php b/civicrm/CRM/Core/OptionValue.php
index a241619dd5..27581b35cb 100644
--- a/civicrm/CRM/Core/OptionValue.php
+++ b/civicrm/CRM/Core/OptionValue.php
@@ -70,7 +70,7 @@ class CRM_Core_OptionValue {
       $optionGroupID = $groupParams['id'];
     }
 
-    $groupName = CRM_Utils_Array::value('name', $groupParams);
+    $groupName = $groupParams['name'] ?? NULL;
     if (!$groupName && $optionGroupID) {
       $groupName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup',
         $optionGroupID, 'name', 'id'
@@ -261,7 +261,7 @@ class CRM_Core_OptionValue {
     }
 
     if ($object->find(TRUE)) {
-      return ($daoID && $object->id == $daoID) ? TRUE : FALSE;
+      return $daoID && $object->id == $daoID;
     }
     else {
       return TRUE;
@@ -418,8 +418,8 @@ FROM
 
     $order = " ORDER BY " . $orderBy;
 
-    $groupId = CRM_Utils_Array::value('id', $groupParams);
-    $groupName = CRM_Utils_Array::value('name', $groupParams);
+    $groupId = $groupParams['id'] ?? NULL;
+    $groupName = $groupParams['name'] ?? NULL;
 
     if ($groupId) {
       $where .= " AND option_group.id = %1";
diff --git a/civicrm/CRM/Core/Page.php b/civicrm/CRM/Core/Page.php
index 1f6dd6e01a..251c642d75 100644
--- a/civicrm/CRM/Core/Page.php
+++ b/civicrm/CRM/Core/Page.php
@@ -383,7 +383,7 @@ class CRM_Core_Page {
    * @return null
    */
   public function getVar($name) {
-    return isset($this->$name) ? $this->$name : NULL;
+    return $this->$name ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Core/Page/AJAX/Location.php b/civicrm/CRM/Core/Page/AJAX/Location.php
index 60a11fdd67..2e1988c61b 100644
--- a/civicrm/CRM/Core/Page/AJAX/Location.php
+++ b/civicrm/CRM/Core/Page/AJAX/Location.php
@@ -145,7 +145,7 @@ class CRM_Core_Page_AJAX_Location {
     if (!empty($defaults)) {
       foreach ($profileFields as $key => $val) {
         if (array_key_exists($key, $defaults)) {
-          $htmlType = CRM_Utils_Array::value('html_type', $val);
+          $htmlType = $val['html_type'] ?? NULL;
           if ($htmlType == 'Radio') {
             $elements["onbehalf_{$key}"]['type'] = $htmlType;
             $elements["onbehalf_{$key}"]['value'] = $defaults[$key];
@@ -226,7 +226,7 @@ class CRM_Core_Page_AJAX_Location {
           $element = 'name';
         }
         $fld = "address[1][{$element}]";
-        $value = CRM_Utils_Array::value($element, $location['address'][1]);
+        $value = $location['address'][1][$element] ?? NULL;
         $value = $value ? $value : "";
         $result[str_replace([
           '][',
@@ -244,7 +244,7 @@ class CRM_Core_Page_AJAX_Location {
       $block = ($element == 'phone_type_id') ? 'phone' : $element;
       for ($i = 1; $i < 3; $i++) {
         $fld = "{$block}[{$i}][{$element}]";
-        $value = CRM_Utils_Array::value($element, $location[$block][$i]);
+        $value = $location[$block][$i][$element] ?? NULL;
         $value = $value ? $value : "";
         $result[str_replace([
           '][',
diff --git a/civicrm/CRM/Core/Page/File.php b/civicrm/CRM/Core/Page/File.php
index a36d8975ee..0ad98467e8 100644
--- a/civicrm/CRM/Core/Page/File.php
+++ b/civicrm/CRM/Core/Page/File.php
@@ -124,7 +124,7 @@ class CRM_Core_Page_File extends CRM_Core_Page {
       'image/pjpeg' => 'image/jpeg',
 
     ];
-    return isset($badTypes[$type]) ? $badTypes[$type] : $type;
+    return $badTypes[$type] ?? $type;
   }
 
 }
diff --git a/civicrm/CRM/Core/Page/RecurringEntityPreview.php b/civicrm/CRM/Core/Page/RecurringEntityPreview.php
index 667af5e491..41fad39a4d 100644
--- a/civicrm/CRM/Core/Page/RecurringEntityPreview.php
+++ b/civicrm/CRM/Core/Page/RecurringEntityPreview.php
@@ -28,14 +28,14 @@ class CRM_Core_Page_RecurringEntityPreview extends CRM_Core_Page {
       $endDateColumnName = CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']]['intervalDateColumns'][0];
 
       $recursion = new CRM_Core_BAO_RecurringEntity();
-      if (CRM_Utils_Array::value('dateColumns', CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']])) {
+      if (!empty(CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']]['dateColumns'])) {
         $recursion->dateColumns = CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']]['dateColumns'];
       }
       $recursion->scheduleFormValues = $formValues;
       if (!empty($formValues['exclude_date_list'])) {
         $recursion->excludeDates = explode(',', $formValues['exclude_date_list']);
       }
-      if (CRM_Utils_Array::value('excludeDateRangeColumns', CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']])) {
+      if (!empty(CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']]['excludeDateRangeColumns'])) {
         $recursion->excludeDateRangeColumns = CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']]['excludeDateRangeColumns'];
       }
 
@@ -52,7 +52,7 @@ class CRM_Core_Page_RecurringEntityPreview extends CRM_Core_Page {
       }
 
       //Check if there is any enddate column defined to find out the interval between the two range
-      if (CRM_Utils_Array::value('intervalDateColumns', CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']])) {
+      if (!empty(CRM_Core_BAO_RecurringEntity::$_dateColumns[$formValues['entity_table']]['intervalDateColumns'])) {
         if ($endDate) {
           $interval = $recursion->getInterval($startDate, $endDate);
           $recursion->intervalDateColumns = [$endDateColumnName => $interval];
diff --git a/civicrm/CRM/Core/Payment.php b/civicrm/CRM/Core/Payment.php
index 1ac470d157..2361c1a36d 100644
--- a/civicrm/CRM/Core/Payment.php
+++ b/civicrm/CRM/Core/Payment.php
@@ -354,7 +354,7 @@ abstract class CRM_Core_Payment {
    * @return bool
    */
   protected function supportsLiveMode() {
-    return empty($this->_paymentProcessor['is_test']) ? TRUE : FALSE;
+    return empty($this->_paymentProcessor['is_test']);
   }
 
   /**
@@ -363,7 +363,7 @@ abstract class CRM_Core_Payment {
    * @return bool
    */
   protected function supportsTestMode() {
-    return empty($this->_paymentProcessor['is_test']) ? FALSE : TRUE;
+    return !empty($this->_paymentProcessor['is_test']);
   }
 
   /**
@@ -551,6 +551,9 @@ abstract class CRM_Core_Payment {
    *   Only explicitly supported contexts are handled without error.
    *   Currently supported:
    *   - contributionPageRecurringHelp (params: is_recur_installments, is_email_receipt)
+   *   - contributionPageContinueText (params: amount, is_payment_to_existing)
+   *   - cancelRecurDetailText (params: mode, amount, currency, frequency_interval, frequency_unit, installments, {membershipType|only if mode=auto_renew})
+   *   - cancelRecurNotSupportedText
    *
    * @param array $params
    *   Parameters for the field, context specific.
@@ -590,11 +593,44 @@ abstract class CRM_Core_Payment {
         }
         return ts('To complete your contribution, click the <strong>Continue</strong> button below.');
 
+      case 'cancelRecurDetailText':
+        if ($params['mode'] === 'auto_renew') {
+          return ts('Click the button below if you want to cancel the auto-renewal option for your %1 membership. This will not cancel your membership. However you will need to arrange payment for renewal when your membership expires.',
+            [1 => $params['membershipType']]
+          );
+        }
+        else {
+          $text = ts('Recurring Contribution Details: %1 every %2 %3', [
+            1 => CRM_Utils_Money::format($params['amount'], $params['currency']),
+            2 => $params['frequency_interval'],
+            3 => $params['frequency_unit'],
+          ]);
+          if (!empty($params['installments'])) {
+            $text .= ' ' . ts('for %1 installments', [1 => $params['installments']]) . '.';
+          }
+          $text = "<strong>{$text}</strong><div class='content'>";
+          $text .= ts('Click the button below to cancel this commitment and stop future transactions. This does not affect contributions which have already been completed.');
+          $text .= '</div>';
+          return $text;
+        }
+
+      case 'cancelRecurNotSupportedText':
+        return ts('Automatic cancellation is not supported for this payment processor. You or the contributor will need to manually cancel this recurring contribution using the payment processor website.');
+
     }
     CRM_Core_Error::deprecatedFunctionWarning('Calls to getText must use a supported method');
     return '';
   }
 
+  /**
+   * Get the title of the payment processor to display to the user
+   *
+   * @return string
+   */
+  public function getTitle() {
+    return $this->getPaymentProcessor()['title'] ?? $this->getPaymentProcessor()['name'];
+  }
+
   /**
    * Getter for accessing member vars.
    *
@@ -605,7 +641,7 @@ abstract class CRM_Core_Payment {
    * @return null
    */
   public function getVar($name) {
-    return isset($this->$name) ? $this->$name : NULL;
+    return $this->$name ?? NULL;
   }
 
   /**
@@ -1328,6 +1364,34 @@ abstract class CRM_Core_Payment {
     return $result;
   }
 
+  /**
+   * Cancel a recurring subscription.
+   *
+   * Payment processor classes should override this rather than implementing cancelSubscription.
+   *
+   * A PaymentProcessorException should be thrown if the update of the contribution_recur
+   * record should not proceed (in many cases this function does nothing
+   * as the payment processor does not need to take any action & this should silently
+   * proceed. Note the form layer will only call this after calling
+   * $processor->supports('cancelRecurring');
+   *
+   * @param \Civi\Payment\PropertyBag $propertyBag
+   *
+   * @return array
+   *
+   * @throws \Civi\Payment\Exception\PaymentProcessorException
+   */
+  public function doCancelRecurring(PropertyBag $propertyBag) {
+    if (method_exists($this, 'cancelSubscription')) {
+      $message = NULL;
+      if ($this->cancelSubscription($message, $propertyBag)) {
+        return ['message' => $message];
+      }
+      throw new PaymentProcessorException($message);
+    }
+    return ['message' => ts('Recurring contribution cancelled')];
+  }
+
   /**
    * Refunds payment
    *
@@ -1661,7 +1725,7 @@ INNER JOIN civicrm_contribution con ON ( con.contribution_recur_id = rec.id )
     }
 
     // Else default
-    return isset($this->_paymentProcessor['url_recur']) ? $this->_paymentProcessor['url_recur'] : '';
+    return $this->_paymentProcessor['url_recur'] ?? '';
   }
 
   /**
diff --git a/civicrm/CRM/Core/Payment/BaseIPN.php b/civicrm/CRM/Core/Payment/BaseIPN.php
index 9ebe28db8d..c3b05b6226 100644
--- a/civicrm/CRM/Core/Payment/BaseIPN.php
+++ b/civicrm/CRM/Core/Payment/BaseIPN.php
@@ -175,7 +175,7 @@ class CRM_Core_Payment_BaseIPN {
     else {
       //legacy support - functions are 'used' to be able to pass in a DAO
       $contribution = new CRM_Contribute_BAO_Contribution();
-      $contribution->id = CRM_Utils_Array::value('contribution', $ids);
+      $contribution->id = $ids['contribution'] ?? NULL;
       $contribution->find(TRUE);
       $objects['contribution'] = &$contribution;
     }
@@ -322,7 +322,7 @@ class CRM_Core_Payment_BaseIPN {
     $contribution->receipt_date = CRM_Utils_Date::isoToMysql($contribution->receipt_date);
     $contribution->thankyou_date = CRM_Utils_Date::isoToMysql($contribution->thankyou_date);
     $contribution->cancel_date = self::$_now;
-    $contribution->cancel_reason = CRM_Utils_Array::value('reasonCode', $input);
+    $contribution->cancel_reason = $input['reasonCode'] ?? NULL;
     $contribution->save();
 
     // Add line items for recurring payments.
diff --git a/civicrm/CRM/Core/Payment/Elavon.php b/civicrm/CRM/Core/Payment/Elavon.php
index ad955a0efc..71ca4d5af1 100644
--- a/civicrm/CRM/Core/Payment/Elavon.php
+++ b/civicrm/CRM/Core/Payment/Elavon.php
@@ -133,8 +133,8 @@ class CRM_Core_Payment_Elavon extends CRM_Core_Payment {
 
     // define variables for connecting with the gateway
     $requestFields['ssl_merchant_id'] = $this->_paymentProcessor['user_name'];
-    $requestFields['ssl_user_id'] = CRM_Utils_Array::value('password', $this->_paymentProcessor);
-    $requestFields['ssl_pin'] = CRM_Utils_Array::value('signature', $this->_paymentProcessor);
+    $requestFields['ssl_user_id'] = $this->_paymentProcessor['password'] ?? NULL;
+    $requestFields['ssl_pin'] = $this->_paymentProcessor['signature'] ?? NULL;
     $host = $this->_paymentProcessor['url_site'];
 
     if ($this->_mode == "test") {
diff --git a/civicrm/CRM/Core/Payment/Form.php b/civicrm/CRM/Core/Payment/Form.php
index 1881d38554..1c7263812c 100644
--- a/civicrm/CRM/Core/Payment/Form.php
+++ b/civicrm/CRM/Core/Payment/Form.php
@@ -100,7 +100,7 @@ class CRM_Core_Payment_Form {
   protected static function addCommonFields(&$form, $paymentFields) {
     $requiredPaymentFields = $paymentFieldsMetadata = [];
     foreach ($paymentFields as $name => $field) {
-      $field['extra'] = isset($field['extra']) ? $field['extra'] : NULL;
+      $field['extra'] = $field['extra'] ?? NULL;
       if ($field['htmlType'] == 'chainSelect') {
         $form->addChainSelect($field['name'], ['required' => FALSE]);
       }
@@ -375,7 +375,7 @@ class CRM_Core_Payment_Form {
       return $month;
     }
 
-    return CRM_Utils_Array::value('m', $src['credit_card_exp_date']);
+    return $src['credit_card_exp_date']['m'] ?? NULL;
   }
 
   /**
@@ -388,7 +388,7 @@ class CRM_Core_Payment_Form {
    * @return int
    */
   public static function getCreditCardExpirationYear($src) {
-    return CRM_Utils_Array::value('Y', $src['credit_card_exp_date']);
+    return $src['credit_card_exp_date']['Y'] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Core/Payment/PayPalImpl.php b/civicrm/CRM/Core/Payment/PayPalImpl.php
index 2b971e5156..42fdfa2f80 100644
--- a/civicrm/CRM/Core/Payment/PayPalImpl.php
+++ b/civicrm/CRM/Core/Payment/PayPalImpl.php
@@ -236,7 +236,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $args['paymentAction'] = 'Sale';
     $args['amt'] = $params['amount'];
     $args['currencyCode'] = $params['currencyID'];
-    $args['desc'] = CRM_Utils_Array::value('description', $params);
+    $args['desc'] = $params['description'] ?? NULL;
     $args['invnum'] = $params['invoiceID'];
     $args['returnURL'] = $this->getReturnSuccessUrl($params['qfKey']);
     $args['cancelURL'] = $this->getCancelUrl($params['qfKey'], NULL);
@@ -303,9 +303,9 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
       'token' => 'token',
       'payer_status' => 'payerstatus',
       'payer_id' => 'payerid',
-      'first_name' => 'firstname',
-      'middle_name' => 'middlename',
-      'last_name' => 'lastname',
+      'billing_first_name' => 'firstname',
+      'billing_middle_name' => 'middlename',
+      'billing_last_name' => 'lastname',
       'street_address' => 'shiptostreet',
       'supplemental_address_1' => 'shiptostreet2',
       'city' => 'shiptocity',
@@ -354,7 +354,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $params['trxn_id'] = $result['transactionid'];
     $params['gross_amount'] = $result['amt'];
     $params['fee_amount'] = $result['feeamt'];
-    $params['net_amount'] = CRM_Utils_Array::value('settleamt', $result);
+    $params['net_amount'] = $result['settleamt'] ?? NULL;
     if ($params['net_amount'] == 0 && $params['fee_amount'] != 0) {
       $params['net_amount'] = number_format(($params['gross_amount'] - $params['fee_amount']), 2);
     }
@@ -399,7 +399,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $args['billingfrequency'] = $params['frequency_interval'];
     $args['billingperiod'] = ucwords($params['frequency_unit']);
     $args['desc'] = $params['amount'] . " Per " . $params['frequency_interval'] . " " . $params['frequency_unit'];
-    $args['totalbillingcycles'] = CRM_Utils_Array::value('installments', $params);
+    $args['totalbillingcycles'] = $params['installments'] ?? NULL;
     $args['version'] = '56.0';
     $args['profilereference'] = "i={$params['invoiceID']}" .
       "&m=" .
@@ -440,7 +440,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $args['pwd'] = $this->_paymentProcessor['password'];
     $args['version'] = 3.0;
     $args['signature'] = $this->_paymentProcessor['signature'];
-    $args['subject'] = CRM_Utils_Array::value('subject', $this->_paymentProcessor);
+    $args['subject'] = $this->_paymentProcessor['subject'] ?? NULL;
     $args['method'] = $method;
   }
 
@@ -506,14 +506,14 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $args['cvv2'] = $params['cvv2'];
     $args['firstName'] = $params['first_name'];
     $args['lastName'] = $params['last_name'];
-    $args['email'] = CRM_Utils_Array::value('email', $params);
+    $args['email'] = $params['email'] ?? NULL;
     $args['street'] = $params['street_address'];
     $args['city'] = $params['city'];
     $args['state'] = $params['state_province'];
     $args['countryCode'] = $params['country'];
     $args['zip'] = $params['postal_code'];
     $args['desc'] = substr(CRM_Utils_Array::value('description', $params), 0, 127);
-    $args['custom'] = CRM_Utils_Array::value('accountingCode', $params);
+    $args['custom'] = $params['accountingCode'] ?? NULL;
 
     // add CiviCRM BN code
     $args['BUTTONSOURCE'] = 'CiviCRM_SP';
@@ -533,7 +533,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
         $params['frequency_interval'] . " " .
         $params['frequency_unit'];
       $args['amt'] = $this->getAmount($params);
-      $args['totalbillingcycles'] = CRM_Utils_Array::value('installments', $params);
+      $args['totalbillingcycles'] = $params['installments'] ?? NULL;
       $args['version'] = 56.0;
       $args['PROFILEREFERENCE'] = "" .
         "i=" . $params['invoiceID'] . "&m=" . $component .
@@ -554,8 +554,8 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
 
     /* Success */
 
-    $params['trxn_id'] = CRM_Utils_Array::value('transactionid', $result);
-    $params['gross_amount'] = CRM_Utils_Array::value('amt', $result);
+    $params['trxn_id'] = $result['transactionid'] ?? NULL;
+    $params['gross_amount'] = $result['amt'] ?? NULL;
     $params = array_merge($params, $this->doQuery($params));
     return $params;
   }
@@ -685,9 +685,9 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
       $args = [];
       $this->initialize($args, 'ManageRecurringPaymentsProfileStatus');
 
-      $args['PROFILEID'] = CRM_Utils_Array::value('subscriptionId', $params);
+      $args['PROFILEID'] = $params['subscriptionId'] ?? NULL;
       $args['ACTION'] = 'Cancel';
-      $args['NOTE'] = CRM_Utils_Array::value('reason', $params);
+      $args['NOTE'] = $params['reason'] ?? NULL;
 
       $result = $this->invokeAPI($args);
 
@@ -719,7 +719,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
       throw new CRM_Core_Exception("Could not find a processor with the given processor_id value '{$params['processor_id']}'.");
     }
 
-    $paymentProcessorType = CRM_Utils_Array::value('api.PaymentProcessorType.getvalue', $result['values'][0]);
+    $paymentProcessorType = $result['values'][0]['api.PaymentProcessorType.getvalue'] ?? NULL;
     switch ($paymentProcessorType) {
       case 'PayPal':
         // "PayPal - Website Payments Pro"
@@ -939,7 +939,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
         't3' => ucfirst(substr($params['frequency_unit'], 0, 1)),
         'src' => 1,
         'sra' => 1,
-        'srt' => CRM_Utils_Array::value('installments', $params),
+        'srt' => $params['installments'] ?? NULL,
         'no_note' => 1,
         'modify' => 0,
       ];
@@ -1103,7 +1103,7 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
   protected function mapPaypalParamsToCivicrmParams($fieldMap, $paypalParams) {
     $params = [];
     foreach ($fieldMap as $civicrmField => $paypalField) {
-      $params[$civicrmField] = isset($paypalParams[$paypalField]) ? $paypalParams[$paypalField] : NULL;
+      $params[$civicrmField] = $paypalParams[$paypalField] ?? NULL;
     }
     return $params;
   }
diff --git a/civicrm/CRM/Core/Payment/PayPalProIPN.php b/civicrm/CRM/Core/Payment/PayPalProIPN.php
index 42c23e3087..885fac970f 100644
--- a/civicrm/CRM/Core/Payment/PayPalProIPN.php
+++ b/civicrm/CRM/Core/Payment/PayPalProIPN.php
@@ -76,7 +76,7 @@ class CRM_Core_Payment_PayPalProIPN extends CRM_Core_Payment_BaseIPN {
       throw new CRM_Core_Exception("Failure: Missing Parameter $name");
     }
     else {
-      return CRM_Utils_Array::value($name, $this->_invoiceData);
+      return $this->_invoiceData[$name] ?? NULL;
     }
   }
 
@@ -457,7 +457,10 @@ INNER JOIN civicrm_membership_payment mp ON m.id = mp.membership_id AND mp.contr
       }
     }
 
-    $paymentProcessorID = self::getPayPalPaymentProcessorID();
+    $paymentProcessorID = CRM_Utils_Array::value('processor_id', $this->_inputParameters);
+    if (!$paymentProcessorID) {
+      $paymentProcessorID = self::getPayPalPaymentProcessorID();
+    }
 
     if (!$this->validateData($input, $ids, $objects, TRUE, $paymentProcessorID)) {
       return;
diff --git a/civicrm/CRM/Core/Payment/PaymentExpress.php b/civicrm/CRM/Core/Payment/PaymentExpress.php
index 47db6a690c..2f40ea054f 100644
--- a/civicrm/CRM/Core/Payment/PaymentExpress.php
+++ b/civicrm/CRM/Core/Payment/PaymentExpress.php
@@ -151,7 +151,7 @@ class CRM_Core_Payment_PaymentExpress extends CRM_Core_Payment {
       $privateData .= ",f={$params['participantID']},g={$params['eventID']}";
     }
     elseif ($component == 'contribute') {
-      $membershipID = CRM_Utils_Array::value('membershipID', $params);
+      $membershipID = $params['membershipID'] ?? NULL;
       if ($membershipID) {
         $privateData .= ",e=$membershipID";
       }
diff --git a/civicrm/CRM/Core/Payment/PaymentExpressIPN.php b/civicrm/CRM/Core/Payment/PaymentExpressIPN.php
index 207bc59a9b..ab34ea13f1 100644
--- a/civicrm/CRM/Core/Payment/PaymentExpressIPN.php
+++ b/civicrm/CRM/Core/Payment/PaymentExpressIPN.php
@@ -62,7 +62,7 @@ class CRM_Core_Payment_PaymentExpressIPN extends CRM_Core_Payment_BaseIPN {
    * @return mixed
    */
   public static function retrieve($name, $type, $object, $abort = TRUE) {
-    $value = CRM_Utils_Array::value($name, $object);
+    $value = $object[$name] ?? NULL;
     if ($abort && $value === NULL) {
       CRM_Core_Error::debug_log_message("Could not find an entry for $name");
       echo "Failure: Missing Parameter - " . $name . "<p>";
diff --git a/civicrm/CRM/Core/Payment/Realex.php b/civicrm/CRM/Core/Payment/Realex.php
index 5a4931d214..8100aa9531 100644
--- a/civicrm/CRM/Core/Payment/Realex.php
+++ b/civicrm/CRM/Core/Payment/Realex.php
@@ -276,7 +276,7 @@ class CRM_Core_Payment_Realex extends CRM_Core_Payment {
       if ($data['level'] == $depth) {
         switch ($data['type']) {
           case 'complete':
-            $output[$data['tag']] = isset($data['value']) ? $data['value'] : '';
+            $output[$data['tag']] = $data['value'] ?? '';
             break;
 
           case 'open':
@@ -364,7 +364,7 @@ class CRM_Core_Payment_Realex extends CRM_Core_Payment {
     $this->_setParam('country', $params['country']);
     $this->_setParam('post_code', $params['postal_code']);
     $this->_setParam('order_id', $params['invoiceID']);
-    $params['issue_number'] = (isset($params['issue_number']) ? $params['issue_number'] : '');
+    $params['issue_number'] = ($params['issue_number'] ?? '');
     $this->_setParam('issue_number', $params['issue_number']);
     $this->_setParam('varref', $params['contributionType_name']);
     $comment = $params['description'] . ' (page id:' . $params['contributionPageID'] . ')';
diff --git a/civicrm/CRM/Core/Permission.php b/civicrm/CRM/Core/Permission.php
index d560d734f9..3cce2d04c4 100644
--- a/civicrm/CRM/Core/Permission.php
+++ b/civicrm/CRM/Core/Permission.php
@@ -278,7 +278,7 @@ class CRM_Core_Permission {
     }
 
     $groups = self::ufGroup($type);
-    return !empty($groups) && in_array($gid, $groups) ? TRUE : FALSE;
+    return !empty($groups) && in_array($gid, $groups);
   }
 
   /**
@@ -465,7 +465,7 @@ class CRM_Core_Permission {
         'CiviMail' => 'access CiviMail',
         'CiviAuction' => 'add auction items',
       ];
-      $permissionName = CRM_Utils_Array::value($module, $editPermissions);
+      $permissionName = $editPermissions[$module] ?? NULL;
     }
 
     if ($module == 'CiviCase' && !$permissionName) {
@@ -1627,7 +1627,7 @@ class CRM_Core_Permission {
    * @return bool
    */
   public static function isMultisiteEnabled() {
-    return Civi::settings()->get('is_enabled') ? TRUE : FALSE;
+    return (bool) Civi::settings()->get('is_enabled');
   }
 
   /**
diff --git a/civicrm/CRM/Core/PrevNextCache/Redis.php b/civicrm/CRM/Core/PrevNextCache/Redis.php
index 481a8b1575..5811de0581 100644
--- a/civicrm/CRM/Core/PrevNextCache/Redis.php
+++ b/civicrm/CRM/Core/PrevNextCache/Redis.php
@@ -41,7 +41,7 @@ class CRM_Core_PrevNextCache_Redis implements CRM_Core_PrevNextCache_Interface {
    */
   public function __construct($settings) {
     $this->redis = CRM_Utils_Cache_Redis::connect($settings);
-    $this->prefix = isset($settings['prefix']) ? $settings['prefix'] : '';
+    $this->prefix = $settings['prefix'] ?? '';
     $this->prefix .= \CRM_Utils_Cache::DELIMITER . 'prevnext' . \CRM_Utils_Cache::DELIMITER;
   }
 
diff --git a/civicrm/CRM/Core/PseudoConstant.php b/civicrm/CRM/Core/PseudoConstant.php
index 255594e465..afbb0b5fbb 100644
--- a/civicrm/CRM/Core/PseudoConstant.php
+++ b/civicrm/CRM/Core/PseudoConstant.php
@@ -85,7 +85,7 @@ class CRM_Core_PseudoConstant {
    * RelationshipType
    * @var array
    */
-  private static $relationshipType;
+  private static $relationshipType = [];
 
   /**
    * Civicrm groups that are not smart groups
@@ -185,12 +185,12 @@ class CRM_Core_PseudoConstant {
     // Historically this was 'false' but according to the notes in
     // CRM_Core_DAO::buildOptionsContext it should be context dependent.
     // timidly changing for 'search' only to fix world_region in search options.
-    $localizeDefault = in_array($context, ['search']) ? TRUE : FALSE;
+    $localizeDefault = in_array($context, ['search']);
     // Merge params with defaults
     $params += [
       'grouping' => FALSE,
       'localize' => $localizeDefault,
-      'onlyActive' => ($context == 'validate' || $context == 'get') ? FALSE : TRUE,
+      'onlyActive' => !($context == 'validate' || $context == 'get'),
       'fresh' => FALSE,
       'context' => $context,
     ];
@@ -211,15 +211,15 @@ class CRM_Core_PseudoConstant {
     $dao = new $daoName();
     $fieldSpec = $dao->getFieldSpec($fieldName);
 
-    // Ensure we have the canonical name for this field
-    $fieldName = CRM_Utils_Array::value('name', $fieldSpec, $fieldName);
-
     // Return false if field doesn't exist.
     if (empty($fieldSpec)) {
       return FALSE;
     }
 
-    elseif (!empty($fieldSpec['pseudoconstant'])) {
+    // Ensure we have the canonical name for this field
+    $fieldName = $fieldSpec['name'] ?? $fieldName;
+
+    if (!empty($fieldSpec['pseudoconstant'])) {
       $pseudoconstant = $fieldSpec['pseudoconstant'];
 
       // if callback is specified..
@@ -232,9 +232,9 @@ class CRM_Core_PseudoConstant {
 
       // Merge params with schema defaults
       $params += [
-        'condition' => CRM_Utils_Array::value('condition', $pseudoconstant, []),
-        'keyColumn' => CRM_Utils_Array::value('keyColumn', $pseudoconstant),
-        'labelColumn' => CRM_Utils_Array::value('labelColumn', $pseudoconstant),
+        'condition' => $pseudoconstant['condition'] ?? [],
+        'keyColumn' => $pseudoconstant['keyColumn'] ?? NULL,
+        'labelColumn' => $pseudoconstant['labelColumn'] ?? NULL,
       ];
 
       // Fetch option group from option_value table
@@ -264,103 +264,16 @@ class CRM_Core_PseudoConstant {
 
       // Fetch options from other tables
       if (!empty($pseudoconstant['table'])) {
-        // Normalize params so the serialized cache string will be consistent.
         CRM_Utils_Array::remove($params, 'flip', 'fresh');
+        // Normalize params so the serialized cache string will be consistent.
         ksort($params);
         $cacheKey = $daoName . $fieldName . serialize($params);
-
         // Retrieve cached options
         if (isset(\Civi::$statics[__CLASS__][$cacheKey]) && empty($params['fresh'])) {
           $output = \Civi::$statics[__CLASS__][$cacheKey];
         }
         else {
-          $daoName = CRM_Core_DAO_AllCoreTables::getClassForTable($pseudoconstant['table']);
-          if (!class_exists($daoName)) {
-            return FALSE;
-          }
-          // Get list of fields for the option table
-          $dao = new $daoName();
-          $availableFields = array_keys($dao->fieldKeys());
-
-          $select = "SELECT %1 AS id, %2 AS label";
-          $from = "FROM %3";
-          $wheres = [];
-          $order = "ORDER BY %2";
-
-          // Use machine name in certain contexts
-          if ($context == 'validate' || $context == 'match') {
-            $nameField = $context == 'validate' ? 'labelColumn' : 'keyColumn';
-            if (!empty($pseudoconstant['nameColumn'])) {
-              $params[$nameField] = $pseudoconstant['nameColumn'];
-            }
-            elseif (in_array('name', $availableFields)) {
-              $params[$nameField] = 'name';
-            }
-          }
-
-          // Use abbrColum if context is abbreviate
-          if ($context == 'abbreviate' && (in_array('abbreviation', $availableFields) || !empty($pseudoconstant['abbrColumn']))) {
-            $params['labelColumn'] = $pseudoconstant['abbrColumn'] ?? 'abbreviation';
-          }
-
-          // Condition param can be passed as an sql clause string or an array of clauses
-          if (!empty($params['condition'])) {
-            $wheres[] = implode(' AND ', (array) $params['condition']);
-          }
-          // onlyActive param will automatically filter on common flags
-          if (!empty($params['onlyActive'])) {
-            foreach (['is_active' => 1, 'is_deleted' => 0, 'is_test' => 0, 'is_hidden' => 0] as $flag => $val) {
-              if (in_array($flag, $availableFields)) {
-                $wheres[] = "$flag = $val";
-              }
-            }
-          }
-          // Filter domain specific options
-          if (in_array('domain_id', $availableFields)) {
-            $wheres[] = 'domain_id = ' . CRM_Core_Config::domainID();
-          }
-          $queryParams = [
-            1 => [$params['keyColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
-            2 => [$params['labelColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
-            3 => [$pseudoconstant['table'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
-          ];
-          // Add orderColumn param
-          if (!empty($params['orderColumn'])) {
-            $queryParams[4] = [$params['orderColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES];
-            $order = "ORDER BY %4";
-          }
-          // Support no sorting if $params[orderColumn] is FALSE
-          elseif (isset($params['orderColumn']) && $params['orderColumn'] === FALSE) {
-            $order = '';
-          }
-          // Default to 'weight' if that column exists
-          elseif (in_array('weight', $availableFields)) {
-            $order = "ORDER BY weight";
-          }
-
-          $output = [];
-          $query = "$select $from";
-          if ($wheres) {
-            $query .= " WHERE " . implode($wheres, ' AND ');
-          }
-          $query .= ' ' . $order;
-          $dao = CRM_Core_DAO::executeQuery($query, $queryParams);
-          while ($dao->fetch()) {
-            $output[$dao->id] = $dao->label;
-          }
-          // Localize results
-          if (!empty($params['localize']) || $pseudoconstant['table'] == 'civicrm_country' || $pseudoconstant['table'] == 'civicrm_state_province') {
-            $I18nParams = [];
-            if (isset($fieldSpec['localize_context'])) {
-              $I18nParams['context'] = $fieldSpec['localize_context'];
-            }
-            $i18n = CRM_Core_I18n::singleton();
-            $i18n->localizeArray($output, $I18nParams);
-            // Maintain sort by label
-            if ($order == "ORDER BY %2") {
-              $output = CRM_Utils_Array::asort($output);
-            }
-          }
+          $output = self::renderOptionsFromTablePseudoconstant($pseudoconstant, $params, ($fieldSpec['localize_context'] ?? NULL), $context);
           CRM_Utils_Hook::fieldOptions($entity, $fieldName, $output, $params);
           \Civi::$statics[__CLASS__][$cacheKey] = $output;
         }
@@ -397,7 +310,7 @@ class CRM_Core_PseudoConstant {
     if ($values === FALSE) {
       return FALSE;
     }
-    return CRM_Utils_Array::value($key, $values);
+    return $values[$key] ?? NULL;
   }
 
   /**
@@ -417,7 +330,7 @@ class CRM_Core_PseudoConstant {
     if ($values === FALSE) {
       return FALSE;
     }
-    return CRM_Utils_Array::value($key, $values);
+    return $values[$key] ?? NULL;
   }
 
   /**
@@ -654,7 +567,7 @@ class CRM_Core_PseudoConstant {
    *   array reference of all State/Provinces.
    */
   public static function &stateProvince($id = FALSE, $limit = TRUE) {
-    if (($id && !CRM_Utils_Array::value($id, self::$stateProvince)) || !self::$stateProvince || !$id) {
+    if (($id && empty(self::$stateProvince[$id])) || !self::$stateProvince || !$id) {
       $whereClause = FALSE;
       if ($limit) {
         $countryIsoCodes = self::countryIsoCode();
@@ -791,7 +704,7 @@ WHERE  id = %1";
    *   array reference of all countries.
    */
   public static function country($id = FALSE, $applyLimit = TRUE) {
-    if (($id && !CRM_Utils_Array::value($id, self::$country)) || !self::$country || !$id) {
+    if (($id && empty(self::$country[$id])) || !self::$country || !$id) {
 
       $config = CRM_Core_Config::singleton();
       $limitCodes = [];
@@ -824,7 +737,7 @@ WHERE  id = %1";
         $countryIsoCodes = self::countryIsoCode();
         $defaultID = array_search(CRM_Core_BAO_Country::defaultContactCountry(), $countryIsoCodes);
         if ($defaultID !== FALSE) {
-          $default[$defaultID] = CRM_Utils_Array::value($defaultID, self::$country);
+          $default[$defaultID] = self::$country[$defaultID] ?? NULL;
           self::$country = $default + self::$country;
         }
       }
@@ -1006,9 +919,9 @@ WHERE  id = %1";
    * @return array
    *   array reference of all relationship types.
    */
-  public static function &relationshipType($valueColumnName = 'label', $reset = FALSE, $isActive = 1) {
+  public static function relationshipType($valueColumnName = 'label', $reset = FALSE, $isActive = 1) {
     $cacheKey = $valueColumnName . '::' . $isActive;
-    if (!CRM_Utils_Array::value($cacheKey, self::$relationshipType) || $reset) {
+    if (!isset(self::$relationshipType[$cacheKey]) || $reset) {
       self::$relationshipType[$cacheKey] = [];
 
       //now we have name/label columns CRM-3336
@@ -1151,7 +1064,7 @@ WHERE  id = %1";
     if (empty(self::$paymentProcessorType[$cacheKey])) {
       self::populate(self::$paymentProcessorType[$cacheKey], 'CRM_Financial_DAO_PaymentProcessorType', $all, $return, 'is_active', NULL, "is_default, $return", 'id');
     }
-    if ($id && CRM_Utils_Array::value($id, self::$paymentProcessorType[$cacheKey])) {
+    if ($id && !empty(self::$paymentProcessorType[$cacheKey][$id])) {
       return self::$paymentProcessorType[$cacheKey][$id];
     }
     return self::$paymentProcessorType[$cacheKey];
@@ -1393,12 +1306,12 @@ WHERE  id = %1
     $index = $filter['greeting_type'] . '_' . $columnName;
 
     // also add contactType to the array
-    $contactType = CRM_Utils_Array::value('contact_type', $filter);
+    $contactType = $filter['contact_type'] ?? NULL;
     if ($contactType) {
       $index .= '_' . $contactType;
     }
 
-    if (!CRM_Utils_Array::value($index, Civi::$statics[__CLASS__]['greeting'])) {
+    if (empty(Civi::$statics[__CLASS__]['greeting'][$index])) {
       $filterCondition = NULL;
       if ($contactType) {
         $filterVal = 'v.filter =';
@@ -1478,7 +1391,7 @@ WHERE  id = %1
       self::$accountOptionValues[$cacheKey] = CRM_Core_OptionGroup::values($optionGroupName, FALSE, FALSE, FALSE, $condition);
     }
     if ($id) {
-      return CRM_Utils_Array::value($id, self::$accountOptionValues[$cacheKey]);
+      return self::$accountOptionValues[$cacheKey][$id] ?? NULL;
     }
 
     return self::$accountOptionValues[$cacheKey];
@@ -1557,4 +1470,109 @@ WHERE  id = %1
     ];
   }
 
+  /**
+   * Render the field options from the available pseudoconstant.
+   *
+   * Do not call this function directly or from untested code. Further cleanup is likely.
+   *
+   * @param array $pseudoconstant
+   * @param array $params
+   * @param string|null $localizeContext
+   * @param string $context
+   *
+   * @return array|bool|mixed
+   */
+  public static function renderOptionsFromTablePseudoconstant($pseudoconstant, &$params = [], $localizeContext = NULL, $context = '') {
+    $daoName = CRM_Core_DAO_AllCoreTables::getClassForTable($pseudoconstant['table']);
+    if (!class_exists($daoName)) {
+      return FALSE;
+    }
+    // Get list of fields for the option table
+    /* @var CRM_Core_DAO $dao * */
+    $dao = new $daoName();
+    $availableFields = array_keys($dao->fieldKeys());
+
+    $select = 'SELECT %1 AS id, %2 AS label';
+    $from = 'FROM %3';
+    $wheres = [];
+    $order = 'ORDER BY %2';
+
+    // Use machine name in certain contexts
+    if ($context === 'validate' || $context === 'match') {
+      $nameField = $context === 'validate' ? 'labelColumn' : 'keyColumn';
+      if (!empty($pseudoconstant['nameColumn'])) {
+        $params[$nameField] = $pseudoconstant['nameColumn'];
+      }
+      elseif (in_array('name', $availableFields)) {
+        $params[$nameField] = 'name';
+      }
+    }
+
+    // Use abbrColum if context is abbreviate
+    if ($context === 'abbreviate' && (in_array('abbreviation', $availableFields) || !empty($pseudoconstant['abbrColumn']))) {
+      $params['labelColumn'] = $pseudoconstant['abbrColumn'] ?? 'abbreviation';
+    }
+
+    // Condition param can be passed as an sql clause string or an array of clauses
+    if (!empty($params['condition'])) {
+      $wheres[] = implode(' AND ', (array) $params['condition']);
+    }
+    // onlyActive param will automatically filter on common flags
+    if (!empty($params['onlyActive'])) {
+      foreach (['is_active' => 1, 'is_deleted' => 0, 'is_test' => 0, 'is_hidden' => 0] as $flag => $val) {
+        if (in_array($flag, $availableFields)) {
+          $wheres[] = "$flag = $val";
+        }
+      }
+    }
+    // Filter domain specific options
+    if (in_array('domain_id', $availableFields)) {
+      $wheres[] = 'domain_id = ' . CRM_Core_Config::domainID();
+    }
+    $queryParams = [
+      1 => [$params['keyColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
+      2 => [$params['labelColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
+      3 => [$pseudoconstant['table'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES],
+    ];
+    // Add orderColumn param
+    if (!empty($params['orderColumn'])) {
+      $queryParams[4] = [$params['orderColumn'], 'String', CRM_Core_DAO::QUERY_FORMAT_NO_QUOTES];
+      $order = 'ORDER BY %4';
+    }
+    // Support no sorting if $params[orderColumn] is FALSE
+    elseif (isset($params['orderColumn']) && $params['orderColumn'] === FALSE) {
+      $order = '';
+    }
+    // Default to 'weight' if that column exists
+    elseif (in_array('weight', $availableFields)) {
+      $order = "ORDER BY weight";
+    }
+
+    $output = [];
+    $query = "$select $from";
+    if ($wheres) {
+      $query .= " WHERE " . implode($wheres, ' AND ');
+    }
+    $query .= ' ' . $order;
+    $dao = CRM_Core_DAO::executeQuery($query, $queryParams);
+    while ($dao->fetch()) {
+      $output[$dao->id] = $dao->label;
+    }
+    // Localize results
+    if (!empty($params['localize']) || $pseudoconstant['table'] === 'civicrm_country' || $pseudoconstant['table'] === 'civicrm_state_province') {
+      $I18nParams = [];
+      if ($localizeContext) {
+        $I18nParams['context'] = $localizeContext;
+      }
+      $i18n = CRM_Core_I18n::singleton();
+      $i18n->localizeArray($output, $I18nParams);
+      // Maintain sort by label
+      if ($order === 'ORDER BY %2') {
+        $output = CRM_Utils_Array::asort($output);
+      }
+    }
+
+    return $output;
+  }
+
 }
diff --git a/civicrm/CRM/Core/Region.php b/civicrm/CRM/Core/Region.php
index 4fc96a074e..b1809af636 100644
--- a/civicrm/CRM/Core/Region.php
+++ b/civicrm/CRM/Core/Region.php
@@ -191,7 +191,7 @@ class CRM_Core_Region {
           break;
 
         case 'callback':
-          $args = isset($snippet['arguments']) ? $snippet['arguments'] : array(&$snippet, &$html);
+          $args = $snippet['arguments'] ?? array(&$snippet, &$html);
           $html .= call_user_func_array($snippet['callback'], $args);
           break;
 
diff --git a/civicrm/CRM/Core/Report/Excel.php b/civicrm/CRM/Core/Report/Excel.php
index 18749398b3..096ae050fc 100644
--- a/civicrm/CRM/Core/Report/Excel.php
+++ b/civicrm/CRM/Core/Report/Excel.php
@@ -26,17 +26,13 @@ class CRM_Core_Report_Excel {
    *   column headers.
    * @param array $rows
    *   result set rows.
-   * @param string $titleHeader
    * @param bool $outputHeader
    *
    * @return mixed
    *   empty if output is printed, else output
    *
    */
-  public static function makeCSVTable($header, $rows, $titleHeader = NULL, $outputHeader = TRUE) {
-    if ($titleHeader) {
-      echo $titleHeader;
-    }
+  public static function makeCSVTable($header, $rows, $outputHeader = TRUE) {
 
     $config = CRM_Core_Config::singleton();
     $seperator = $config->fieldSeparator;
@@ -156,14 +152,12 @@ class CRM_Core_Report_Excel {
    *   An array of the headers.
    * @param array $rows
    *   An array of arrays of the table contents.
-   * @param string $titleHeader
-   *   If set this will be the title in the CSV.
    * @param bool $outputHeader
    *   Should we output the header row.
    *
    * @return void
    */
-  public static function writeCSVFile($fileName, $header, $rows, $titleHeader = NULL, $outputHeader = TRUE) {
+  public static function writeCSVFile($fileName, $header, $rows, $outputHeader = TRUE) {
     if ($outputHeader) {
       CRM_Utils_System::download(CRM_Utils_String::munge($fileName),
         'text/x-csv',
@@ -174,7 +168,7 @@ class CRM_Core_Report_Excel {
     }
 
     if (!empty($rows)) {
-      return self::makeCSVTable($header, $rows, $titleHeader, $outputHeader);
+      return self::makeCSVTable($header, $rows, $outputHeader);
     }
   }
 
diff --git a/civicrm/CRM/Core/Selector/Controller.php b/civicrm/CRM/Core/Selector/Controller.php
index 1184aa0052..0f70941e90 100644
--- a/civicrm/CRM/Core/Selector/Controller.php
+++ b/civicrm/CRM/Core/Selector/Controller.php
@@ -342,7 +342,6 @@ class CRM_Core_Selector_Controller {
       // Merge headers not containing weight to ordered headers
       $finalColumnHeaders = array_merge($reorderedHeaders, $noWeightHeaders);
 
-      $rowsEmpty = count($rows) ? FALSE : TRUE;
       $qill = $this->getQill();
       $summary = $this->getSummary();
       // if we need to store in session, lets update session
@@ -353,7 +352,7 @@ class CRM_Core_Selector_Controller {
         }
         $this->_store->set("{$this->_prefix}rows", $rows);
         $this->_store->set("{$this->_prefix}rowCount", $this->_total);
-        $this->_store->set("{$this->_prefix}rowsEmpty", $rowsEmpty);
+        $this->_store->set("{$this->_prefix}rowsEmpty", !$rows);
         $this->_store->set("{$this->_prefix}qill", $qill);
         $this->_store->set("{$this->_prefix}summary", $summary);
       }
@@ -363,7 +362,7 @@ class CRM_Core_Selector_Controller {
 
         self::$_template->assign_by_ref("{$this->_prefix}columnHeaders", $finalColumnHeaders);
         self::$_template->assign_by_ref("{$this->_prefix}rows", $rows);
-        self::$_template->assign("{$this->_prefix}rowsEmpty", $rowsEmpty);
+        self::$_template->assign("{$this->_prefix}rowsEmpty", !$rows);
         self::$_template->assign("{$this->_prefix}qill", $qill);
         self::$_template->assign("{$this->_prefix}summary", $summary);
       }
diff --git a/civicrm/CRM/Core/Session.php b/civicrm/CRM/Core/Session.php
index 8cbcfdfead..037efb1115 100644
--- a/civicrm/CRM/Core/Session.php
+++ b/civicrm/CRM/Core/Session.php
@@ -250,7 +250,7 @@ class CRM_Core_Session {
       $session =& $this->_session[$this->_key][$prefix];
     }
 
-    return CRM_Utils_Array::value($name, $session);
+    return $session[$name] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Core/Smarty.php b/civicrm/CRM/Core/Smarty.php
index ef0fc4dab0..e45873d4db 100644
--- a/civicrm/CRM/Core/Smarty.php
+++ b/civicrm/CRM/Core/Smarty.php
@@ -276,7 +276,7 @@ class CRM_Core_Smarty extends Smarty {
     $oldVars = $this->get_template_vars();
     $backupFrame = [];
     foreach ($vars as $key => $value) {
-      $backupFrame[$key] = isset($oldVars[$key]) ? $oldVars[$key] : NULL;
+      $backupFrame[$key] = $oldVars[$key] ?? NULL;
     }
     $this->backupFrames[] = $backupFrame;
 
diff --git a/civicrm/CRM/Core/Smarty/plugins/function.crmAPI.php b/civicrm/CRM/Core/Smarty/plugins/function.crmAPI.php
index 57c8efe178..c1eae333e2 100644
--- a/civicrm/CRM/Core/Smarty/plugins/function.crmAPI.php
+++ b/civicrm/CRM/Core/Smarty/plugins/function.crmAPI.php
@@ -31,7 +31,7 @@ function smarty_function_crmAPI($params, &$smarty) {
   $entity = $params['entity'];
   $action = CRM_Utils_Array::value('action', $params, 'get');
   $params['sequential'] = CRM_Utils_Array::value('sequential', $params, 1);
-  $var = CRM_Utils_Array::value('var', $params);
+  $var = $params['var'] ?? NULL;
   CRM_Utils_Array::remove($params, 'entity', 'action', 'var');
   $params['version'] = 3;
   require_once 'api/api.php';
diff --git a/civicrm/CRM/Core/Smarty/plugins/function.crmAttributes.php b/civicrm/CRM/Core/Smarty/plugins/function.crmAttributes.php
index d6557b19e6..eabc3384a4 100644
--- a/civicrm/CRM/Core/Smarty/plugins/function.crmAttributes.php
+++ b/civicrm/CRM/Core/Smarty/plugins/function.crmAttributes.php
@@ -27,6 +27,6 @@
  * @return string
  */
 function smarty_function_crmAttributes($params, &$smarty) {
-  $attributes = isset($params['a']) ? $params['a'] : [];
+  $attributes = $params['a'] ?? [];
   return CRM_Utils_String::htmlAttributes($attributes);
 }
diff --git a/civicrm/CRM/Core/Smarty/plugins/function.crmKey.php b/civicrm/CRM/Core/Smarty/plugins/function.crmKey.php
index 894b252f7a..63ec93388c 100644
--- a/civicrm/CRM/Core/Smarty/plugins/function.crmKey.php
+++ b/civicrm/CRM/Core/Smarty/plugins/function.crmKey.php
@@ -29,8 +29,5 @@
  *   the generated key
  */
 function smarty_function_crmKey($params, &$smarty) {
-  return CRM_Core_Key::get(
-      $params['name'],
-      CRM_Utils_Array::value('addSequence', $params, 0)
-    );
+  return CRM_Core_Key::get($params['name'], $params['addSequence'] ?? FALSE);
 }
diff --git a/civicrm/CRM/Core/Task.php b/civicrm/CRM/Core/Task.php
index ed0adfeefb..40985c4b45 100644
--- a/civicrm/CRM/Core/Task.php
+++ b/civicrm/CRM/Core/Task.php
@@ -155,7 +155,7 @@ abstract class CRM_Core_Task {
   public static function getTask($value) {
     static::tasks();
 
-    if (!CRM_Utils_Array::value($value, self::$_tasks)) {
+    if (empty(self::$_tasks[$value])) {
       // Children can specify a default task (eg. print), pick another if it is not valid.
       $value = key(self::$_tasks);
     }
diff --git a/civicrm/CRM/Core/Transaction.php b/civicrm/CRM/Core/Transaction.php
index b00ce04135..04be629fb3 100644
--- a/civicrm/CRM/Core/Transaction.php
+++ b/civicrm/CRM/Core/Transaction.php
@@ -236,4 +236,24 @@ class CRM_Core_Transaction {
     $frame->addCallback($phase, $callback, $params, $id);
   }
 
+  /**
+   * Whenever hook_civicrm_post fires, schedule an equivalent
+   * call to hook_civicrm_postCommit.
+   *
+   * @param \Civi\Core\Event\PostEvent $e
+   * @see CRM_Utils_Hook::post
+   */
+  public static function addPostCommit($e) {
+    // Do we want to dedupe post-commit hooks for the same txn? Setting an ID
+    // would allow this.
+    // $id = $e->entity . chr(0) . $e->action . chr(0) . $e->id;
+    $frame = \Civi\Core\Transaction\Manager::singleton()->getBaseFrame();
+    if ($frame) {
+      $frame->addCallback(self::PHASE_POST_COMMIT, ['CRM_Utils_Hook', 'postCommit'], [$e->action, $e->entity, $e->id, $e->object]);
+    }
+    else {
+      \CRM_Utils_Hook::postCommit($e->action, $e->entity, $e->id, $e->object);
+    }
+  }
+
 }
diff --git a/civicrm/CRM/Core/xml/Menu/Api4.xml b/civicrm/CRM/Core/xml/Menu/Api4.xml
index 1973f23437..877a9b6a23 100644
--- a/civicrm/CRM/Core/xml/Menu/Api4.xml
+++ b/civicrm/CRM/Core/xml/Menu/Api4.xml
@@ -3,7 +3,7 @@
   <item>
     <path>civicrm/ajax/api4</path>
     <page_callback>CRM_Api4_Page_AJAX</page_callback>
-    <access_arguments>access CiviCRM</access_arguments>
+    <access_arguments>access CiviCRM;access AJAX API</access_arguments>
   </item>
   <item>
     <path>civicrm/api4</path>
diff --git a/civicrm/CRM/Custom/Form/CustomData.php b/civicrm/CRM/Custom/Form/CustomData.php
index e502c72e15..50492eab5c 100644
--- a/civicrm/CRM/Custom/Form/CustomData.php
+++ b/civicrm/CRM/Custom/Form/CustomData.php
@@ -140,7 +140,7 @@ class CRM_Custom_Form_CustomData {
     }
 
     $gid = (isset($form->_groupID)) ? $form->_groupID : NULL;
-    $getCachedTree = isset($form->_getCachedTree) ? $form->_getCachedTree : TRUE;
+    $getCachedTree = $form->_getCachedTree ?? TRUE;
 
     $subType = $form->_subType;
     if (!is_array($subType) && strstr($subType, CRM_Core_DAO::VALUE_SEPARATOR)) {
diff --git a/civicrm/CRM/Custom/Form/DeleteField.php b/civicrm/CRM/Custom/Form/DeleteField.php
index 492a5847a1..8298ec9660 100644
--- a/civicrm/CRM/Custom/Form/DeleteField.php
+++ b/civicrm/CRM/Custom/Form/DeleteField.php
@@ -49,7 +49,7 @@ class CRM_Custom_Form_DeleteField extends CRM_Core_Form {
     $params = ['id' => $this->_id];
     CRM_Core_BAO_CustomField::retrieve($params, $defaults);
 
-    $this->_title = CRM_Utils_Array::value('label', $defaults);
+    $this->_title = $defaults['label'] ?? NULL;
     $this->assign('title', $this->_title);
     CRM_Utils_System::setTitle(ts('Delete %1', [1 => $this->_title]));
   }
diff --git a/civicrm/CRM/Custom/Form/Field.php b/civicrm/CRM/Custom/Form/Field.php
index 0aeb046607..3881c1d980 100644
--- a/civicrm/CRM/Custom/Form/Field.php
+++ b/civicrm/CRM/Custom/Form/Field.php
@@ -90,7 +90,7 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
       $params = ['id' => $this->_id];
       CRM_Core_BAO_CustomField::retrieve($params, $this->_values);
       // note_length is an alias for the text_length field
-      $this->_values['note_length'] = CRM_Utils_Array::value('text_length', $this->_values);
+      $this->_values['note_length'] = $this->_values['text_length'] ?? NULL;
       // custom group id
       $this->_gid = $this->_values['custom_group_id'];
     }
@@ -571,7 +571,7 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
    *                  true otherwise
    */
   public static function formRule($fields, $files, $self) {
-    $default = CRM_Utils_Array::value('default_value', $fields);
+    $default = $fields['default_value'] ?? NULL;
 
     $errors = [];
 
diff --git a/civicrm/CRM/Custom/Form/Group.php b/civicrm/CRM/Custom/Form/Group.php
index e21c34fe5a..10c582c320 100644
--- a/civicrm/CRM/Custom/Form/Group.php
+++ b/civicrm/CRM/Custom/Form/Group.php
@@ -73,7 +73,7 @@ class CRM_Custom_Form_Group extends CRM_Core_Form {
       $params = ['id' => $this->_id];
       CRM_Core_BAO_CustomGroup::retrieve($params, $this->_defaults);
 
-      $subExtends = CRM_Utils_Array::value('extends_entity_column_value', $this->_defaults);
+      $subExtends = $this->_defaults['extends_entity_column_value'] ?? NULL;
       if (!empty($subExtends)) {
         $this->_subtypes = explode(CRM_Core_DAO::VALUE_SEPARATOR, substr($subExtends, 1, -1));
       }
@@ -255,7 +255,7 @@ class CRM_Custom_Form_Group extends CRM_Core_Form {
       $sel->_elements[1]->setSize(5);
     }
     if ($this->_action == CRM_Core_Action::UPDATE) {
-      $subName = CRM_Utils_Array::value('extends_entity_column_id', $this->_defaults);
+      $subName = $this->_defaults['extends_entity_column_id'] ?? NULL;
       if ($this->_defaults['extends'] == 'Participant') {
         if ($subName == 1) {
           $this->_defaults['extends'] = 'ParticipantRole';
diff --git a/civicrm/CRM/Custom/Import/Form/MapField.php b/civicrm/CRM/Custom/Import/Form/MapField.php
index b7a42335c2..30db99f01f 100644
--- a/civicrm/CRM/Custom/Import/Form/MapField.php
+++ b/civicrm/CRM/Custom/Import/Form/MapField.php
@@ -83,7 +83,7 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
     }
 
     if (!empty($fields['saveMapping'])) {
-      $nameField = CRM_Utils_Array::value('saveMappingName', $fields);
+      $nameField = $fields['saveMappingName'] ?? NULL;
       if (empty($nameField)) {
         $errors['saveMappingName'] = ts('Name is required to save Import Mapping');
       }
@@ -96,7 +96,7 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
 
     //display Error if loaded mapping is not selected
     if (array_key_exists('loadMapping', $fields)) {
-      $getMapName = CRM_Utils_Array::value('savedMapping', $fields);
+      $getMapName = $fields['savedMapping'] ?? NULL;
       if (empty($getMapName)) {
         $errors['savedMapping'] = ts('Select saved mapping');
       }
@@ -172,9 +172,9 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
         $updateMappingFields->column_number = $i;
 
         $explodedValues = explode('_', $mapperKeys[$i][0]);
-        $id = CRM_Utils_Array::value(0, $explodedValues);
-        $first = CRM_Utils_Array::value(1, $explodedValues);
-        $second = CRM_Utils_Array::value(2, $explodedValues);
+        $id = $explodedValues[0] ?? NULL;
+        $first = $explodedValues[1] ?? NULL;
+        $second = $explodedValues[2] ?? NULL;
 
         $updateMappingFields->name = $mapper[$i];
         $updateMappingFields->save();
@@ -196,9 +196,9 @@ class CRM_Custom_Import_Form_MapField extends CRM_Contact_Import_Form_MapField {
         $saveMappingFields->column_number = $i;
 
         $explodedValues = explode('_', $mapperKeys[$i][0]);
-        $id = CRM_Utils_Array::value(0, $explodedValues);
-        $first = CRM_Utils_Array::value(1, $explodedValues);
-        $second = CRM_Utils_Array::value(2, $explodedValues);
+        $id = $explodedValues[0] ?? NULL;
+        $first = $explodedValues[1] ?? NULL;
+        $second = $explodedValues[2] ?? NULL;
 
         $saveMappingFields->name = $mapper[$i];
         $saveMappingFields->save();
diff --git a/civicrm/CRM/Custom/Import/Parser/Api.php b/civicrm/CRM/Custom/Import/Parser/Api.php
index ab60fa1d33..db3180adb7 100644
--- a/civicrm/CRM/Custom/Import/Parser/Api.php
+++ b/civicrm/CRM/Custom/Import/Parser/Api.php
@@ -242,7 +242,7 @@ class CRM_Custom_Import_Parser_Api extends CRM_Custom_Import_Parser {
     $allFields = civicrm_api3('custom_field', 'get', $params);
     $fields = $allFields['values'];
     foreach ($fields as $id => $values) {
-      $datatype = CRM_Utils_Array::value('data_type', $values);
+      $datatype = $values['data_type'] ?? NULL;
       if ($datatype == 'File') {
         continue;
       }
@@ -251,18 +251,18 @@ class CRM_Custom_Import_Parser_Api extends CRM_Custom_Import_Parser {
       $regexp = preg_replace('/[.,;:!?]/', '', CRM_Utils_Array::value(0, $values));
       $importableFields[$key] = [
         'name' => $key,
-        'title' => CRM_Utils_Array::value('label', $values),
+        'title' => $values['label'] ?? NULL,
         'headerPattern' => '/' . preg_quote($regexp, '/') . '/',
         'import' => 1,
         'custom_field_id' => $id,
-        'options_per_line' => CRM_Utils_Array::value('options_per_line', $values),
-        'data_type' => CRM_Utils_Array::value('data_type', $values),
-        'html_type' => CRM_Utils_Array::value('html_type', $values),
-        'is_search_range' => CRM_Utils_Array::value('is_search_range', $values),
+        'options_per_line' => $values['options_per_line'] ?? NULL,
+        'data_type' => $values['data_type'] ?? NULL,
+        'html_type' => $values['html_type'] ?? NULL,
+        'is_search_range' => $values['is_search_range'] ?? NULL,
       ];
       if (CRM_Utils_Array::value('html_type', $values) == 'Select Date') {
-        $importableFields[$key]['date_format'] = CRM_Utils_Array::value('date_format', $values);
-        $importableFields[$key]['time_format'] = CRM_Utils_Array::value('time_format', $values);
+        $importableFields[$key]['date_format'] = $values['date_format'] ?? NULL;
+        $importableFields[$key]['time_format'] = $values['time_format'] ?? NULL;
         $this->_dateFields[] = $key;
       }
     }
diff --git a/civicrm/CRM/Custom/Page/Group.php b/civicrm/CRM/Custom/Page/Group.php
index e0bb74ac15..d8a931e63d 100644
--- a/civicrm/CRM/Custom/Page/Group.php
+++ b/civicrm/CRM/Custom/Page/Group.php
@@ -268,9 +268,9 @@ class CRM_Custom_Page_Group extends CRM_Core_Page {
     CRM_Core_BAO_CustomGroup::getExtendedObjectTypes($subTypes);
 
     foreach ($customGroup as $key => $values) {
-      $subValue = CRM_Utils_Array::value('extends_entity_column_value', $customGroup[$key]);
-      $subName = CRM_Utils_Array::value('extends_entity_column_id', $customGroup[$key]);
-      $type = CRM_Utils_Array::value('extends', $customGroup[$key]);
+      $subValue = $customGroup[$key]['extends_entity_column_value'] ?? NULL;
+      $subName = $customGroup[$key]['extends_entity_column_id'] ?? NULL;
+      $type = $customGroup[$key]['extends'] ?? NULL;
       if ($subValue) {
         $subValue = explode(CRM_Core_DAO::VALUE_SEPARATOR,
           substr($subValue, 1, -1)
@@ -296,14 +296,14 @@ class CRM_Custom_Page_Group extends CRM_Core_Page {
               }
             }
             else {
-              $colValue = $colValue ? ($colValue . (isset($subTypes[$type][$sub]) ? ', ' . $subTypes[$type][$sub] : '')) : (isset($subTypes[$type][$sub]) ? $subTypes[$type][$sub] : '');
+              $colValue = $colValue ? ($colValue . (isset($subTypes[$type][$sub]) ? ', ' . $subTypes[$type][$sub] : '')) : ($subTypes[$type][$sub] ?? '');
             }
           }
         }
         $customGroup[$key]["extends_entity_column_value"] = $colValue;
       }
       else {
-        if (is_array(CRM_Utils_Array::value($type, $subTypes))) {
+        if (isset($subTypes[$type]) && is_array($subTypes[$type])) {
           $customGroup[$key]["extends_entity_column_value"] = ts("Any");
         }
       }
diff --git a/civicrm/CRM/Dedupe/BAO/Exception.php b/civicrm/CRM/Dedupe/BAO/Exception.php
index 3c4c783cfc..6097887055 100644
--- a/civicrm/CRM/Dedupe/BAO/Exception.php
+++ b/civicrm/CRM/Dedupe/BAO/Exception.php
@@ -30,13 +30,13 @@ class CRM_Dedupe_BAO_Exception extends CRM_Dedupe_DAO_Exception {
   public static function create($params) {
     $hook = empty($params['id']) ? 'create' : 'edit';
     CRM_Utils_Hook::pre($hook, 'Exception', CRM_Utils_Array::value('id', $params), $params);
-    $contact1 = CRM_Utils_Array::value('contact_id1', $params);
-    $contact2 = CRM_Utils_Array::value('contact_id2', $params);
+    $contact1 = $params['contact_id1'] ?? NULL;
+    $contact2 = $params['contact_id2'] ?? NULL;
     $dao = new CRM_Dedupe_BAO_Exception();
     $dao->copyValues($params);
     if ($contact1 && $contact2) {
       CRM_Core_DAO::singleValueQuery("
-        DELETE FROM civicrm_prevnext_cache 
+        DELETE FROM civicrm_prevnext_cache
         WHERE (entity_id1 = %1 AND entity_id2 = %2)
         OR (entity_id1 = %2 AND entity_id2 = %2)",
         [1 => [$contact1, 'Integer'], 2 => [$contact2, 'Integer']]
diff --git a/civicrm/CRM/Dedupe/BAO/QueryBuilder/IndividualGeneral.php b/civicrm/CRM/Dedupe/BAO/QueryBuilder/IndividualGeneral.php
index 373866f7a8..4a4b93d618 100644
--- a/civicrm/CRM/Dedupe/BAO/QueryBuilder/IndividualGeneral.php
+++ b/civicrm/CRM/Dedupe/BAO/QueryBuilder/IndividualGeneral.php
@@ -12,8 +12,8 @@ class CRM_Dedupe_BAO_QueryBuilder_IndividualGeneral extends CRM_Dedupe_BAO_Query
    * @return array
    */
   public static function record($rg) {
-    $civicrm_contact = CRM_Utils_Array::value('civicrm_contact', $rg->params);
-    $civicrm_address = CRM_Utils_Array::value('civicrm_address', $rg->params);
+    $civicrm_contact = $rg->params['civicrm_contact'] ?? NULL;
+    $civicrm_address = $rg->params['civicrm_address'] ?? NULL;
 
     // Since definitely have first and last name, escape them upfront.
     $first_name = CRM_Core_DAO::escapeString(CRM_Utils_Array::value('first_name', $civicrm_contact, ''));
diff --git a/civicrm/CRM/Dedupe/BAO/Rule.php b/civicrm/CRM/Dedupe/BAO/Rule.php
index 58aed5c246..ab58f12321 100644
--- a/civicrm/CRM/Dedupe/BAO/Rule.php
+++ b/civicrm/CRM/Dedupe/BAO/Rule.php
@@ -240,7 +240,7 @@ class CRM_Dedupe_BAO_Rule extends CRM_Dedupe_DAO_Rule {
       $exception->contact_id2 = $cid;
     }
 
-    return $exception->find(TRUE) ? FALSE : TRUE;
+    return !$exception->find(TRUE);
   }
 
   /**
diff --git a/civicrm/CRM/Dedupe/Finder.php b/civicrm/CRM/Dedupe/Finder.php
index f2626bcb32..97e8abcf51 100644
--- a/civicrm/CRM/Dedupe/Finder.php
+++ b/civicrm/CRM/Dedupe/Finder.php
@@ -230,7 +230,7 @@ class CRM_Dedupe_Finder {
         continue;
       }
       foreach ($cg['fields'] as $cf) {
-        $flat[$cf['column_name']] = CRM_Utils_Array::value('data', $cf['customValue']);
+        $flat[$cf['column_name']] = $cf['customValue']['data'] ?? NULL;
       }
     }
 
@@ -340,16 +340,22 @@ class CRM_Dedupe_Finder {
       }
 
       $mainContacts[] = $row = [
-        'dstID' => $dstID,
+        'dstID' => (int) $dstID,
         'dstName' => $displayNames[$dstID],
-        'srcID' => $srcID,
+        'srcID' => (int) $srcID,
         'srcName' => $displayNames[$srcID],
         'weight' => $dupes[2],
         'canMerge' => TRUE,
       ];
 
-      $data = CRM_Core_DAO::escapeString(serialize($row));
-      CRM_Core_BAO_PrevNextCache::setItem('civicrm_contact', $dstID, $srcID, $cacheKeyString, $data);
+      CRM_Core_DAO::executeQuery("INSERT INTO civicrm_prevnext_cache (entity_table, entity_id1, entity_id2, cacheKey, data) VALUES
+        ('civicrm_contact', %1, %2, %3, %4)", [
+          1 => [$dstID, 'Integer'],
+          2 => [$srcID, 'Integer'],
+          3 => [$cacheKeyString, 'String'],
+          4 => [serialize($row), 'String'],
+        ]
+      );
     }
     return $mainContacts;
   }
diff --git a/civicrm/CRM/Dedupe/Merger.php b/civicrm/CRM/Dedupe/Merger.php
index c5f063d1df..7e2354a01a 100644
--- a/civicrm/CRM/Dedupe/Merger.php
+++ b/civicrm/CRM/Dedupe/Merger.php
@@ -637,8 +637,8 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
       if (strpos($key, '_')) {
         continue;
       }
-      $key1 = CRM_Utils_Array::value($key, $mainEvs);
-      $key2 = CRM_Utils_Array::value($key, $otherEvs);
+      $key1 = $mainEvs[$key] ?? NULL;
+      $key2 = $otherEvs[$key] ?? NULL;
       // We wish to retain '0' as it has a different meaning than NULL on a checkbox.
       // However I can't think of a case where an empty string is more meaningful than null
       // or where it would be FALSE or something else nullish.
@@ -687,7 +687,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
    * @throws \CiviCRM_API3_Exception
    */
   public static function batchMerge($rgid, $gid = NULL, $mode = 'safe', $batchLimit = 1, $isSelected = 2, $criteria = [], $checkPermissions = TRUE, $reloadCacheIfEmpty = NULL, $searchLimit = 0) {
-    $redirectForPerformance = ($batchLimit > 1) ? TRUE : FALSE;
+    $redirectForPerformance = $batchLimit > 1;
     if ($mode === 'aggressive' && $checkPermissions && !CRM_Core_Permission::check('force merge duplicate contacts')) {
       throw new CRM_Core_Exception(ts('Insufficient permissions for aggressive mode batch merge'));
     }
@@ -772,12 +772,12 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
 
     // store the updated stats
     $data = [
-      'merged' => $merged,
-      'skipped' => $skipped,
+      'merged' => (int) $merged,
+      'skipped' => (int) $skipped,
     ];
-    $data = CRM_Core_DAO::escapeString(serialize($data));
 
-    CRM_Core_BAO_PrevNextCache::setItem('civicrm_contact', 0, 0, $cacheKeyString . '_stats', $data);
+    CRM_Core_DAO::executeQuery("INSERT INTO civicrm_prevnext_cache (entity_table, entity_id1, entity_id2, cacheKey, data) VALUES
+        ('civicrm_contact', 0, 0, %1, %2)", [1 => [$cacheKeyString . '_stats', 'String'], 2 => [serialize($data), 'String']]);
   }
 
   /**
@@ -859,7 +859,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
   public static function merge($dupePairs = [], $cacheParams = [], $mode = 'safe',
                                $redirectForPerformance = FALSE, $checkPermissions = TRUE
   ) {
-    $cacheKeyString = CRM_Utils_Array::value('cache_key_string', $cacheParams);
+    $cacheKeyString = $cacheParams['cache_key_string'] ?? NULL;
     $resultStats = ['merged' => [], 'skipped' => []];
 
     // we don't want dupe caching to get reset after every-merge, and therefore set the
@@ -1716,7 +1716,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
       // @todo Tidy this up
       $operation = 0;
       if ($fieldName != 'website') {
-        $operation = CRM_Utils_Array::value('operation', $migrationInfo['location_blocks'][$fieldName][$fieldCount]);
+        $operation = $migrationInfo['location_blocks'][$fieldName][$fieldCount]['operation'] ?? NULL;
       }
       // default operation is overwrite.
       if (!$operation) {
@@ -1744,7 +1744,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
         $billingDAOId = (array_key_exists($name, $billingBlockIds)) ? array_pop($billingBlockIds[$name]) : NULL;
 
         foreach ($block as $blkCount => $values) {
-          $otherBlockId = CRM_Utils_Array::value('id', $migrationInfo['other_details']['location_blocks'][$name][$blkCount]);
+          $otherBlockId = $migrationInfo['other_details']['location_blocks'][$name][$blkCount]['id'] ?? NULL;
           $mainBlockId = CRM_Utils_Array::value('mainContactBlockId', $migrationInfo['location_blocks'][$name][$blkCount], 0);
           if (!$otherBlockId) {
             continue;
@@ -1759,18 +1759,18 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
 
           // Add/update location and type information from the form, if applicable
           if ($locationBlocks[$name]['hasLocation']) {
-            $locTypeId = CRM_Utils_Array::value('locTypeId', $migrationInfo['location_blocks'][$name][$blkCount]);
+            $locTypeId = $migrationInfo['location_blocks'][$name][$blkCount]['locTypeId'] ?? NULL;
             $otherBlockDAO->location_type_id = $locTypeId;
           }
           if ($locationBlocks[$name]['hasType']) {
-            $typeTypeId = CRM_Utils_Array::value('typeTypeId', $migrationInfo['location_blocks'][$name][$blkCount]);
+            $typeTypeId = $migrationInfo['location_blocks'][$name][$blkCount]['typeTypeId'] ?? NULL;
             $otherBlockDAO->{$locationBlocks[$name]['hasType']} = $typeTypeId;
           }
 
           // If we're deliberately setting this as primary then add the flag
           // and remove it from the current primary location (if there is one).
           // But only once for each entity.
-          $set_primary = CRM_Utils_Array::value('set_other_primary', $migrationInfo['location_blocks'][$name][$blkCount]);
+          $set_primary = $migrationInfo['location_blocks'][$name][$blkCount]['set_other_primary'] ?? NULL;
           if (!$changePrimary && $set_primary == "1") {
             $otherBlockDAO->is_primary = 1;
             if ($primaryDAOId) {
@@ -2125,7 +2125,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
 
           // Load the address we're inspecting from the 'other' contact
           $addressRecord = $migrationInfo['other_details']['location_blocks'][$fieldName][$fieldCount];
-          $addressRecordLocTypeId = CRM_Utils_Array::value('location_type_id', $addressRecord);
+          $addressRecordLocTypeId = $addressRecord['location_type_id'] ?? NULL;
 
           // If it exists on the 'main' contact already, skip it. Otherwise
           // if the location type exists already, log a conflict.
@@ -2217,7 +2217,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
           if (in_array($fieldName, self::ignoredFields())) {
             continue;
           }
-          $toRemoveValue = CRM_Utils_Array::value($fieldName, $toRemoveContactLocationBlocks[$entity][$blockIndex]);
+          $toRemoveValue = $toRemoveContactLocationBlocks[$entity][$blockIndex][$fieldName] ?? NULL;
           if ($fieldValue !== $toRemoveValue) {
             $entityConflicts[$fieldName] = [
               $toKeepID => $fieldValue,
@@ -2296,7 +2296,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
    */
   private static function getFieldValueAndLabel($field, $contact): array {
     $fields = self::getMergeFieldsMetadata();
-    $value = $label = CRM_Utils_Array::value($field, $contact);
+    $value = $label = $contact[$field] ?? NULL;
     $fieldSpec = $fields[$field];
     if (!empty($fieldSpec['serialize']) && is_array($value)) {
       // In practice this only applies to preferred_communication_method as the sub types are skipped above
@@ -2475,7 +2475,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
 
         $lookupType = FALSE;
         if ($blockInfo['hasType']) {
-          $lookupType = CRM_Utils_Array::value($blockInfo['hasType'], $value);
+          $lookupType = $value[$blockInfo['hasType']] ?? NULL;
         }
 
         // Hold ID of main contact's matching block
@@ -2571,7 +2571,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
           // Load the type options for this entity
           $typeOptions = civicrm_api3($blockName, 'getoptions', ['field' => $blockInfo['hasType']]);
 
-          $thisTypeId = CRM_Utils_Array::value($blockInfo['hasType'], $value);
+          $thisTypeId = $value[$blockInfo['hasType']] ?? NULL;
 
           // Put this field's location type at the top of the list
           $tmpIdList = $typeOptions['values'];
diff --git a/civicrm/CRM/Event/BAO/Event.php b/civicrm/CRM/Event/BAO/Event.php
index ec04f44f1e..1e178acae2 100644
--- a/civicrm/CRM/Event/BAO/Event.php
+++ b/civicrm/CRM/Event/BAO/Event.php
@@ -134,7 +134,7 @@ class CRM_Event_BAO_Event extends CRM_Event_DAO_Event {
 
     $contactId = CRM_Core_Session::getLoggedInContactID();
     if (!$contactId) {
-      $contactId = CRM_Utils_Array::value('contact_id', $params);
+      $contactId = $params['contact_id'] ?? NULL;
     }
 
     // Log the information on successful add/edit of Event
@@ -1104,8 +1104,8 @@ WHERE civicrm_event.is_active = 1
 
       //send email only when email is present
       if (isset($email) || $returnMessageText) {
-        $preProfileID = CRM_Utils_Array::value('custom_pre_id', $values);
-        $postProfileID = CRM_Utils_Array::value('custom_post_id', $values);
+        $preProfileID = $values['custom_pre_id'] ?? NULL;
+        $postProfileID = $values['custom_post_id'] ?? NULL;
 
         if (!empty($values['params']['additionalParticipant'])) {
           $preProfileID = CRM_Utils_Array::value('additional_custom_pre_id', $values, $preProfileID);
@@ -1147,10 +1147,10 @@ WHERE civicrm_event.is_active = 1
         }
         $tplParams = array_merge($values, $participantParams, [
           'email' => $email,
-          'confirm_email_text' => CRM_Utils_Array::value('confirm_email_text', $values['event']),
-          'isShowLocation' => CRM_Utils_Array::value('is_show_location', $values['event']),
+          'confirm_email_text' => $values['event']['confirm_email_text'] ?? NULL,
+          'isShowLocation' => $values['event']['is_show_location'] ?? NULL,
           // The concept of contributeMode is deprecated.
-          'contributeMode' => CRM_Utils_Array::value('contributeMode', $template->_tpl_vars),
+          'contributeMode' => $template->_tpl_vars['contributeMode'] ?? NULL,
           'customPre' => $profilePre[0],
           'customPre_grouptitle' => empty($profilePre[1]) ? NULL : [CRM_Core_BAO_UFGroup::getFrontEndTitle((int) $preProfileID)],
           'customPost' => $profilePost[0],
@@ -1233,7 +1233,7 @@ WHERE civicrm_event.is_active = 1
           );
           // append invoice pdf to email
           $prefixValue = Civi::settings()->get('contribution_invoice_settings');
-          $invoicing = CRM_Utils_Array::value('invoicing', $prefixValue);
+          $invoicing = $prefixValue['invoicing'] ?? NULL;
           if (isset($invoicing) && isset($prefixValue['is_email_pdf']) && !empty($values['contributionId'])) {
             $sendTemplateParams['isEmailPdf'] = TRUE;
             $sendTemplateParams['contributionId'] = $values['contributionId'];
@@ -1581,7 +1581,7 @@ WHERE civicrm_event.is_active = 1
         }
         elseif (substr($name, -11) == 'campaign_id') {
           $campaigns = CRM_Campaign_BAO_Campaign::getCampaigns($params[$name]);
-          $values[$index] = CRM_Utils_Array::value($params[$name], $campaigns);
+          $values[$index] = $campaigns[$params[$name]] ?? NULL;
         }
         elseif (strpos($name, '-') !== FALSE) {
           list($fieldName, $id) = CRM_Utils_System::explode('-', $name, 2);
@@ -1598,7 +1598,7 @@ WHERE civicrm_event.is_active = 1
           elseif ($fieldName == 'im') {
             $providerName = NULL;
             if ($providerId = $detailName . '-provider_id') {
-              $providerName = CRM_Utils_Array::value($params[$providerId], $imProviders);
+              $providerName = $imProviders[$params[$providerId]] ?? NULL;
             }
             if ($providerName) {
               $values[$index] = $params[$detailName] . " (" . $providerName . ")";
@@ -1638,8 +1638,8 @@ WHERE  id = $cfID
               $htmlType = $dao->html_type;
 
               if ($htmlType == 'File') {
-                $path = CRM_Utils_Array::value('name', $params[$name]);
-                $fileType = CRM_Utils_Array::value('type', $params[$name]);
+                $path = $params[$name]['name'] ?? NULL;
+                $fileType = $params[$name]['type'] ?? NULL;
                 $values[$index] = CRM_Utils_File::getFileURL($path, $fileType);
               }
               else {
@@ -1710,7 +1710,7 @@ WHERE  id = $cfID
               $values[$index] = CRM_Utils_Date::customFormat(CRM_Utils_Date::format($params[$name]));
             }
             else {
-              $values[$index] = CRM_Utils_Array::value($name, $params);
+              $values[$index] = $params[$name] ?? NULL;
             }
           }
         }
@@ -1780,8 +1780,8 @@ WHERE  id = $cfID
       return $additionalIDs;
     }
 
-    $preProfileID = CRM_Utils_Array::value('additional_custom_pre_id', $values);
-    $postProfileID = CRM_Utils_Array::value('additional_custom_post_id', $values);
+    $preProfileID = $values['additional_custom_pre_id'] ?? NULL;
+    $postProfileID = $values['additional_custom_post_id'] ?? NULL;
     //else build array of Additional participant's information.
     if (count($additionalIDs)) {
       if ($preProfileID || $postProfileID) {
@@ -2212,8 +2212,8 @@ WHERE  ce.loc_block_id = $locBlockId";
 
         $fromEmailValues['from_email_id'][$eventEmailId] = htmlspecialchars($eventEmailId);
         $fromEmailId = [
-          'cc' => CRM_Utils_Array::value('cc_confirm', $eventEmail),
-          'bcc' => CRM_Utils_Array::value('bcc_confirm', $eventEmail),
+          'cc' => $eventEmail['cc_confirm'] ?? NULL,
+          'bcc' => $eventEmail['bcc_confirm'] ?? NULL,
         ];
         $fromEmailValues = array_merge($fromEmailValues, $fromEmailId);
       }
diff --git a/civicrm/CRM/Event/BAO/Participant.php b/civicrm/CRM/Event/BAO/Participant.php
index 95070570c3..8117991b40 100644
--- a/civicrm/CRM/Event/BAO/Participant.php
+++ b/civicrm/CRM/Event/BAO/Participant.php
@@ -97,7 +97,7 @@ class CRM_Event_BAO_Participant extends CRM_Event_DAO_Participant {
 
     $participantBAO = new CRM_Event_BAO_Participant();
     if (!empty($params['id'])) {
-      $participantBAO->id = CRM_Utils_Array::value('id', $params);
+      $participantBAO->id = $params['id'] ?? NULL;
       $participantBAO->find(TRUE);
       $participantBAO->register_date = CRM_Utils_Date::isoToMysql($participantBAO->register_date);
     }
@@ -203,7 +203,7 @@ class CRM_Event_BAO_Participant extends CRM_Event_DAO_Participant {
     $session = CRM_Core_Session::singleton();
     $id = $session->get('userID');
     if (!$id) {
-      $id = CRM_Utils_Array::value('contact_id', $params);
+      $id = $params['contact_id'] ?? NULL;
     }
 
     // add custom field values
@@ -666,7 +666,7 @@ INNER JOIN  civicrm_price_field field       ON ( value.price_field_id = field.id
               'column_name'
             );
             $value = $customFieldId ? 'custom_' . $customFieldId : $value;
-            $tmpContactField[trim($value)] = CRM_Utils_Array::value(trim($value), $contactFields);
+            $tmpContactField[trim($value)] = $contactFields[trim($value)] ?? NULL;
             if (!$status) {
               $title = $tmpContactField[trim($value)]['title'] . ' (match to contact)';
             }
@@ -678,7 +678,7 @@ INNER JOIN  civicrm_price_field field       ON ( value.price_field_id = field.id
           }
         }
       }
-      $extIdentifier = CRM_Utils_Array::value('external_identifier', $contactFields);
+      $extIdentifier = $contactFields['external_identifier'] ?? NULL;
       if ($extIdentifier) {
         $tmpContactField['external_identifier'] = $extIdentifier;
         $tmpContactField['external_identifier']['title'] = CRM_Utils_Array::value('title', $extIdentifier) . ' (match to contact)';
@@ -904,8 +904,8 @@ WHERE  civicrm_participant.id = {$participantId}
    * @return CRM_Contribute_BAO_Contribution
    */
   public static function checkDuplicate($input, &$duplicates) {
-    $eventId = CRM_Utils_Array::value('event_id', $input);
-    $contactId = CRM_Utils_Array::value('contact_id', $input);
+    $eventId = $input['event_id'] ?? NULL;
+    $contactId = $input['contact_id'] ?? NULL;
 
     $clause = [];
     $input = [];
@@ -1283,7 +1283,7 @@ UPDATE  civicrm_participant
         CRM_Event_BAO_Event::retrieve($eventParams, $eventDetails[$eventId]);
 
         //get default participant role.
-        $eventDetails[$eventId]['participant_role'] = CRM_Utils_Array::value($eventDetails[$eventId]['default_role_id'], $participantRoles);
+        $eventDetails[$eventId]['participant_role'] = $participantRoles[$eventDetails[$eventId]['default_role_id']] ?? NULL;
 
         //get the location info
         $locParams = ['entity_id' => $eventId, 'entity_table' => 'civicrm_event'];
@@ -1296,7 +1296,7 @@ UPDATE  civicrm_participant
 
     $emailType = NULL;
     $toStatus = $statusTypes[$toStatusId];
-    $fromStatus = CRM_Utils_Array::value($fromStatusId, $statusTypes);
+    $fromStatus = $statusTypes[$fromStatusId] ?? NULL;
 
     switch ($toStatus) {
       case 'Pending from waitlist':
@@ -1432,7 +1432,7 @@ UPDATE  civicrm_participant
     ) {
       return $mailSent;
     }
-    $toEmail = CRM_Utils_Array::value('email', $contactDetails);
+    $toEmail = $contactDetails['email'] ?? NULL;
     if ($toEmail) {
 
       $contactId = $participantValues['contact_id'];
@@ -1442,7 +1442,7 @@ UPDATE  civicrm_participant
       $checksumValue = NULL;
       if ($mailType == 'Confirm' && !$participantValues['registered_by_id']) {
         $checksumLife = 'inf';
-        $endDate = CRM_Utils_Array::value('end_date', $eventDetails);
+        $endDate = $eventDetails['end_date'] ?? NULL;
         if ($endDate) {
           $checksumLife = (CRM_Utils_Date::unixTime($endDate) - time()) / (60 * 60);
         }
@@ -1465,8 +1465,8 @@ UPDATE  civicrm_participant
             'domain' => $domainValues,
             'participant' => $participantValues,
             'event' => $eventDetails,
-            'paidEvent' => CRM_Utils_Array::value('is_monetary', $eventDetails),
-            'isShowLocation' => CRM_Utils_Array::value('is_show_location', $eventDetails),
+            'paidEvent' => $eventDetails['is_monetary'] ?? NULL,
+            'isShowLocation' => $eventDetails['is_show_location'] ?? NULL,
             'isAdditional' => $participantValues['registered_by_id'],
             'isExpired' => $mailType == 'Expired',
             'isConfirm' => $mailType == 'Confirm',
@@ -1475,8 +1475,8 @@ UPDATE  civicrm_participant
           'from' => $receiptFrom,
           'toName' => $participantName,
           'toEmail' => $toEmail,
-          'cc' => CRM_Utils_Array::value('cc_confirm', $eventDetails),
-          'bcc' => CRM_Utils_Array::value('bcc_confirm', $eventDetails),
+          'cc' => $eventDetails['cc_confirm'] ?? NULL,
+          'bcc' => $eventDetails['bcc_confirm'] ?? NULL,
         ]
       );
 
@@ -1645,7 +1645,7 @@ UPDATE  civicrm_participant
       $participantStatuses = CRM_Event_PseudoConstant::participantStatus();
     }
 
-    if (CRM_Utils_Array::value($participantStatuses[$oldStatusId], self::$_statusTransitionsRules) &&
+    if (!empty(self::$_statusTransitionsRules[$participantStatuses[$oldStatusId]]) &&
       in_array($participantStatuses[$newStatusId], self::$_statusTransitionsRules[$participantStatuses[$oldStatusId]])
     ) {
       $additionalParticipantIds = self::getAdditionalParticipantIds($participantId, TRUE, $oldStatusId);
diff --git a/civicrm/CRM/Event/BAO/ParticipantPayment.php b/civicrm/CRM/Event/BAO/ParticipantPayment.php
index 401fcd09da..106b2bbae3 100644
--- a/civicrm/CRM/Event/BAO/ParticipantPayment.php
+++ b/civicrm/CRM/Event/BAO/ParticipantPayment.php
@@ -31,7 +31,7 @@ class CRM_Event_BAO_ParticipantPayment extends CRM_Event_DAO_ParticipantPayment
    *   the partcipant payment record
    */
   public static function create(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('id', $ids));
+    $id = $params['id'] ?? $ids['id'] ?? NULL;
     if ($id) {
       CRM_Utils_Hook::pre('edit', 'ParticipantPayment', $id, $params);
     }
diff --git a/civicrm/CRM/Event/BAO/ParticipantStatusType.php b/civicrm/CRM/Event/BAO/ParticipantStatusType.php
index 51be2dfd3e..b0166dbff2 100644
--- a/civicrm/CRM/Event/BAO/ParticipantStatusType.php
+++ b/civicrm/CRM/Event/BAO/ParticipantStatusType.php
@@ -168,7 +168,7 @@ LEFT JOIN  civicrm_event event ON ( event.id = participant.event_id )
           continue;
         }
 
-        $expirationTime = CRM_Utils_Array::value('expiration_time', $values);
+        $expirationTime = $values['expiration_time'] ?? NULL;
         if ($expirationTime && array_key_exists($values['status_id'], $pendingStatuses)) {
 
           //get the expiration and registration pending time.
diff --git a/civicrm/CRM/Event/Cart/BAO/Cart.php b/civicrm/CRM/Event/Cart/BAO/Cart.php
index ac4090363f..1acabfe0a3 100644
--- a/civicrm/CRM/Event/Cart/BAO/Cart.php
+++ b/civicrm/CRM/Event/Cart/BAO/Cart.php
@@ -238,7 +238,7 @@ class CRM_Event_Cart_BAO_Cart extends CRM_Event_Cart_DAO_Cart {
    * @return mixed
    */
   public function get_event_in_cart_by_event_id($event_id) {
-    return CRM_Utils_Array::value($event_id, $this->events_in_carts);
+    return $this->events_in_carts[$event_id] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Event/Cart/BAO/MerParticipant.php b/civicrm/CRM/Event/Cart/BAO/MerParticipant.php
index 4ae7dc1062..553ab9578b 100644
--- a/civicrm/CRM/Event/Cart/BAO/MerParticipant.php
+++ b/civicrm/CRM/Event/Cart/BAO/MerParticipant.php
@@ -13,8 +13,20 @@
  * Class CRM_Event_Cart_BAO_MerParticipant
  */
 class CRM_Event_Cart_BAO_MerParticipant extends CRM_Event_BAO_Participant {
+
+  /**
+   * @var string
+   */
   public $email = NULL;
+
+  /**
+   * @var int
+   */
   public $contribution_id = NULL;
+
+  /**
+   * @var \CRM_Event_Cart_BAO_Cart
+   */
   public $cart = NULL;
 
   /**
@@ -26,7 +38,7 @@ class CRM_Event_Cart_BAO_MerParticipant extends CRM_Event_BAO_Participant {
     $a = (array) $participant;
     $this->copyValues($a);
 
-    $this->email = CRM_Utils_Array::value('email', $participant);
+    $this->email = $participant['email'] ?? NULL;
   }
 
   /**
@@ -37,25 +49,20 @@ class CRM_Event_Cart_BAO_MerParticipant extends CRM_Event_BAO_Participant {
    */
   public static function create(&$params) {
     $participantParams = [
-      'id' => CRM_Utils_Array::value('id', $params),
+      'id' => $params['id'] ?? NULL,
       'role_id' => self::get_attendee_role_id(),
       'status_id' => self::get_pending_in_cart_status_id(),
       'contact_id' => $params['contact_id'],
       'event_id' => $params['event_id'],
       'cart_id' => $params['cart_id'],
-      //XXX
-      //'registered_by_id'  =>
-      //'discount_amount'   =>
-      //'fee_level'         => $params['fee_level'],
     ];
     $participant = CRM_Event_BAO_Participant::create($participantParams);
 
     if (is_a($participant, 'CRM_Core_Error')) {
-      CRM_Core_Error::fatal(ts('There was an error creating a cart participant'));
+      throw new CRM_Core_Exception(ts('There was an error creating a cart participant'));
     }
 
     $mer_participant = new CRM_Event_Cart_BAO_MerParticipant($participant);
-
     return $mer_participant;
   }
 
diff --git a/civicrm/CRM/Event/Cart/Form/Cart.php b/civicrm/CRM/Event/Cart/Form/Cart.php
index 6e16ac7a31..048c2ba5b9 100644
--- a/civicrm/CRM/Event/Cart/Form/Cart.php
+++ b/civicrm/CRM/Event/Cart/Form/Cart.php
@@ -4,6 +4,10 @@
  * Class CRM_Event_Cart_Form_Cart
  */
 class CRM_Event_Cart_Form_Cart extends CRM_Core_Form {
+
+  /**
+   * @var \CRM_Event_Cart_BAO_Cart
+   */
   public $cart;
 
   public $_action;
@@ -13,7 +17,7 @@ class CRM_Event_Cart_Form_Cart extends CRM_Core_Form {
   public $participants;
 
   public function preProcess() {
-    $this->_action = CRM_Utils_Request::retrieve('action', 'String', $this, FALSE);
+    $this->_action = CRM_Utils_Request::retrieveValue('action', 'String');
     $this->_mode = 'live';
     $this->loadCart();
 
@@ -50,7 +54,7 @@ class CRM_Event_Cart_Form_Cart extends CRM_Core_Form {
         $participant_params = [
           'cart_id' => $this->cart->id,
           'event_id' => $event_in_cart->event_id,
-          'contact_id' => self::find_or_create_contact($this->getContactID()),
+          'contact_id' => self::find_or_create_contact(),
         ];
         $participant = CRM_Event_Cart_BAO_MerParticipant::create($participant_params);
         $participant->save();
@@ -93,22 +97,14 @@ class CRM_Event_Cart_Form_Cart extends CRM_Core_Form {
   }
 
   /**
-   * @return bool
-   */
-  public static function is_administrator() {
-    global $user;
-    return CRM_Core_Permission::check('administer CiviCRM');
-  }
-
-  /**
-   * @return mixed
+   * @return int
+   * @throws \CRM_Core_Exception
    */
   public function getContactID() {
-    //XXX when do we query 'cid' ?
-    $tempID = CRM_Utils_Request::retrieve('cid', 'Positive', $this);
+    $tempID = CRM_Utils_Request::retrieveValue('cid', 'Positive');
 
     //check if this is a checksum authentication
-    $userChecksum = CRM_Utils_Request::retrieve('cs', 'String', $this);
+    $userChecksum = CRM_Utils_Request::retrieveValue('cs', 'String');
     if ($userChecksum) {
       //check for anonymous user.
       $validUser = CRM_Contact_BAO_Contact_Utils::validChecksum($tempID, $userChecksum);
@@ -132,21 +128,20 @@ class CRM_Event_Cart_Form_Cart extends CRM_Core_Form {
   }
 
   /**
-   * @param int $registeringContactID
    * @param array $fields
    *
    * @return int|mixed|null
    */
-  public static function find_or_create_contact($registeringContactID = NULL, $fields = []) {
+  public static function find_or_create_contact($fields = []) {
     $contact_id = self::find_contact($fields);
 
     if ($contact_id) {
       return $contact_id;
     }
     $contact_params = [
-      'email-Primary' => CRM_Utils_Array::value('email', $fields, NULL),
-      'first_name' => CRM_Utils_Array::value('first_name', $fields, NULL),
-      'last_name' => CRM_Utils_Array::value('last_name', $fields, NULL),
+      'email-Primary' => $fields['email'] ?? NULL,
+      'first_name' => $fields['first_name'] ?? NULL,
+      'last_name' => $fields['last_name'] ?? NULL,
       'is_deleted' => CRM_Utils_Array::value('is_deleted', $fields, TRUE),
     ];
     $no_fields = [];
diff --git a/civicrm/CRM/Event/Cart/Form/Checkout/ConferenceEvents.php b/civicrm/CRM/Event/Cart/Form/Checkout/ConferenceEvents.php
index 57e28b7045..8f68053a1d 100644
--- a/civicrm/CRM/Event/Cart/Form/Checkout/ConferenceEvents.php
+++ b/civicrm/CRM/Event/Cart/Form/Checkout/ConferenceEvents.php
@@ -128,7 +128,7 @@ EOS;
     foreach ($this->events_by_slot as $slot_name => $events) {
       $slot_index++;
       $field_name = "slot_$slot_index";
-      $session_event_id = CRM_Utils_Array::value($field_name, $params, NULL);
+      $session_event_id = $params[$field_name] ?? NULL;
       if (!$session_event_id) {
         continue;
       }
diff --git a/civicrm/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.php b/civicrm/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.php
index 72bcc8f921..5067ccf33d 100644
--- a/civicrm/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.php
+++ b/civicrm/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.php
@@ -195,7 +195,6 @@ class CRM_Event_Cart_Form_Checkout_ParticipantsAndPrices extends CRM_Event_Cart_
     foreach ($this->cart->get_main_event_participants() as $participant) {
       $form = $participant->get_form();
       if (empty($participant->email)
-        && !CRM_Event_Cart_Form_Cart::is_administrator()
         && ($participant->get_participant_index() == 1)
         && ($this->cid != 0)
       ) {
@@ -210,7 +209,7 @@ class CRM_Event_Cart_Form_Checkout_ParticipantsAndPrices extends CRM_Event_Cart_
         && $participant->contact_id == self::getContactID()
       ) {
         $participant->email = NULL;
-        $participant->contact_id = self::find_or_create_contact($this->getContactID());
+        $participant->contact_id = self::find_or_create_contact();
       }
       $defaults += $form->setDefaultValues();
       //Set price defaults if any
@@ -221,7 +220,7 @@ class CRM_Event_Cart_Form_Checkout_ParticipantsAndPrices extends CRM_Event_Cart_
           $price_sets = CRM_Price_BAO_PriceSet::getSetDetail($price_set_id, TRUE, TRUE);
           $price_set  = $price_sets[$price_set_id];
           foreach ($price_set['fields'] as $field) {
-            $options = CRM_Utils_Array::value('options', $field);
+            $options = $field['options'] ?? NULL;
             if (!is_array($options)) {
               continue;
             }
@@ -258,7 +257,7 @@ class CRM_Event_Cart_Form_Checkout_ParticipantsAndPrices extends CRM_Event_Cart_
           $contact_id = $email_to_contact_id[$fields['email']];
         }
         else {
-          $contact_id = self::find_or_create_contact($this->getContactID(), $fields);
+          $contact_id = self::find_or_create_contact($fields);
           $email_to_contact_id[$fields['email']] = $contact_id;
         }
 
diff --git a/civicrm/CRM/Event/Cart/Form/Checkout/Payment.php b/civicrm/CRM/Event/Cart/Form/Checkout/Payment.php
index cf67ad1be4..5f0aa4100c 100644
--- a/civicrm/CRM/Event/Cart/Form/Checkout/Payment.php
+++ b/civicrm/CRM/Event/Cart/Form/Checkout/Payment.php
@@ -17,6 +17,11 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
   public $is_pay_later = FALSE;
   public $pay_later_receipt;
 
+  /**
+   * @var array
+   */
+  protected $_values = [];
+
   /**
    * Register a participant.
    *
@@ -25,23 +30,17 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
    * @param CRM_Event_BAO_Event $event
    *
    * @return mixed
+   * @throws \CiviCRM_API3_Exception
    */
   public function registerParticipant($params, &$participant, $event) {
-    $transaction = new CRM_Core_Transaction();
-
-    // handle register date CRM-4320
-    $registerDate = date('YmdHis');
     $participantParams = [
       'id' => $participant->id,
       'event_id' => $event->id,
-      'register_date' => $registerDate,
+      'register_date' => date('YmdHis'),
       'source' => CRM_Utils_Array::value('participant_source', $params, $this->description),
-      //'fee_level'     => $participant->fee_level,
       'is_pay_later' => $this->is_pay_later,
       'fee_amount' => CRM_Utils_Array::value('amount', $params, 0),
-      //XXX why is this a ref to participant and not contact?:
-      //'registered_by_id' => $this->payer_contact_id,
-      'fee_currency' => CRM_Utils_Array::value('currencyID', $params),
+      'fee_currency' => $params['currencyID'] ?? NULL,
     ];
 
     if ($participant->must_wait) {
@@ -53,30 +52,17 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
     else {
       $participant_status = 'Registered';
     }
-    $participant_statuses = CRM_Event_PseudoConstant::participantStatus();
-    $participantParams['status_id'] = array_search($participant_status, $participant_statuses);
-    $participant_status_label = CRM_Utils_Array::value($participantParams['status_id'], CRM_Event_PseudoConstant::participantStatus(NULL, NULL, 'label'));
-    $participantParams['participant_status'] = $participant_status_label;
+    $participantParams['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Event_BAO_Participant', 'status_id', $participant_status);
+    $participantParams['participant_status'] = CRM_Core_PseudoConstant::getLabel('CRM_Event_BAO_Participant', 'status_id', $participantParams['status_id']);
 
     $this->assign('isOnWaitlist', $participant->must_wait);
 
+    $participantParams['is_test'] = 0;
     if ($this->_action & CRM_Core_Action::PREVIEW || CRM_Utils_Array::value('mode', $params) == 'test') {
       $participantParams['is_test'] = 1;
     }
-    else {
-      $participantParams['is_test'] = 0;
-    }
 
-    if (self::is_administrator()) {
-      if (!empty($params['note'])) {
-        $note_params = [
-          'participant_id' => $participant->id,
-          'contact_id' => self::getContactID(),
-          'note' => $params['note'],
-        ];
-        CRM_Event_BAO_Participant::update_note($note_params);
-      }
-    }
+    $transaction = new CRM_Core_Transaction();
 
     $participant->copyValues($participantParams);
     $participant->save();
@@ -138,54 +124,46 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
     $pay_later_text = "";
     $this->pay_later_receipt = "";
     foreach ($this->cart->get_main_events_in_carts() as $event_in_cart) {
-      if ($payment_processor_id == NULL && $event_in_cart->event->payment_processor != NULL) {
+      if ($payment_processor_id === NULL && $event_in_cart->event->payment_processor !== NULL) {
         $payment_processor_id = $event_in_cart->event->payment_processor;
         $this->financial_type_id = $event_in_cart->event->financial_type_id;
+        $this->_values['currency'] = $event_in_cart->event->currency;
       }
       else {
-        if ($event_in_cart->event->payment_processor != NULL && $event_in_cart->event->payment_processor != $payment_processor_id) {
+        if ($event_in_cart->event->payment_processor !== NULL && $event_in_cart->event->payment_processor !== $payment_processor_id) {
           CRM_Core_Error::statusBounce(ts('When registering for multiple events all events must use the same payment processor. '));
         }
       }
-      if (!$event_in_cart->event->is_pay_later) {
+      if ($payment_processor_id) {
         $can_pay_later = FALSE;
       }
-      else {
+      elseif ($event_in_cart->event->is_pay_later) {
         //XXX
         $pay_later_text = $event_in_cart->event->pay_later_text;
         $this->pay_later_receipt = $event_in_cart->event->pay_later_receipt;
       }
+      else {
+        CRM_Core_Error::statusBounce(ts('A payment processor must be selected for this event registration page, or the event must be configured to give users the option to pay later (contact the site administrator for assistance).'));
+      }
     }
 
-    if ($payment_processor_id == NULL) {
-      CRM_Core_Error::statusBounce(ts('A payment processor must be selected for this event registration page, or the event must be configured to give users the option to pay later (contact the site administrator for assistance).'));
-    }
-
-    $this->_paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getPayment($payment_processor_id, $this->_mode);
-    $this->assign('paymentProcessor', $this->_paymentProcessor);
-
-    CRM_Core_Payment_Form::buildPaymentForm($this, $this->_paymentProcessor, FALSE, FALSE);
-
-    if ($can_pay_later || self::is_administrator()) {
-      $this->addElement('checkbox', 'is_pay_later',
-        $pay_later_text
-      );
-      $this->addElement('checkbox', 'payment_completed',
-        ts('Payment Completed')
-      );
+    if ($can_pay_later) {
+      $this->addElement('checkbox', 'is_pay_later', $pay_later_text);
+      $this->addElement('checkbox', 'payment_completed', ts('Payment Completed'));
       $this->assign('pay_later_instructions', $this->pay_later_receipt);
     }
-
-    // Event Cart does not support multiple payment processors
-    // so we cannot call $this->preProcessPaymentOptions();
-    CRM_Financial_Form_Payment::addCreditCardJs($this->_paymentProcessor['id']);
+    else {
+      $this->_paymentProcessorIDs = [$payment_processor_id];
+      $this->assignPaymentProcessor(FALSE);
+      CRM_Core_Payment_Form::buildPaymentForm($this, $this->_paymentProcessor, FALSE, FALSE);
+    }
+    $this->assign('currency', $this->getCurrency());
   }
 
   /**
    * Build QuickForm.
    */
   public function buildQuickForm() {
-
     $this->line_items = [];
     $this->sub_total = 0;
     $this->_price_values = $this->getValuesForPage('ParticipantsAndPrices');
@@ -207,13 +185,11 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
     $buttons = [];
     $buttons[] = [
       'name' => ts('Go Back'),
-      'spacing' => '&nbsp;&nbsp;&nbsp;&nbsp',
       'type' => 'back',
     ];
     $buttons[] = [
       'isDefault' => TRUE,
       'name' => ts('Complete Transaction'),
-      'spacing' => '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
       'type' => 'next',
     ];
 
@@ -221,23 +197,8 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
       $this->add('text', 'billing_contact_email', 'Billing Email', '', TRUE);
       $this->assign('collect_billing_email', TRUE);
     }
-    if (self::is_administrator()) {
-      $this->add('textarea', 'note', 'Note');
-      $this->add('text', 'source', 'Source', ['size' => 80]);
-      $instruments = [];
-      CRM_Core_OptionGroup::getAssoc('payment_instrument', $instruments, TRUE);
-      $options = [];
-      foreach ($instruments as $type) {
-        $options[] = $this->createElement('radio', NULL, '', $type['label'], $type['value']);
-      }
-      $this->addGroup($options, 'payment_type', ts("Alternative Payment Type"));
-      $this->add('text', 'check_number', ts('Check No.'), ['size' => 20]);
-      $this->addElement('checkbox', 'is_pending', ts('Create a pending registration'));
 
-      $this->assign('administrator', TRUE);
-    }
     $this->addButtons($buttons);
-
     $this->addFormRule(['CRM_Event_Cart_Form_Checkout_Payment', 'formRule'], $this);
 
     if ($this->payment_required) {
@@ -266,9 +227,8 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
       $price_set = $price_sets[$price_set_id];
       $price_set_amount = [];
       CRM_Price_BAO_PriceSet::processAmount($price_set['fields'], $event_price_values, $price_set_amount);
-      $discountCode = $this->_price_values['discountcode'];
-      if (!empty($discountCode)) {
-        $ret = $this->apply_discount($discountCode, $price_set_amount, $cost, $event_in_cart->event_id);
+      if (!empty($this->_price_values['discountcode'])) {
+        $ret = $this->apply_discount($this->_price_values['discountcode'], $price_set_amount, $cost, $event_in_cart->event_id);
         if ($ret == FALSE) {
           $cost = $event_price_values['amount'];
         }
@@ -407,39 +367,23 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
    *
    * @param array $fields
    * @param array $files
-   * @param CRM_Core_Form $self
+   * @param CRM_Core_Form $form
    *
    * @return array|bool
    */
-  public static function formRule($fields, $files, $self) {
+  public static function formRule($fields, $files, $form) {
     $errors = [];
 
-    if ($self->payment_required && empty($self->_submitValues['is_pay_later'])) {
-      CRM_Core_Form::validateMandatoryFields($self->_fields, $fields, $errors);
+    if ($form->payment_required && empty($form->_submitValues['is_pay_later'])) {
+      CRM_Core_Form::validateMandatoryFields($form->_fields, $fields, $errors);
 
       // validate payment instrument values (e.g. credit card number)
-      CRM_Core_Payment_Form::validatePaymentInstrument($self->_paymentProcessor['id'], $fields, $errors, NULL);
+      CRM_Core_Payment_Form::validatePaymentInstrument($form->_paymentProcessor['id'], $fields, $errors, NULL);
     }
 
     return empty($errors) ? TRUE : $errors;
   }
 
-  /**
-   * Validate form.
-   *
-   * @todo this should surely go! Test & remove.
-   * @return bool
-   */
-  public function validate() {
-    if ($this->is_pay_later) {
-      $this->_fields['credit_card_number']['is_required'] = FALSE;
-      $this->_fields['cvv2']['is_required'] = FALSE;
-      $this->_fields['credit_card_exp_date']['is_required'] = FALSE;
-      $this->_fields['credit_card_type']['is_required'] = FALSE;
-    }
-    return parent::validate();
-  }
-
   /**
    * Pre-process form.
    */
@@ -454,12 +398,13 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
    * Post process form.
    */
   public function postProcess() {
-
-    $transaction = new CRM_Core_Transaction();
     $trxnDetails = NULL;
     $params = $this->_submitValues;
 
     $main_participants = $this->cart->get_main_event_participants();
+
+    $transaction = new CRM_Core_Transaction();
+
     foreach ($main_participants as $participant) {
       $defaults = [];
       $ids = ['contact_id' => $participant->contact_id];
@@ -470,7 +415,7 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
 
     $trxn_prefix = 'VR';
     if (array_key_exists('billing_contact_email', $params)) {
-      $this->payer_contact_id = self::find_or_create_contact($this->getContactID(), [
+      $this->payer_contact_id = self::find_or_create_contact([
         'email' => $params['billing_contact_email'],
         'first_name' => $params['billing_first_name'],
         'last_name' => $params['billing_last_name'],
@@ -614,7 +559,7 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
     $trxnDetails = [
       'trxn_id' => $result['trxn_id'],
       'trxn_date' => $result['now'],
-      'currency' => CRM_Utils_Array::value('currencyID', $result),
+      'currency' => $result['currencyID'] ?? NULL,
     ];
     return $trxnDetails;
   }
@@ -630,10 +575,6 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
    * @throws Exception
    */
   public function record_contribution(&$mer_participant, &$params, $event) {
-    if (self::is_administrator() && !empty($params['payment_type'])) {
-      $params['payment_instrument_id'] = $params['payment_type'];
-    }
-
     if ($this->payer_contact_id) {
       $payer = $this->payer_contact_id;
     }
@@ -653,12 +594,12 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
       'net_amount' => $params['amount'],
       'invoice_id' => "{$params['invoiceID']}-{$this->sub_trxn_index}",
       'trxn_id' => "{$params['trxn_id']}-{$this->sub_trxn_index}",
-      'currency' => CRM_Utils_Array::value('currencyID', $params),
+      'currency' => $params['currencyID'] ?? NULL,
       'source' => $event->title,
       'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
       'contribution_status_id' => $params['contribution_status_id'],
       'payment_instrument_id' => $params['payment_instrument_id'],
-      'check_number' => CRM_Utils_Array::value('check_number', $params),
+      'check_number' => $params['check_number'] ?? NULL,
       'skipLineItem' => 1,
     ];
 
@@ -700,16 +641,14 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
    * @return array
    */
   public function setDefaultValues() {
-
     $defaults = parent::setDefaultValues();
 
-    $config = CRM_Core_Config::singleton();
     $default_country = new CRM_Core_DAO_Country();
     $default_country->iso_code = CRM_Core_BAO_Country::defaultContactCountry();
     $default_country->find(TRUE);
     $defaults["billing_country_id-{$this->_bltID}"] = $default_country->id;
 
-    if (self::getContactID() && !self::is_administrator()) {
+    if (self::getContactID()) {
       $params = ['id' => self::getContactID()];
       $contact = CRM_Contact_BAO_Contact::retrieve($params, $defaults);
 
@@ -755,24 +694,25 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
    * @param int $event_id
    *
    * @return bool
+   * @throws \CiviCRM_API3_Exception
    */
   protected function apply_discount($discountCode, &$price_set_amount, &$cost, $event_id) {
-    //need better way to determine if cividiscount installed
-    $autoDiscount = [];
-    $sql = "select is_active from civicrm_extension where name like 'CiviDiscount%'";
-    $dao = CRM_Core_DAO::executeQuery($sql, '');
-    while ($dao->fetch()) {
-      if ($dao->is_active != '1') {
-        return FALSE;
-      }
+    $extensions = civicrm_api3('Extension', 'get', [
+      'full_name' => 'org.civicrm.module.cividiscount',
+    ]);
+    if (empty($extensions['id']) || ($extensions['values'][$extensions['id']]['status'] !== 'installed')) {
+      return FALSE;
     }
+
+    $autoDiscount = [];
+
     $discounted_priceset_ids = _cividiscount_get_discounted_priceset_ids();
     $discounts = _cividiscount_get_discounts();
 
     $stat = FALSE;
     foreach ($discounts as $key => $discountValue) {
       if ($key == $discountCode) {
-        $events = CRM_Utils_Array::value('events', $discountValue);
+        $events = $discountValue['events'] ?? NULL;
         $evt_ids = implode(",", $events);
         if ($evt_ids == "0" || strpos($evt_ids, $event_id)) {
           $event_match = TRUE;
@@ -801,7 +741,7 @@ class CRM_Event_Cart_Form_Checkout_Payment extends CRM_Event_Cart_Form_Cart {
       if ($discountValue['is_active'] == TRUE && ($discountValue['count_max'] == 0 || ($discountValue['count_max'] > $discountValue['count_use'])) && $active1 == TRUE && $active2 == TRUE && $event_match == TRUE) {
         foreach ($price_set_amount as $key => $price) {
           if (array_search($price['price_field_value_id'], $discounted_priceset_ids) != NULL) {
-            $discounted = _cividiscount_calc_discount($price['line_total'], $price['label'], $discountValue, $autoDiscount, "USD");
+            $discounted = _cividiscount_calc_discount($price['line_total'], $price['label'], $discountValue, $autoDiscount, $this->getCurrency());
             $price_set_amount[$key]['line_total'] = $discounted[0];
             $cost += $discounted[0];
             $price_set_amount[$key]['label'] = $discounted[1];
diff --git a/civicrm/CRM/Event/Cart/Form/MerParticipant.php b/civicrm/CRM/Event/Cart/Form/MerParticipant.php
index ef45df9b54..6a4d5c07d8 100644
--- a/civicrm/CRM/Event/Cart/Form/MerParticipant.php
+++ b/civicrm/CRM/Event/Cart/Form/MerParticipant.php
@@ -2,8 +2,13 @@
 
 /**
  * Class CRM_Event_Cart_Form_MerParticipant
+ * @fixme What is a MerParticipant!
  */
 class CRM_Event_Cart_Form_MerParticipant extends CRM_Core_Form {
+
+  /**
+   * @var \CRM_Event_BAO_Participant
+   */
   public $participant = NULL;
 
   /**
@@ -11,21 +16,17 @@ class CRM_Event_Cart_Form_MerParticipant extends CRM_Core_Form {
    */
   public function __construct($participant) {
     parent::__construct();
-    //XXX
     $this->participant = $participant;
   }
 
   /**
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form $form
    */
   public function appendQuickForm(&$form) {
     $textarea_size = ['size' => 30, 'maxlength' => 60];
     $form->add('text', $this->email_field_name(), ts('Email Address'), $textarea_size, TRUE);
 
-    list(
-      $custom_fields_pre,
-      $custom_fields_post
-      ) = $this->get_participant_custom_data_fields($this->participant->event_id);
+    list($custom_fields_pre, $custom_fields_post) = $this->get_participant_custom_data_fields();
 
     foreach ($custom_fields_pre as $key => $field) {
       CRM_Core_BAO_UFGroup::buildProfile($form, $field, CRM_Profile_Form::MODE_CREATE, $this->participant->id);
@@ -58,6 +59,7 @@ class CRM_Event_Cart_Form_MerParticipant extends CRM_Core_Form {
 
   /**
    * @return array
+   * @throws \CRM_Core_Exception
    */
   public function get_participant_custom_data_fields() {
     list($custom_pre_id, $custom_post_id) = self::get_profile_groups($this->participant->event_id);
@@ -108,8 +110,7 @@ class CRM_Event_Cart_Form_MerParticipant extends CRM_Core_Form {
   }
 
   /**
-   * XXX poor name.
-   * @param $participant
+   * @param \CRM_Event_BAO_Participant $participant
    *
    * @return CRM_Event_Cart_Form_MerParticipant
    */
@@ -119,12 +120,13 @@ class CRM_Event_Cart_Form_MerParticipant extends CRM_Core_Form {
 
   /**
    * @return array
+   * @throws \CRM_Core_Exception
    */
   public function setDefaultValues() {
     $defaults = [
       $this->html_field_name('email') => $this->participant->email,
     ];
-    list($custom_fields_pre, $custom_fields_post) = $this->get_participant_custom_data_fields($this->participant->event_id);
+    list($custom_fields_pre, $custom_fields_post) = $this->get_participant_custom_data_fields();
     $all_fields = $custom_fields_pre + $custom_fields_post;
     $flat = [];
     CRM_Core_BAO_UFGroup::setProfileDefaults($this->participant->contact_id, $all_fields, $flat);
diff --git a/civicrm/CRM/Event/Cart/Page/AddToCart.php b/civicrm/CRM/Event/Cart/Page/AddToCart.php
index e9d9b60c36..6f82018486 100644
--- a/civicrm/CRM/Event/Cart/Page/AddToCart.php
+++ b/civicrm/CRM/Event/Cart/Page/AddToCart.php
@@ -5,31 +5,34 @@
  */
 class CRM_Event_Cart_Page_AddToCart extends CRM_Core_Page {
 
+  use CRM_Core_Page_EntityPageTrait;
+
   /**
    * This function takes care of all the things common to all pages.
    *
    * This typically involves assigning the appropriate smarty variables :)
    */
   public function run() {
-    $transaction = new CRM_Core_Transaction();
-
-    $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE);
+    $this->_id = CRM_Utils_Request::retrieveValue('id', 'Positive', NULL);
+    if (empty($this->_id)) {
+      CRM_Core_Error::statusBounce(ts('Missing required parameters'), NULL, ts('Add to cart'));
+    }
     if (!CRM_Core_Permission::event(CRM_Core_Permission::VIEW, $this->_id, 'register for events')) {
       CRM_Core_Error::statusBounce(ts('You do not have permission to register for this event'));
     }
 
+    $transaction = new CRM_Core_Transaction();
     $cart = CRM_Event_Cart_BAO_Cart::find_or_create_for_current_session();
     $event_in_cart = $cart->add_event($this->_id);
+    $transaction->commit();
 
-    $url = CRM_Utils_System::url('civicrm/event/view_cart');
-    CRM_Utils_System::setUFMessage(ts("<b>%1</b> has been added to your cart. <a href='%2'>View your cart.</a>", [
+    $cartUrl = CRM_Utils_System::url('civicrm/event/view_cart');
+    CRM_Utils_System::setUFMessage(ts("<b>%1</b> has been added to your <a href='%2'>cart</a>.", [
       1 => $event_in_cart->event->title,
-      2 => $url,
+      2 => $cartUrl,
     ]));
 
-    $transaction->commit();
-
-    return CRM_Utils_System::redirect($_SERVER['HTTP_REFERER']);
+    CRM_Utils_System::redirect($_SERVER['HTTP_REFERER']);
   }
 
 }
diff --git a/civicrm/CRM/Event/Form/EventFees.php b/civicrm/CRM/Event/Form/EventFees.php
index 192e54008e..14be8ec5f6 100644
--- a/civicrm/CRM/Event/Form/EventFees.php
+++ b/civicrm/CRM/Event/Form/EventFees.php
@@ -254,8 +254,8 @@ class CRM_Event_Form_EventFees {
 
       $priceFields = $htmlTypes = $optionValues = [];
       foreach ($lineItems[$participantID] as $lineId => $items) {
-        $priceFieldId = CRM_Utils_Array::value('price_field_id', $items);
-        $priceOptionId = CRM_Utils_Array::value('price_field_value_id', $items);
+        $priceFieldId = $items['price_field_id'] ?? NULL;
+        $priceOptionId = $items['price_field_value_id'] ?? NULL;
         if ($priceFieldId && $priceOptionId) {
           $priceFields[$priceFieldId][] = $priceOptionId;
         }
@@ -277,7 +277,7 @@ SELECT  id, html_type
 
       foreach ($lineItems[$participantID] as $lineId => $items) {
         $fieldId = $items['price_field_id'];
-        $htmlType = CRM_Utils_Array::value($fieldId, $htmlTypes);
+        $htmlType = $htmlTypes[$fieldId] ?? NULL;
         if (!$htmlType) {
           continue;
         }
@@ -286,7 +286,7 @@ SELECT  id, html_type
           $defaults["price_{$fieldId}"] = $items['qty'];
         }
         else {
-          $fieldOptValues = CRM_Utils_Array::value($fieldId, $priceFields);
+          $fieldOptValues = $priceFields[$fieldId] ?? NULL;
           if (!is_array($fieldOptValues)) {
             continue;
           }
diff --git a/civicrm/CRM/Event/Form/ManageEvent.php b/civicrm/CRM/Event/Form/ManageEvent.php
index 19d2c816a1..6b027289aa 100644
--- a/civicrm/CRM/Event/Form/ManageEvent.php
+++ b/civicrm/CRM/Event/Form/ManageEvent.php
@@ -130,7 +130,7 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
         CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
       }
 
-      $participantListingID = CRM_Utils_Array::value('participant_listing_id', $eventInfo);
+      $participantListingID = $eventInfo['participant_listing_id'] ?? NULL;
       //CRM_Core_DAO::getFieldValue( 'CRM_Event_DAO_Event', $this->_id, 'participant_listing_id' );
       if ($participantListingID) {
         $participantListingURL = CRM_Utils_System::url('civicrm/event/participant',
@@ -147,7 +147,7 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
 
     // figure out whether we’re handling an event or an event template
     if ($this->_id) {
-      $this->_isTemplate = CRM_Utils_Array::value('is_template', $eventInfo);
+      $this->_isTemplate = $eventInfo['is_template'] ?? NULL;
     }
     elseif ($this->_action & CRM_Core_Action::ADD) {
       $this->_isTemplate = CRM_Utils_Request::retrieve('is_template', 'Boolean', $this);
@@ -250,7 +250,7 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
       $params = ['id' => $this->_id];
       CRM_Event_BAO_Event::retrieve($params, $defaults);
 
-      $this->_campaignID = CRM_Utils_Array::value('campaign_id', $defaults);
+      $this->_campaignID = $defaults['campaign_id'] ?? NULL;
     }
     elseif ($this->_templateId) {
       $params = ['id' => $this->_templateId];
@@ -275,7 +275,7 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
   public function buildQuickForm() {
     $session = CRM_Core_Session::singleton();
 
-    $this->_cancelURL = CRM_Utils_Array::value('cancelURL', $_POST);
+    $this->_cancelURL = $_POST['cancelURL'] ?? NULL;
 
     if (!$this->_cancelURL) {
       if ($this->_isTemplate) {
@@ -372,8 +372,8 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
       $config = CRM_Core_Config::singleton();
       if (in_array('CiviCampaign', $config->enableComponents)) {
         $values = $this->controller->exportValues($this->_name);
-        $newCampaignID = CRM_Utils_Array::value('campaign_id', $values);
-        $eventID = CRM_Utils_Array::value('id', $values);
+        $newCampaignID = $values['campaign_id'] ?? NULL;
+        $eventID = $values['id'] ?? NULL;
         if ($eventID && $this->_campaignID != $newCampaignID) {
           CRM_Event_BAO_Event::updateParticipantCampaignID($eventID, $newCampaignID);
         }
diff --git a/civicrm/CRM/Event/Form/ManageEvent/EventInfo.php b/civicrm/CRM/Event/Form/ManageEvent/EventInfo.php
index c72fc7e27a..a820295fa1 100644
--- a/civicrm/CRM/Event/Form/ManageEvent/EventInfo.php
+++ b/civicrm/CRM/Event/Form/ManageEvent/EventInfo.php
@@ -215,8 +215,8 @@ class CRM_Event_Form_ManageEvent_EventInfo extends CRM_Event_Form_ManageEvent {
     $params = array_merge($this->controller->exportValues($this->_name), $this->_submitValues);
 
     //format params
-    $params['start_date'] = CRM_Utils_Array::value('start_date', $params);
-    $params['end_date'] = CRM_Utils_Array::value('end_date', $params);
+    $params['start_date'] = $params['start_date'] ?? NULL;
+    $params['end_date'] = $params['end_date'] ?? NULL;
     $params['has_waitlist'] = CRM_Utils_Array::value('has_waitlist', $params, FALSE);
     $params['is_map'] = CRM_Utils_Array::value('is_map', $params, FALSE);
     $params['is_active'] = CRM_Utils_Array::value('is_active', $params, FALSE);
diff --git a/civicrm/CRM/Event/Form/ManageEvent/Fee.php b/civicrm/CRM/Event/Form/ManageEvent/Fee.php
index c09d9c9199..1462a3697c 100644
--- a/civicrm/CRM/Event/Form/ManageEvent/Fee.php
+++ b/civicrm/CRM/Event/Form/ManageEvent/Fee.php
@@ -476,7 +476,7 @@ class CRM_Event_Form_ManageEvent_Fee extends CRM_Event_Form_ManageEvent {
           }
         }
 
-        $default = CRM_Utils_Array::value('default', $values);
+        $default = $values['default'] ?? NULL;
         if ($default && !in_array($default, $optionKeys)) {
           $errors['default'] = ts('Please select an appropriate option as default.');
         }
@@ -577,9 +577,9 @@ class CRM_Event_Form_ManageEvent_Fee extends CRM_Event_Form_ManageEvent {
       }
       else {
         // if there are label / values, create custom options for them
-        $labels = CRM_Utils_Array::value('label', $params);
-        $values = CRM_Utils_Array::value('value', $params);
-        $default = CRM_Utils_Array::value('default', $params);
+        $labels = $params['label'] ?? NULL;
+        $values = $params['value'] ?? NULL;
+        $default = $params['default'] ?? NULL;
         $options = [];
         if (!CRM_Utils_System::isNull($labels) && !CRM_Utils_System::isNull($values)) {
           for ($i = 1; $i < self::NUM_OPTION; $i++) {
@@ -624,7 +624,7 @@ class CRM_Event_Form_ManageEvent_Fee extends CRM_Event_Form_ManageEvent {
                     unset($params['price_field_value'][$arrayID]);
                   }
                 }
-                $fieldParams['id'] = CRM_Utils_Array::value('price_field_id', $params);
+                $fieldParams['id'] = $params['price_field_id'] ?? NULL;
                 $fieldParams['option_id'] = $params['price_field_value'];
 
                 $priceSet = new CRM_Price_BAO_PriceSet();
@@ -654,9 +654,9 @@ class CRM_Event_Form_ManageEvent_Fee extends CRM_Event_Form_ManageEvent {
         if (CRM_Utils_Array::value('is_discount', $params) == 1) {
           // if there are discounted set of label / values,
           // create custom options for them
-          $labels = CRM_Utils_Array::value('discounted_label', $params);
-          $values = CRM_Utils_Array::value('discounted_value', $params);
-          $default = CRM_Utils_Array::value('discounted_default', $params);
+          $labels = $params['discounted_label'] ?? NULL;
+          $values = $params['discounted_value'] ?? NULL;
+          $default = $params['discounted_default'] ?? NULL;
 
           if (!CRM_Utils_System::isNull($labels) && !CRM_Utils_System::isNull($values)) {
             for ($j = 1; $j <= self::NUM_DISCOUNT; $j++) {
diff --git a/civicrm/CRM/Event/Form/ManageEvent/Registration.php b/civicrm/CRM/Event/Form/ManageEvent/Registration.php
index f3244105e5..9cbf60c8aa 100644
--- a/civicrm/CRM/Event/Form/ManageEvent/Registration.php
+++ b/civicrm/CRM/Event/Form/ManageEvent/Registration.php
@@ -102,7 +102,7 @@ class CRM_Event_Form_ManageEvent_Registration extends CRM_Event_Form_ManageEvent
 
       // Set event registration as the default profile if none selected
       if (!$defaults['custom_pre_id'] && count($defaults['custom_post']) == 0) {
-        $defaults['custom_pre_id'] = CRM_Utils_Array::value('id', $eventRegistrationIdDefaults);
+        $defaults['custom_pre_id'] = $eventRegistrationIdDefaults['id'] ?? NULL;
       }
       if (isset($defaults['custom_post']) && is_numeric($defaults['custom_post'])) {
         $defaults['custom_post_id'] = $defaults['custom_post'];
@@ -499,7 +499,7 @@ class CRM_Event_Form_ManageEvent_Registration extends CRM_Event_Form_ManageEvent
         $profiles = CRM_Core_BAO_UFGroup::getProfiles($types);
 
         //check for additional custom pre profile
-        $additionalCustomPreId = CRM_Utils_Array::value('additional_custom_pre_id', $values);
+        $additionalCustomPreId = $values['additional_custom_pre_id'] ?? NULL;
         if (!empty($additionalCustomPreId)) {
           if (!($additionalCustomPreId == 'none')) {
             $customPreId = $additionalCustomPreId;
@@ -527,7 +527,7 @@ class CRM_Event_Form_ManageEvent_Registration extends CRM_Event_Form_ManageEvent
 
         // We don't have required Individual fields in the pre-custom profile, so now check the post-custom profile
         if ($isPreError) {
-          $additionalCustomPostId = CRM_Utils_Array::value('additional_custom_post_id', $values);
+          $additionalCustomPostId = $values['additional_custom_post_id'] ?? NULL;
           if (!empty($additionalCustomPostId)) {
             if (!($additionalCustomPostId == 'none')) {
               $customPostId = $additionalCustomPostId;
diff --git a/civicrm/CRM/Event/Form/Participant.php b/civicrm/CRM/Event/Form/Participant.php
index 57c853c2e7..d14b3dfe02 100644
--- a/civicrm/CRM/Event/Form/Participant.php
+++ b/civicrm/CRM/Event/Form/Participant.php
@@ -266,7 +266,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
    */
   public function preProcess() {
     parent::preProcess();
-    $this->_showFeeBlock = CRM_Utils_Array::value('eventId', $_GET);
+    $this->_showFeeBlock = $_GET['eventId'] ?? NULL;
     $this->assign('showFeeBlock', FALSE);
     $this->assign('feeBlockPaid', FALSE);
 
@@ -421,7 +421,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
 
     // when custom data is included in this page
     if (!empty($_POST['hidden_custom'])) {
-      $eventId = (int) CRM_Utils_Array::value('event_id', $_POST);
+      $eventId = (int) ($_POST['event_id'] ?? 0);
       // Custom data of type participant role
       // Note: Some earlier commits imply $_POST['role_id'] could be a comma separated string,
       //       not sure if that ever really happens
@@ -522,7 +522,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
     //setting default register date
     if ($this->_action == CRM_Core_Action::ADD) {
       $statuses = array_flip(CRM_Event_PseudoConstant::participantStatus());
-      $defaults[$this->_id]['status_id'] = CRM_Utils_Array::value('Registered', $statuses);
+      $defaults[$this->_id]['status_id'] = $statuses['Registered'] ?? NULL;
       if (!empty($defaults[$this->_id]['event_id'])) {
         $contributionTypeId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event',
           $defaults[$this->_id]['event_id'],
@@ -893,13 +893,13 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
     // for this event.
     if ($self->_single && ($self->_action & CRM_Core_Action::ADD)) {
       if ($self->_context == 'standalone') {
-        $contactId = CRM_Utils_Array::value('contact_id', $values);
+        $contactId = $values['contact_id'] ?? NULL;
       }
       else {
         $contactId = $self->_contactId;
       }
 
-      $eventId = CRM_Utils_Array::value('event_id', $values);
+      $eventId = $values['event_id'] ?? NULL;
 
       $event = new CRM_Event_DAO_Event();
       $event->id = $eventId;
@@ -1061,7 +1061,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
 
     // overwrite actual payment amount if entered
     if (!empty($params['total_amount'])) {
-      $contributionParams['total_amount'] = CRM_Utils_Array::value('total_amount', $params);
+      $contributionParams['total_amount'] = $params['total_amount'] ?? NULL;
     }
 
     // Retrieve the name and email of the current user - this will be the FROM for the receipt email
@@ -1337,7 +1337,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
         ];
 
         foreach ($recordContribution as $f) {
-          $contributionParams[$f] = CRM_Utils_Array::value($f, $this->_params);
+          $contributionParams[$f] = $this->_params[$f] ?? NULL;
           if ($f == 'trxn_id') {
             $this->assign('trxn_id', $contributionParams[$f]);
           }
@@ -1384,7 +1384,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
           }
         }
 
-        if (CRM_Utils_Array::value('tax_amount', $this->_params)) {
+        if (!empty($this->_params['tax_amount'])) {
           $contributionParams['tax_amount'] = $this->_params['tax_amount'];
         }
 
@@ -1548,13 +1548,13 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
           // fix amount for each of participants ( for bulk mode )
           $eventAmount = [];
           $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-          $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+          $invoicing = $invoiceSettings['invoicing'] ?? NULL;
           $totalTaxAmount = 0;
 
           //add dataArray in the receipts in ADD and UPDATE condition
           $dataArray = [];
           if ($this->_action & CRM_Core_Action::ADD) {
-            $line = isset($lineItem[0]) ? $lineItem[0] : [];
+            $line = $lineItem[0] ?? [];
           }
           elseif ($this->_action & CRM_Core_Action::UPDATE) {
             $line = $this->_values['line_items'];
@@ -1567,7 +1567,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
                   $dataArray[(string) $value['tax_rate']] = $dataArray[(string) $value['tax_rate']] + CRM_Utils_Array::value('tax_amount', $value);
                 }
                 else {
-                  $dataArray[(string) $value['tax_rate']] = CRM_Utils_Array::value('tax_amount', $value);
+                  $dataArray[(string) $value['tax_rate']] = $value['tax_amount'] ?? NULL;
                 }
               }
             }
@@ -1606,8 +1606,8 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
           $sendTemplateParams['from'] = $receiptFrom;
           $sendTemplateParams['toName'] = $this->_contributorDisplayName;
           $sendTemplateParams['toEmail'] = $this->_contributorEmail;
-          $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc', $this->_fromEmails);
-          $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc', $this->_fromEmails);
+          $sendTemplateParams['cc'] = $this->_fromEmails['cc'] ?? NULL;
+          $sendTemplateParams['bcc'] = $this->_fromEmails['bcc'] ?? NULL;
         }
 
         //send email with pdf invoice
@@ -1617,7 +1617,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
           $this->_id, 'contribution_id', 'participant_id'
         );
         $prefixValue = Civi::settings()->get('contribution_invoice_settings');
-        $invoicing = CRM_Utils_Array::value('invoicing', $prefixValue);
+        $invoicing = $prefixValue['invoicing'] ?? NULL;
         if (!empty($taxAmt) && (isset($invoicing) && isset($prefixValue['is_email_pdf']))) {
           $sendTemplateParams['isEmailPdf'] = TRUE;
           $sendTemplateParams['contributionId'] = $contributionId;
@@ -1627,7 +1627,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
           $sent[] = $contactID;
           foreach ($participants as $ids => $values) {
             if ($values->contact_id == $contactID) {
-              $values->details = CRM_Utils_Array::value('receipt_text', $params);
+              $values->details = $params['receipt_text'] ?? NULL;
               CRM_Activity_BAO_Activity::addActivity($values, 'Email');
               break;
             }
@@ -1732,7 +1732,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
       CRM_Event_Form_Registration_Register::buildAmount($form, TRUE, $form->_discountId);
       $lineItem = [];
       $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-      $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+      $invoicing = $invoiceSettings['invoicing'] ?? NULL;
       $totalTaxAmount = 0;
       if (!CRM_Utils_System::isNull(CRM_Utils_Array::value('line_items', $form->_values))) {
         $lineItem[] = $form->_values['line_items'];
@@ -1907,8 +1907,8 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
       //CRM-11529 for quick config backoffice transactions
       //when financial_type_id is passed in form, update the
       //lineitems with the financial type selected in form
-      $submittedFinancialType = CRM_Utils_Array::value('financial_type_id', $params);
-      $isPaymentRecorded = CRM_Utils_Array::value('record_contribution', $params);
+      $submittedFinancialType = $params['financial_type_id'] ?? NULL;
+      $isPaymentRecorded = $params['record_contribution'] ?? NULL;
       if ($isPaymentRecorded && $this->_quickConfig && $submittedFinancialType) {
         foreach ($lineItem[0] as &$values) {
           $values['financial_type_id'] = $submittedFinancialType;
@@ -1984,7 +1984,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
       $event['participant_role'] = implode(', ', $selectedRoles);
     }
     else {
-      $event['participant_role'] = CRM_Utils_Array::value($participantRoles, $role);
+      $event['participant_role'] = $role[$participantRoles] ?? NULL;
     }
     $event['is_monetary'] = $isPaidEvent;
 
@@ -2046,9 +2046,9 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
       'currency' => $params['currencyID'],
       'source' => !empty($params['participant_source']) ? $params['participant_source'] : $params['description'],
       'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
-      'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
-      'card_type_id' => CRM_Utils_Array::value('card_type_id', $params),
-      'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $params),
+      'campaign_id' => $params['campaign_id'] ?? NULL,
+      'card_type_id' => $params['card_type_id'] ?? NULL,
+      'pan_truncation' => $params['pan_truncation'] ?? NULL,
     ];
 
     if ($paymentProcessor) {
@@ -2058,7 +2058,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
 
     if (!$pending && $result) {
       $contribParams += [
-        'fee_amount' => CRM_Utils_Array::value('fee_amount', $result),
+        'fee_amount' => $result['fee_amount'] ?? NULL,
         'trxn_id' => $result['trxn_id'],
         'receipt_date' => $receiptDate,
       ];
@@ -2125,7 +2125,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
 
     $participantFields = CRM_Event_DAO_Participant::fields();
     $participantParams = [
-      'id' => CRM_Utils_Array::value('participant_id', $params),
+      'id' => $params['participant_id'] ?? NULL,
       'contact_id' => $contactID,
       'event_id' => $form->_eventId ? $form->_eventId : $params['event_id'],
       'status_id' => CRM_Utils_Array::value('participant_status',
@@ -2137,13 +2137,13 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
         isset($params['participant_source']) ? CRM_Utils_Array::value('participant_source', $params) : CRM_Utils_Array::value('description', $params),
         $participantFields['participant_source']['maxlength']
       ),
-      'fee_level' => CRM_Utils_Array::value('amount_level', $params),
+      'fee_level' => $params['amount_level'] ?? NULL,
       'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
-      'fee_amount' => CRM_Utils_Array::value('fee_amount', $params),
-      'registered_by_id' => CRM_Utils_Array::value('registered_by_id', $params),
-      'discount_id' => CRM_Utils_Array::value('discount_id', $params),
-      'fee_currency' => CRM_Utils_Array::value('currencyID', $params),
-      'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
+      'fee_amount' => $params['fee_amount'] ?? NULL,
+      'registered_by_id' => $params['registered_by_id'] ?? NULL,
+      'discount_id' => $params['discount_id'] ?? NULL,
+      'fee_currency' => $params['currencyID'] ?? NULL,
+      'campaign_id' => $params['campaign_id'] ?? NULL,
     ];
 
     if ($form->_action & CRM_Core_Action::PREVIEW || CRM_Utils_Array::value('mode', $params) == 'test') {
diff --git a/civicrm/CRM/Event/Form/ParticipantFeeSelection.php b/civicrm/CRM/Event/Form/ParticipantFeeSelection.php
index bc604dbbc2..9cfa7ce2da 100644
--- a/civicrm/CRM/Event/Form/ParticipantFeeSelection.php
+++ b/civicrm/CRM/Event/Form/ParticipantFeeSelection.php
@@ -296,7 +296,7 @@ class CRM_Event_Form_ParticipantFeeSelection extends CRM_Core_Form {
     unset($event['end_date']);
 
     $role = CRM_Event_PseudoConstant::participantRole();
-    $participantRoles = CRM_Utils_Array::value('role_id', $params);
+    $participantRoles = $params['role_id'] ?? NULL;
     if (is_array($participantRoles)) {
       $selectedRoles = [];
       foreach (array_keys($participantRoles) as $roleId) {
@@ -305,7 +305,7 @@ class CRM_Event_Form_ParticipantFeeSelection extends CRM_Core_Form {
       $event['participant_role'] = implode(', ', $selectedRoles);
     }
     else {
-      $event['participant_role'] = CRM_Utils_Array::value($participantRoles, $role);
+      $event['participant_role'] = $role[$participantRoles] ?? NULL;
     }
     $event['is_monetary'] = $this->_isPaidEvent;
 
@@ -374,8 +374,8 @@ class CRM_Event_Form_ParticipantFeeSelection extends CRM_Core_Form {
       $sendTemplateParams['from'] = $receiptFrom;
       $sendTemplateParams['toName'] = $this->_contributorDisplayName;
       $sendTemplateParams['toEmail'] = $this->_contributorEmail;
-      $sendTemplateParams['cc'] = CRM_Utils_Array::value('cc', $this->_fromEmails);
-      $sendTemplateParams['bcc'] = CRM_Utils_Array::value('bcc', $this->_fromEmails);
+      $sendTemplateParams['cc'] = $this->_fromEmails['cc'] ?? NULL;
+      $sendTemplateParams['bcc'] = $this->_fromEmails['bcc'] ?? NULL;
     }
 
     list($mailSent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
diff --git a/civicrm/CRM/Event/Form/ParticipantView.php b/civicrm/CRM/Event/Form/ParticipantView.php
index 0d67d1033e..efe72c2e78 100644
--- a/civicrm/CRM/Event/Form/ParticipantView.php
+++ b/civicrm/CRM/Event/Form/ParticipantView.php
@@ -117,7 +117,7 @@ class CRM_Event_Form_ParticipantView extends CRM_Core_Form {
       $values[$participantID]['lineItem'][] = $lineItem;
     }
 
-    $values[$participantID]['totalAmount'] = CRM_Utils_Array::value('fee_amount', $values[$participantID]);
+    $values[$participantID]['totalAmount'] = $values[$participantID]['fee_amount'] ?? NULL;
 
     // Get registered_by contact ID and display_name if participant was registered by someone else (CRM-4859)
     if (!empty($values[$participantID]['participant_registered_by_id'])) {
@@ -193,7 +193,7 @@ class CRM_Event_Form_ParticipantView extends CRM_Core_Form {
 
     $participantCount = [];
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    $invoicing = $invoiceSettings['invoicing'] ?? NULL;
     $totalTaxAmount = 0;
     foreach ($lineItem as $k => $v) {
       if (CRM_Utils_Array::value('participant_count', $lineItem[$k]) > 0) {
@@ -211,7 +211,7 @@ class CRM_Event_Form_ParticipantView extends CRM_Core_Form {
     // omitting contactImage from title for now since the summary overlay css doesn't work outside of our crm-container
     CRM_Utils_System::setTitle(ts('View Event Registration for') . ' ' . $displayName);
 
-    $roleId = CRM_Utils_Array::value('role_id', $values[$participantID]);
+    $roleId = $values[$participantID]['role_id'] ?? NULL;
     $title = $displayName . ' (' . CRM_Utils_Array::value($roleId, $participantRoles) . ' - ' . $eventTitle . ')';
 
     $sep = CRM_Core_DAO::VALUE_SEPARATOR;
diff --git a/civicrm/CRM/Event/Form/Registration.php b/civicrm/CRM/Event/Form/Registration.php
index f6a19f5d86..efa71d4605 100644
--- a/civicrm/CRM/Event/Form/Registration.php
+++ b/civicrm/CRM/Event/Form/Registration.php
@@ -238,7 +238,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       $params = array('id' => $this->_eventId);
       CRM_Event_BAO_Event::retrieve($params, $this->_values['event']);
       // check for is_monetary status
-      $isMonetary = CRM_Utils_Array::value('is_monetary', $this->_values['event']);
+      $isMonetary = $this->_values['event']['is_monetary'] ?? NULL;
       // check for ability to add contributions of type
       if ($isMonetary
         && CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus()
@@ -272,7 +272,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       if ($eventFull && !$this->_allowConfirmation) {
         $this->_isEventFull = TRUE;
         //lets redirecting to info only when to waiting list.
-        $this->_allowWaitlist = CRM_Utils_Array::value('has_waitlist', $this->_values['event']);
+        $this->_allowWaitlist = $this->_values['event']['has_waitlist'] ?? NULL;
         if (!$this->_allowWaitlist) {
           CRM_Utils_System::redirect($infoUrl);
         }
@@ -380,21 +380,21 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
     // we do not want to display recently viewed items on Registration pages
     $this->assign('displayRecent', FALSE);
 
-    $isShowLocation = CRM_Utils_Array::value('is_show_location', $this->_values['event']);
+    $isShowLocation = $this->_values['event']['is_show_location'] ?? NULL;
     $this->assign('isShowLocation', $isShowLocation);
     // Handle PCP
     $pcpId = CRM_Utils_Request::retrieve('pcpId', 'Positive', $this);
     if ($pcpId) {
       $pcp = CRM_PCP_BAO_PCP::handlePcp($pcpId, 'event', $this->_values['event']);
       $this->_pcpId = $pcp['pcpId'];
-      $this->_values['event']['intro_text'] = CRM_Utils_Array::value('intro_text', $pcp['pcpInfo']);
+      $this->_values['event']['intro_text'] = $pcp['pcpInfo']['intro_text'] ?? NULL;
     }
 
     // assign all event properties so wizard templates can display event info.
     $this->assign('event', $this->_values['event']);
     $this->assign('location', $this->_values['location']);
     $this->assign('bltID', $this->_bltID);
-    $isShowLocation = CRM_Utils_Array::value('is_show_location', $this->_values['event']);
+    $isShowLocation = $this->_values['event']['is_show_location'] ?? NULL;
     $this->assign('isShowLocation', $isShowLocation);
     CRM_Contribute_BAO_Contribution_Utils::overrideDefaultCurrency($this->_values['event']);
 
@@ -405,13 +405,13 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
     }
 
     // Set the same value for is_billing_required as contribution page so code can be shared.
-    $this->_values['is_billing_required'] = CRM_Utils_Array::value('is_billing_required', $this->_values['event']);
+    $this->_values['is_billing_required'] = $this->_values['event']['is_billing_required'] ?? NULL;
     // check if billing block is required for pay later
     // note that I have started removing the use of isBillingAddressRequiredForPayLater in favour of letting
     // the CRM_Core_Payment_Manual class handle it - but there are ~300 references to it in the code base so only
     // removing in very limited cases.
-    if (CRM_Utils_Array::value('is_pay_later', $this->_values['event'])) {
-      $this->_isBillingAddressRequiredForPayLater = CRM_Utils_Array::value('is_billing_required', $this->_values['event']);
+    if (!empty($this->_values['event']['is_pay_later'])) {
+      $this->_isBillingAddressRequiredForPayLater = $this->_values['event']['is_billing_required'] ?? NULL;
       $this->assign('isBillingAddressRequiredForPayLater', $this->_isBillingAddressRequiredForPayLater);
     }
   }
@@ -630,8 +630,8 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       if (is_array($discountedEvent)) {
         foreach ($discountedEvent as $key => $priceSetId) {
           $priceSet = CRM_Price_BAO_PriceSet::getSetDetail($priceSetId);
-          $priceSet = CRM_Utils_Array::value($priceSetId, $priceSet);
-          $form->_values['discount'][$key] = CRM_Utils_Array::value('fields', $priceSet);
+          $priceSet = $priceSet[$priceSetId] ?? NULL;
+          $form->_values['discount'][$key] = $priceSet['fields'] ?? NULL;
           $fieldID = key($form->_values['discount'][$key]);
           $form->_values['discount'][$key][$fieldID]['name'] = CRM_Core_DAO::getFieldValue(
             'CRM_Price_DAO_PriceSet',
@@ -641,7 +641,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
         }
       }
     }
-    $eventFee = CRM_Utils_Array::value('fee', $form->_values);
+    $eventFee = $form->_values['fee'] ?? NULL;
     if (!is_array($eventFee) || empty($eventFee)) {
       $form->_values['fee'] = array();
     }
@@ -651,7 +651,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       $isPaidEvent = $form->_isPaidEvent;
     }
     else {
-      $isPaidEvent = CRM_Utils_Array::value('is_monetary', $form->_values['event']);
+      $isPaidEvent = $form->_values['event']['is_monetary'] ?? NULL;
     }
     if (CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus()
       && !empty($form->_values['fee'])
@@ -800,7 +800,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
 
     $participantFields = CRM_Event_DAO_Participant::fields();
     $participantParams = array(
-      'id' => CRM_Utils_Array::value('participant_id', $params),
+      'id' => $params['participant_id'] ?? NULL,
       'contact_id' => $contactID,
       'event_id' => $form->_eventId ? $form->_eventId : $params['event_id'],
       'status_id' => CRM_Utils_Array::value('participant_status',
@@ -812,13 +812,13 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
         isset($params['participant_source']) ? CRM_Utils_Array::value('participant_source', $params) : CRM_Utils_Array::value('description', $params),
         $participantFields['participant_source']['maxlength']
       ),
-      'fee_level' => CRM_Utils_Array::value('amount_level', $params),
+      'fee_level' => $params['amount_level'] ?? NULL,
       'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
-      'fee_amount' => CRM_Utils_Array::value('fee_amount', $params),
-      'registered_by_id' => CRM_Utils_Array::value('registered_by_id', $params),
-      'discount_id' => CRM_Utils_Array::value('discount_id', $params),
-      'fee_currency' => CRM_Utils_Array::value('currencyID', $params),
-      'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
+      'fee_amount' => $params['fee_amount'] ?? NULL,
+      'registered_by_id' => $params['registered_by_id'] ?? NULL,
+      'discount_id' => $params['discount_id'] ?? NULL,
+      'fee_currency' => $params['currencyID'] ?? NULL,
+      'campaign_id' => $params['campaign_id'] ?? NULL,
     );
 
     if ($form->_action & CRM_Core_Action::PREVIEW || CRM_Utils_Array::value('mode', $params) == 'test') {
@@ -912,7 +912,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       $count = 1;
 
       $usedCache = FALSE;
-      $cacheCount = CRM_Utils_Array::value($key, $form->_lineItemParticipantsCount);
+      $cacheCount = $form->_lineItemParticipantsCount[$key] ?? NULL;
       if ($cacheCount && is_numeric($cacheCount)) {
         $count = $cacheCount;
         $usedCache = TRUE;
@@ -1212,7 +1212,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       if (!is_array($values) || empty($values)) {
         continue;
       }
-      $eleVal = CRM_Utils_Array::value($elementName, $values);
+      $eleVal = $values[$elementName] ?? NULL;
       if (empty($eleVal)) {
         continue;
       }
@@ -1567,7 +1567,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
 
         //lets get additional participant id to cancel.
         if ($this->_allowConfirmation && is_array($cancelledIds)) {
-          $additonalId = CRM_Utils_Array::value('participant_id', $value);
+          $additonalId = $value['participant_id'] ?? NULL;
           if ($additonalId && $key = array_search($additonalId, $cancelledIds)) {
             unset($cancelledIds[$key]);
           }
diff --git a/civicrm/CRM/Event/Form/Registration/AdditionalParticipant.php b/civicrm/CRM/Event/Form/Registration/AdditionalParticipant.php
index 679139f757..c29163ef0a 100644
--- a/civicrm/CRM/Event/Form/Registration/AdditionalParticipant.php
+++ b/civicrm/CRM/Event/Form/Registration/AdditionalParticipant.php
@@ -39,7 +39,7 @@ class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_R
 
     //lets process in-queue participants.
     if ($this->_participantId && $this->_additionalParticipantIds) {
-      $this->_additionalParticipantId = CRM_Utils_Array::value($participantNo, $this->_additionalParticipantIds);
+      $this->_additionalParticipantId = $this->_additionalParticipantIds[$participantNo] ?? NULL;
     }
 
     $participantCnt = $participantNo + 1;
@@ -130,7 +130,7 @@ class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_R
 
     //load default campaign from page.
     if (array_key_exists('participant_campaign_id', $this->_fields)) {
-      $defaults['participant_campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values['event']);
+      $defaults['participant_campaign_id'] = $this->_values['event']['campaign_id'] ?? NULL;
     }
 
     //CRM-17865 set custom field defaults
@@ -215,7 +215,7 @@ class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_R
       //lets allow to become a part of runtime waiting list, if primary selected pay later.
       $realPayLater = FALSE;
       if (!empty($this->_values['event']['is_monetary']) && !empty($this->_values['event']['is_pay_later'])) {
-        $realPayLater = CRM_Utils_Array::value('is_pay_later', $this->_params[0]);
+        $realPayLater = $this->_params[0]['is_pay_later'] ?? NULL;
       }
 
       //truly spaces are greater than required.
@@ -360,7 +360,7 @@ class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_R
 
     $realPayLater = FALSE;
     if (!empty($self->_values['event']['is_monetary']) && !empty($self->_values['event']['is_pay_later'])) {
-      $realPayLater = CRM_Utils_Array::value('is_pay_later', $self->_params[0]);
+      $realPayLater = $self->_params[0]['is_pay_later'] ?? NULL;
     }
 
     if ($button != 'skip') {
@@ -579,7 +579,7 @@ class CRM_Event_Form_Registration_AdditionalParticipant extends CRM_Event_Form_R
       $params['campaign_id'] = $params['participant_campaign_id'];
     }
     else {
-      $params['campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values['event']);
+      $params['campaign_id'] = $this->_values['event']['campaign_id'] ?? NULL;
     }
 
     // if waiting is enabled
diff --git a/civicrm/CRM/Event/Form/Registration/Confirm.php b/civicrm/CRM/Event/Form/Registration/Confirm.php
index 735679d579..4d2888b253 100644
--- a/civicrm/CRM/Event/Form/Registration/Confirm.php
+++ b/civicrm/CRM/Event/Form/Registration/Confirm.php
@@ -274,7 +274,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
     self::assignProfiles($this);
 
     //consider total amount.
-    $this->assign('isAmountzero', ($this->_totalAmount <= 0) ? TRUE : FALSE);
+    $this->assign('isAmountzero', $this->_totalAmount <= 0);
 
     $contribButton = ts('Continue');
     $this->addButtons([
@@ -426,7 +426,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
       }
       //lets get additional participant id to cancel.
       if ($this->_allowConfirmation && is_array($cancelledIds)) {
-        $additonalId = CRM_Utils_Array::value('participant_id', $record);
+        $additonalId = $record['participant_id'] ?? NULL;
         if ($additonalId && $key = array_search($additonalId, $cancelledIds)) {
           unset($cancelledIds[$key]);
         }
@@ -473,7 +473,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
 
       //Unset ContactID for additional participants and set RegisterBy Id.
       if (empty($value['is_primary'])) {
-        $contactID = CRM_Utils_Array::value('contact_id', $value);
+        $contactID = $value['contact_id'] ?? NULL;
         $registerByID = $this->get('registerByID');
         if ($registerByID) {
           $value['registered_by_id'] = $registerByID;
@@ -562,7 +562,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
           $value['participant_register_date'] = $this->_values['participant']['register_date'];
         }
 
-        $createContrib = ($value['amount'] != 0) ? TRUE : FALSE;
+        $createContrib = $value['amount'] != 0;
         // force to create zero amount contribution, CRM-5095
         if (!$createContrib && ($value['amount'] == 0)
           && $this->_priceSetId && $this->_lineItem
@@ -600,7 +600,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
 
       //CRM-4453.
       if (!empty($value['is_primary'])) {
-        $primaryCurrencyID = CRM_Utils_Array::value('currencyID', $value);
+        $primaryCurrencyID = $value['currencyID'] ?? NULL;
       }
       if (empty($value['currencyID'])) {
         $value['currencyID'] = $primaryCurrencyID;
@@ -619,12 +619,12 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
         }
       }
 
-      $value['fee_amount'] = CRM_Utils_Array::value('amount', $value);
+      $value['fee_amount'] = $value['amount'] ?? NULL;
       $this->set('value', $value);
 
       // handle register date CRM-4320
       if ($this->_allowConfirmation) {
-        $registerDate = CRM_Utils_Array::value('participant_register_date', $params);
+        $registerDate = $params['participant_register_date'] ?? NULL;
       }
       elseif (!empty($params['participant_register_date']) &&
         is_array($params['participant_register_date'])
@@ -683,7 +683,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
                 $dataArray[$line['tax_rate']] = $dataArray[$line['tax_rate']] + CRM_Utils_Array::value('tax_amount', $line);
               }
               else {
-                $dataArray[$line['tax_rate']] = CRM_Utils_Array::value('tax_amount', $line);
+                $dataArray[$line['tax_rate']] = $line['tax_amount'] ?? NULL;
               }
             }
           }
@@ -939,9 +939,9 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
       'currency' => $params['currencyID'],
       'source' => !empty($params['participant_source']) ? $params['participant_source'] : $params['description'],
       'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
-      'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
-      'card_type_id' => CRM_Utils_Array::value('card_type_id', $params),
-      'pan_truncation' => CRM_Utils_Array::value('pan_truncation', $params),
+      'campaign_id' => $params['campaign_id'] ?? NULL,
+      'card_type_id' => $params['card_type_id'] ?? NULL,
+      'pan_truncation' => $params['pan_truncation'] ?? NULL,
     ];
 
     if ($paymentProcessor) {
@@ -951,7 +951,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
 
     if (!$pending && $result) {
       $contribParams += [
-        'fee_amount' => CRM_Utils_Array::value('fee_amount', $result),
+        'fee_amount' => $result['fee_amount'] ?? NULL,
         'trxn_id' => $result['trxn_id'],
         'receipt_date' => $receiptDate,
       ];
@@ -1156,7 +1156,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
     //get email primary first if exist
     $subscriptionEmail = ['email' => CRM_Utils_Array::value('email-Primary', $params)];
     if (!$subscriptionEmail['email']) {
-      $subscriptionEmail['email'] = CRM_Utils_Array::value("email-{$form->_bltID}", $params);
+      $subscriptionEmail['email'] = $params["email-{$form->_bltID}"] ?? NULL;
     }
     // subscribing contact to groups
     if (!empty($subscribeGroupIds) && $subscriptionEmail['email']) {
@@ -1200,7 +1200,7 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
           if (count($values)) {
             $formattedValues[$count][$prefix1 . 'CustomPre'] = $values;
           }
-          $formattedValues[$count][$prefix1 . 'CustomPreGroupTitle'] = CRM_Utils_Array::value('groupTitle', $groupName);
+          $formattedValues[$count][$prefix1 . 'CustomPreGroupTitle'] = $groupName['groupTitle'] ?? NULL;
         }
         //get the customPost profile info
         if (!empty($form->_values[$prefix2 . 'custom_post_id'])) {
@@ -1259,9 +1259,9 @@ class CRM_Event_Form_Registration_Confirm extends CRM_Event_Form_Registration {
     // This happens in buildQuickForm so emulate here.
     $form->_amount = $form->_totalAmount = CRM_Utils_Rule::cleanMoney(CRM_Utils_Array::value('totalAmount', $params));
     $form->set('params', $params['params']);
-    $form->_values['custom_pre_id'] = CRM_Utils_Array::value('custom_pre_id', $params);
-    $form->_values['custom_post_id'] = CRM_Utils_Array::value('custom_post_id', $params);
-    $form->_values['event'] = CRM_Utils_Array::value('event', $params);
+    $form->_values['custom_pre_id'] = $params['custom_pre_id'] ?? NULL;
+    $form->_values['custom_post_id'] = $params['custom_post_id'] ?? NULL;
+    $form->_values['event'] = $params['event'] ?? NULL;
     $form->_contributeMode = $params['contributeMode'];
     $eventParams = ['id' => $params['id']];
     CRM_Event_BAO_Event::retrieve($eventParams, $form->_values['event']);
diff --git a/civicrm/CRM/Event/Form/Registration/ParticipantConfirm.php b/civicrm/CRM/Event/Form/Registration/ParticipantConfirm.php
index 6c23fce620..4a4b95b5c0 100644
--- a/civicrm/CRM/Event/Form/Registration/ParticipantConfirm.php
+++ b/civicrm/CRM/Event/Form/Registration/ParticipantConfirm.php
@@ -50,9 +50,9 @@ class CRM_Event_Form_Registration_ParticipantConfirm extends CRM_Event_Form_Regi
       );
     }
 
-    $this->_participantStatusId = CRM_Utils_Array::value('status_id', $values);
-    $this->_eventId = CRM_Utils_Array::value('event_id', $values);
-    $csContactId = CRM_Utils_Array::value('contact_id', $values);
+    $this->_participantStatusId = $values['status_id'] ?? NULL;
+    $this->_eventId = $values['event_id'] ?? NULL;
+    $csContactId = $values['contact_id'] ?? NULL;
 
     // make sure we have right permission to edit this user
     $this->_csContactID = NULL;
diff --git a/civicrm/CRM/Event/Form/Registration/Register.php b/civicrm/CRM/Event/Form/Registration/Register.php
index 2e2ad47610..e39d386e6b 100644
--- a/civicrm/CRM/Event/Form/Registration/Register.php
+++ b/civicrm/CRM/Event/Form/Registration/Register.php
@@ -152,7 +152,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
     $this->_allowWaitlist = FALSE;
     if ($eventFull && !$this->_allowConfirmation && !empty($this->_values['event']['has_waitlist'])) {
       $this->_allowWaitlist = TRUE;
-      $this->_waitlistMsg = CRM_Utils_Array::value('waitlist_text', $this->_values['event']);
+      $this->_waitlistMsg = $this->_values['event']['waitlist_text'] ?? NULL;
       if (!$this->_waitlistMsg) {
         $this->_waitlistMsg = ts('This event is currently full. However you can register now and get added to a waiting list. You will be notified if spaces become available.');
       }
@@ -475,7 +475,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
         $buttonLabel = ts('Register');
       }
       else {
-        $buttonLabel = ts('Continue');
+        $buttonLabel = ts('Review your registration');
       }
 
       $this->addButtons([
@@ -519,18 +519,18 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
     //if payment done, no need to build the fee block.
     if (!empty($form->_paymentId)) {
       //fix to display line item in update mode.
-      $form->assign('priceSet', isset($form->_priceSet) ? $form->_priceSet : NULL);
+      $form->assign('priceSet', $form->_priceSet ?? NULL);
       return;
     }
 
-    $feeFields = CRM_Utils_Array::value('fee', $form->_values);
+    $feeFields = $form->_values['fee'] ?? NULL;
 
     if (is_array($feeFields)) {
       $form->_feeBlock = &$form->_values['fee'];
     }
 
     //check for discount.
-    $discountedFee = CRM_Utils_Array::value('discount', $form->_values);
+    $discountedFee = $form->_values['discount'] ?? NULL;
     if (is_array($discountedFee) && !empty($discountedFee)) {
       if (!$discountId) {
         $form->_discountId = $discountId = CRM_Core_BAO_Discount::findSet($form->_eventId, 'civicrm_event');
@@ -586,13 +586,13 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
           $fieldId = $field['id'];
           $elementName = 'price_' . $fieldId;
 
-          $isRequire = CRM_Utils_Array::value('is_required', $field);
+          $isRequire = $field['is_required'] ?? NULL;
           if ($button == 'skip') {
             $isRequire = FALSE;
           }
 
           //user might modified w/ hook.
-          $options = CRM_Utils_Array::value('options', $field);
+          $options = $field['options'] ?? NULL;
           $formClasses = ['CRM_Event_Form_Participant', 'CRM_Event_Form_ParticipantFeeSelection'];
 
           if (!is_array($options)) {
@@ -654,7 +654,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
       }
       $form->assign('eventFeeBlockValues', json_encode($eventFeeBlockValues));
 
-      $form->_defaults['amount'] = CRM_Utils_Array::value('default_fee_id', $form->_values['event']);
+      $form->_defaults['amount'] = $form->_values['event']['default_fee_id'] ?? NULL;
       $element = &$form->addGroup($elements, 'amount', ts('Event Fee(s)'), '<br />');
       if (isset($form->_online) && $form->_online) {
         $element->freeze();
@@ -686,7 +686,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
 
     $skipParticipants = $formattedPriceSetDefaults = [];
     if (!empty($form->_allowConfirmation) && (isset($form->_pId) || isset($form->_additionalParticipantId))) {
-      $participantId = isset($form->_pId) ? $form->_pId : $form->_additionalParticipantId;
+      $participantId = $form->_pId ?? $form->_additionalParticipantId;
       $pricesetDefaults = CRM_Event_Form_EventFees::setDefaultPriceSet($participantId,
         $form->_eventId
       );
@@ -967,7 +967,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
       $params['campaign_id'] = $params['participant_campaign_id'];
     }
     else {
-      $params['campaign_id'] = CRM_Utils_Array::value('campaign_id', $this->_values['event']);
+      $params['campaign_id'] = $this->_values['event']['campaign_id'] ?? NULL;
     }
 
     //hack to allow group to register w/ waiting
diff --git a/civicrm/CRM/Event/Form/Registration/ThankYou.php b/civicrm/CRM/Event/Form/Registration/ThankYou.php
index 01b19c5b25..d186528e18 100644
--- a/civicrm/CRM/Event/Form/Registration/ThankYou.php
+++ b/civicrm/CRM/Event/Form/Registration/ThankYou.php
@@ -120,7 +120,7 @@ class CRM_Event_Form_Registration_ThankYou extends CRM_Event_Form_Registration {
     $this->assign('trxn_id', $this->_trxnId);
 
     //cosider total amount.
-    $this->assign('isAmountzero', ($this->_totalAmount <= 0) ? TRUE : FALSE);
+    $this->assign('isAmountzero', $this->_totalAmount <= 0);
 
     $this->assign('defaultRole', FALSE);
     if (CRM_Utils_Array::value('defaultRole', $this->_params[0]) == 1) {
diff --git a/civicrm/CRM/Event/Form/Search.php b/civicrm/CRM/Event/Form/Search.php
index d1d0c9cdf8..8cb0c34121 100644
--- a/civicrm/CRM/Event/Form/Search.php
+++ b/civicrm/CRM/Event/Form/Search.php
@@ -189,7 +189,7 @@ class CRM_Event_Form_Search extends CRM_Core_Form_Search {
       $this->assign('participantCount', $participantCount);
       $this->assign('lineItems', $lineItems);
 
-      $taskParams['ssID'] = isset($this->_ssID) ? $this->_ssID : NULL;
+      $taskParams['ssID'] = $this->_ssID ?? NULL;
       $tasks = CRM_Event_Task::permissionedTaskTitles(CRM_Core_Permission::getPermission(), $taskParams);
 
       if (isset($this->_ssID)) {
diff --git a/civicrm/CRM/Event/Form/SelfSvcTransfer.php b/civicrm/CRM/Event/Form/SelfSvcTransfer.php
index 4569886426..d44012ff41 100644
--- a/civicrm/CRM/Event/Form/SelfSvcTransfer.php
+++ b/civicrm/CRM/Event/Form/SelfSvcTransfer.php
@@ -259,10 +259,10 @@ class CRM_Event_Form_SelfSvcTransfer extends CRM_Core_Form {
     }
     if (empty($errors) && empty($contact_id)) {
       $params = [
-        'email-Primary' => CRM_Utils_Array::value('email', $fields, NULL),
-        'first_name' => CRM_Utils_Array::value('first_name', $fields, NULL),
-        'last_name' => CRM_Utils_Array::value('last_name', $fields, NULL),
-        'is_deleted' => CRM_Utils_Array::value('is_deleted', $fields, FALSE),
+        'email-Primary' => $fields['email'] ?? NULL,
+        'first_name' => $fields['first_name'] ?? NULL,
+        'last_name' => $fields['last_name'] ?? NULL,
+        'is_deleted' => $fields['is_deleted'] ?? FALSE,
       ];
       //create new contact for this name/email pair
       //if new contact, no need to check for contact already registered
@@ -432,14 +432,14 @@ class CRM_Event_Form_SelfSvcTransfer extends CRM_Core_Form {
     $eventParams = ['id' => $participant->event_id];
     CRM_Event_BAO_Event::retrieve($eventParams, $eventDetails);
     //get default participant role.
-    $eventDetails['participant_role'] = CRM_Utils_Array::value($eventDetails['default_role_id'], $participantRoles);
+    $eventDetails['participant_role'] = $participantRoles[$eventDetails['default_role_id']] ?? NULL;
     //get the location info
     $locParams = [
       'entity_id' => $participant->event_id,
       'entity_table' => 'civicrm_event',
     ];
     $eventDetails['location'] = CRM_Core_BAO_Location::getValues($locParams, TRUE);
-    $toEmail = CRM_Utils_Array::value('email', $contactDetails[$participant->contact_id]);
+    $toEmail = $contactDetails[$participant->contact_id]['email'] ?? NULL;
     if ($toEmail) {
       //take a receipt from as event else domain.
       $receiptFrom = $domainValues['name'] . ' <' . $domainValues['email'] . '>';
@@ -462,8 +462,8 @@ class CRM_Event_Form_SelfSvcTransfer extends CRM_Core_Form {
         'from' => $receiptFrom,
         'toName' => $participantName,
         'toEmail' => $toEmail,
-        'cc' => CRM_Utils_Array::value('cc_confirm', $eventDetails),
-        'bcc' => CRM_Utils_Array::value('bcc_confirm', $eventDetails),
+        'cc' => $eventDetails['cc_confirm'] ?? NULL,
+        'bcc' => $eventDetails['bcc_confirm'] ?? NULL,
       ];
       CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
     }
@@ -512,7 +512,7 @@ class CRM_Event_Form_SelfSvcTransfer extends CRM_Core_Form {
     $eventParams = ['id' => $this->_event_id];
     CRM_Event_BAO_Event::retrieve($eventParams, $eventDetails[$this->_event_id]);
     //get default participant role.
-    $eventDetails[$this->_event_id]['participant_role'] = CRM_Utils_Array::value($eventDetails[$this->_event_id]['default_role_id'], $participantRoles);
+    $eventDetails[$this->_event_id]['participant_role'] = $participantRoles[$eventDetails[$this->_event_id]['default_role_id']] ?? NULL;
     //get the location info
     $locParams = ['entity_id' => $this->_event_id, 'entity_table' => 'civicrm_event'];
     $eventDetails[$this->_event_id]['location'] = CRM_Core_BAO_Location::getValues($locParams, TRUE);
diff --git a/civicrm/CRM/Event/Form/SelfSvcUpdate.php b/civicrm/CRM/Event/Form/SelfSvcUpdate.php
index 760478a058..33b9f7f3f8 100644
--- a/civicrm/CRM/Event/Form/SelfSvcUpdate.php
+++ b/civicrm/CRM/Event/Form/SelfSvcUpdate.php
@@ -289,7 +289,7 @@ class CRM_Event_Form_SelfSvcUpdate extends CRM_Core_Form {
     $eventParams = ['id' => $this->_event_id];
     CRM_Event_BAO_Event::retrieve($eventParams, $eventDetails[$this->_event_id]);
     //get default participant role.
-    $eventDetails[$this->_event_id]['participant_role'] = CRM_Utils_Array::value($eventDetails[$this->_event_id]['default_role_id'], $participantRoles);
+    $eventDetails[$this->_event_id]['participant_role'] = $participantRoles[$eventDetails[$this->_event_id]['default_role_id']] ?? NULL;
     //get the location info
     $locParams = ['entity_id' => $this->_event_id, 'entity_table' => 'civicrm_event'];
     $eventDetails[$this->_event_id]['location'] = CRM_Core_BAO_Location::getValues($locParams, TRUE);
diff --git a/civicrm/CRM/Event/Form/Task/AddToGroup.php b/civicrm/CRM/Event/Form/Task/AddToGroup.php
index 69d7f6a5dd..87c47c3fa6 100644
--- a/civicrm/CRM/Event/Form/Task/AddToGroup.php
+++ b/civicrm/CRM/Event/Form/Task/AddToGroup.php
@@ -189,7 +189,7 @@ class CRM_Event_Form_Task_AddToGroup extends CRM_Event_Form_Task {
    */
   public function postProcess() {
     $params = $this->controller->exportValues();
-    $groupOption = CRM_Utils_Array::value('group_option', $params, NULL);
+    $groupOption = $params['group_option'] ?? NULL;
     if ($groupOption) {
       $groupParams = [];
       $groupParams['title'] = $params['title'];
diff --git a/civicrm/CRM/Event/Form/Task/Batch.php b/civicrm/CRM/Event/Form/Task/Batch.php
index 2bd7321de6..3979b29edd 100644
--- a/civicrm/CRM/Event/Form/Task/Batch.php
+++ b/civicrm/CRM/Event/Form/Task/Batch.php
@@ -165,14 +165,14 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
       $eventTypeId = CRM_Core_DAO::getFieldValue("CRM_Event_DAO_Event", $eventId, 'event_type_id');
       foreach ($this->_fields as $name => $field) {
         if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($name)) {
-          $customValue = CRM_Utils_Array::value($customFieldID, $this->_customFields);
+          $customValue = $this->_customFields[$customFieldID] ?? NULL;
           $entityColumnValue = [];
           if (!empty($customValue['extends_entity_column_value'])) {
             $entityColumnValue = explode(CRM_Core_DAO::VALUE_SEPARATOR,
               $customValue['extends_entity_column_value']
             );
           }
-          $entityColumnValueRole = CRM_Utils_Array::value($roleId, $entityColumnValue);
+          $entityColumnValueRole = $entityColumnValue[$roleId] ?? NULL;
           $entityColumnValueEventType = in_array($eventTypeId, $entityColumnValue) ? $eventTypeId : NULL;
           if (($this->_roleCustomDataTypeID == $customValue['extends_entity_column_id']) &&
             ($entityColumnValueRole)
@@ -235,7 +235,7 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
 
       //get the from status ids, CRM-4323
       if (array_key_exists('participant_status', $this->_fields)) {
-        $this->_fromStatusIds[$participantId] = CRM_Utils_Array::value("field[$participantId][participant_status]", $defaults);
+        $this->_fromStatusIds[$participantId] = $defaults["field[$participantId][participant_status]"] ?? NULL;
       }
       if (array_key_exists('participant_role', $this->_fields)) {
         if ($defaults["field[{$participantId}][participant_role]"]) {
@@ -325,10 +325,10 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
    */
   public static function updateContributionStatus($params) {
     // get minimum required values.
-    $statusId = CRM_Utils_Array::value('contribution_status_id', $params);
-    $componentId = CRM_Utils_Array::value('component_id', $params);
-    $componentName = CRM_Utils_Array::value('componentName', $params);
-    $contributionId = CRM_Utils_Array::value('contribution_id', $params);
+    $statusId = $params['contribution_status_id'] ?? NULL;
+    $componentId = $params['component_id'] ?? NULL;
+    $componentName = $params['componentName'] ?? NULL;
+    $contributionId = $params['contribution_id'] ?? NULL;
 
     if (!$contributionId || !$componentId || !$componentName || !$statusId) {
       return NULL;
@@ -383,7 +383,7 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
       'labelColumn' => 'name',
       'flip' => 1,
     ]);
-    $input['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'] = CRM_Utils_Array::value('IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved', $params);
+    $input['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'] = $params['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'] ?? NULL;
     if ($statusId == $contributionStatuses['Cancelled']) {
       $baseIPN->cancelled($objects, $transaction, $input);
       $transaction->commit();
@@ -487,7 +487,7 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
         $relatedStatusChange = FALSE;
         if (!empty($value['participant_status'])) {
           $value['status_id'] = $value['participant_status'];
-          $fromStatusId = CRM_Utils_Array::value($key, $this->_fromStatusIds);
+          $fromStatusId = $this->_fromStatusIds[$key] ?? NULL;
           if (!$fromStatusId) {
             $fromStatusId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant', $key, 'status_id');
           }
diff --git a/civicrm/CRM/Event/Form/Task/Email.php b/civicrm/CRM/Event/Form/Task/Email.php
index 3722eced0d..2da1720e36 100644
--- a/civicrm/CRM/Event/Form/Task/Email.php
+++ b/civicrm/CRM/Event/Form/Task/Email.php
@@ -13,7 +13,6 @@
  *
  * @package CRM
  * @copyright CiviCRM LLC https://civicrm.org/licensing
- * $Id: Email.php 45499 2013-02-08 12:31:05Z kurund $
  */
 
 /**
@@ -21,29 +20,7 @@
  * contacts.
  */
 class CRM_Event_Form_Task_Email extends CRM_Event_Form_Task {
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_single = FALSE;
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_noEmails = FALSE;
-
-  /**
-   * All the existing templates in the system.
-   *
-   * @var array
-   */
-  public $_templates = NULL;
+  use CRM_Contact_Form_Task_EmailTrait;
 
   /**
    * Build all the data structures needed to build the form.
@@ -58,23 +35,6 @@ class CRM_Event_Form_Task_Email extends CRM_Event_Form_Task {
     $this->assign('single', $this->_single);
   }
 
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    //enable form element
-    $this->assign('emailTask', TRUE);
-
-    CRM_Contact_Form_Task_EmailCommon::buildQuickForm($this);
-  }
-
-  /**
-   * Process the form after the input has been submitted and validated.
-   */
-  public function postProcess() {
-    CRM_Contact_Form_Task_EmailCommon::postProcess($this);
-  }
-
   /**
    * List available tokens for this form.
    *
diff --git a/civicrm/CRM/Event/Page/ICalendar.php b/civicrm/CRM/Event/ICalendar.php
similarity index 59%
rename from civicrm/CRM/Event/Page/ICalendar.php
rename to civicrm/CRM/Event/ICalendar.php
index 9936f6549b..8a1fb937df 100644
--- a/civicrm/CRM/Event/Page/ICalendar.php
+++ b/civicrm/CRM/Event/ICalendar.php
@@ -10,18 +10,9 @@
  */
 
 /**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- * $Id$
- *
+ * Class to generate various "icalendar" type event feeds
  */
-
-/**
- * ICalendar class
- *
- */
-class CRM_Event_Page_ICalendar extends CRM_Core_Page {
+class CRM_Event_ICalendar extends CRM_Core_Page {
 
   /**
    * Heart of the iCalendar data assignment process. The runner gets all the meta
@@ -29,42 +20,45 @@ class CRM_Event_Page_ICalendar extends CRM_Core_Page {
    * to the user. If gData param is passed on the URL, outputs gData XML format.
    * Else outputs iCalendar format per IETF RFC2445. Page param true means send
    * to browser as inline content. Else, we send .ics file as attachment.
-   *
-   * @return void
    */
   public function run() {
-    $id = CRM_Utils_Request::retrieve('id', 'Positive', $this, FALSE, NULL, 'GET');
-    $type = CRM_Utils_Request::retrieve('type', 'Positive', $this, FALSE, 0);
-    $start = CRM_Utils_Request::retrieve('start', 'Positive', $this, FALSE, 0);
-    $end = CRM_Utils_Request::retrieve('end', 'Positive', $this, FALSE, 0);
-    $iCalPage = CRM_Utils_Request::retrieve('list', 'Positive', $this, FALSE, 0);
-    $gData = CRM_Utils_Request::retrieve('gData', 'Positive', $this, FALSE, 0);
-    $html = CRM_Utils_Request::retrieve('html', 'Positive', $this, FALSE, 0);
-    $rss = CRM_Utils_Request::retrieve('rss', 'Positive', $this, FALSE, 0);
+    $id = CRM_Utils_Request::retrieveValue('id', 'Positive', NULL, FALSE, 'GET');
+    $type = CRM_Utils_Request::retrieveValue('type', 'Positive', 0);
+    $start = CRM_Utils_Request::retrieveValue('start', 'Positive', 0);
+    $end = CRM_Utils_Request::retrieveValue('end', 'Positive', 0);
 
-    $info = CRM_Event_BAO_Event::getCompleteInfo($start, $type, $id, $end);
-    $this->assign('events', $info);
-    $this->assign('timezone', @date_default_timezone_get());
+    // We used to handle the event list as a html page at civicrm/event/ical - redirect to the new URL if that was what we requested.
+    if (CRM_Utils_Request::retrieveValue('html', 'Positive', 0)) {
+      $urlParams = [
+        'reset' => 1,
+      ];
+      $id ? $urlParams['id'] = $id : NULL;
+      $type ? $urlParams['type'] = $type : NULL;
+      $start ? $urlParams['start'] = $start : NULL;
+      $end ? $urlParams['end'] = $end : NULL;
+      CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/event/list', $urlParams, FALSE, NULL, FALSE, TRUE));
+    }
+
+    $iCalPage = CRM_Utils_Request::retrieveValue('list', 'Positive', 0);
+    $gData = CRM_Utils_Request::retrieveValue('gData', 'Positive', 0);
+    $rss = CRM_Utils_Request::retrieveValue('rss', 'Positive', 0);
 
-    // Send data to the correct template for formatting (iCal vs. gData)
     $template = CRM_Core_Smarty::singleton();
     $config = CRM_Core_Config::singleton();
+
+    $info = CRM_Event_BAO_Event::getCompleteInfo($start, $type, $id, $end);
+    $template->assign('events', $info);
+    $template->assign('timezone', @date_default_timezone_get());
+
+    // Send data to the correct template for formatting (iCal vs. gData)
     if ($rss) {
       // rss 2.0 requires lower case dash delimited locale
-      $this->assign('rssLang', str_replace('_', '-', strtolower($config->lcMessages)));
+      $template->assign('rssLang', str_replace('_', '-', strtolower($config->lcMessages)));
       $calendar = $template->fetch('CRM/Core/Calendar/Rss.tpl');
     }
     elseif ($gData) {
       $calendar = $template->fetch('CRM/Core/Calendar/GData.tpl');
     }
-    elseif ($html) {
-      // check if we're in shopping cart mode for events
-      $enable_cart = Civi::settings()->get('enable_cart');
-      if ($enable_cart) {
-        $this->assign('registration_links', TRUE);
-      }
-      return parent::run();
-    }
     else {
       $calendar = $template->fetch('CRM/Core/Calendar/ICal.tpl');
       $calendar = preg_replace('/(?<!\r)\n/', "\r\n", $calendar);
diff --git a/civicrm/CRM/Event/Import/Form/MapField.php b/civicrm/CRM/Event/Import/Form/MapField.php
index 6e0f51c1e0..b418566f2b 100644
--- a/civicrm/CRM/Event/Import/Form/MapField.php
+++ b/civicrm/CRM/Event/Import/Form/MapField.php
@@ -100,9 +100,9 @@ class CRM_Event_Import_Form_MapField extends CRM_Import_Form_MapField {
 
       $mappingName = $mappingName[1];
       $mappingContactType = $mappingContactType[1];
-      $mappingLocation = CRM_Utils_Array::value('1', $mappingLocation);
-      $mappingPhoneType = CRM_Utils_Array::value('1', $mappingPhoneType);
-      $mappingRelation = CRM_Utils_Array::value('1', $mappingRelation);
+      $mappingLocation = $mappingLocation['1'] ?? NULL;
+      $mappingPhoneType = $mappingPhoneType['1'] ?? NULL;
+      $mappingRelation = $mappingRelation['1'] ?? NULL;
 
       //mapping is to be loaded from database
 
@@ -339,7 +339,7 @@ class CRM_Event_Import_Form_MapField extends CRM_Import_Form_MapField {
     }
 
     if (!empty($fields['saveMapping'])) {
-      $nameField = CRM_Utils_Array::value('saveMappingName', $fields);
+      $nameField = $fields['saveMappingName'] ?? NULL;
       if (empty($nameField)) {
         $errors['saveMappingName'] = ts('Name is required to save Import Mapping');
       }
@@ -352,7 +352,7 @@ class CRM_Event_Import_Form_MapField extends CRM_Import_Form_MapField {
 
     //display Error if loaded mapping is not selected
     if (array_key_exists('loadMapping', $fields)) {
-      $getMapName = CRM_Utils_Array::value('savedMapping', $fields);
+      $getMapName = $fields['savedMapping'] ?? NULL;
       if (empty($getMapName)) {
         $errors['savedMapping'] = ts('Select saved mapping');
       }
@@ -428,9 +428,9 @@ class CRM_Event_Import_Form_MapField extends CRM_Import_Form_MapField {
         $updateMappingFields->column_number = $i;
 
         $explodedValues = explode('_', $mapperKeys[$i][0]);
-        $id = CRM_Utils_Array::value(0, $explodedValues);
-        $first = CRM_Utils_Array::value(1, $explodedValues);
-        $second = CRM_Utils_Array::value(2, $explodedValues);
+        $id = $explodedValues[0] ?? NULL;
+        $first = $explodedValues[1] ?? NULL;
+        $second = $explodedValues[2] ?? NULL;
 
         $updateMappingFields->name = $mapper[$i];
         $updateMappingFields->save();
@@ -452,9 +452,9 @@ class CRM_Event_Import_Form_MapField extends CRM_Import_Form_MapField {
         $saveMappingFields->column_number = $i;
 
         $explodedValues = explode('_', $mapperKeys[$i][0]);
-        $id = CRM_Utils_Array::value(0, $explodedValues);
-        $first = CRM_Utils_Array::value(1, $explodedValues);
-        $second = CRM_Utils_Array::value(2, $explodedValues);
+        $id = $explodedValues[0] ?? NULL;
+        $first = $explodedValues[1] ?? NULL;
+        $second = $explodedValues[2] ?? NULL;
 
         $saveMappingFields->name = $mapper[$i];
         $saveMappingFields->save();
diff --git a/civicrm/CRM/Event/Import/Parser/Participant.php b/civicrm/CRM/Event/Import/Parser/Participant.php
index 7e362d540a..c5c47da4c6 100644
--- a/civicrm/CRM/Event/Import/Parser/Participant.php
+++ b/civicrm/CRM/Event/Import/Parser/Participant.php
@@ -443,8 +443,8 @@ class CRM_Event_Import_Parser_Participant extends CRM_Event_Import_Parser {
     if (is_array($newParticipant) && civicrm_error($newParticipant)) {
       if ($onDuplicate == CRM_Import_Parser::DUPLICATE_SKIP) {
 
-        $contactID = CRM_Utils_Array::value('contactID', $newParticipant);
-        $participantID = CRM_Utils_Array::value('participantID', $newParticipant);
+        $contactID = $newParticipant['contactID'] ?? NULL;
+        $participantID = $newParticipant['participantID'] ?? NULL;
         $url = CRM_Utils_System::url('civicrm/contact/view/participant',
           "reset=1&id={$participantID}&cid={$contactID}&action=view", TRUE
         );
@@ -463,7 +463,7 @@ class CRM_Event_Import_Parser_Participant extends CRM_Event_Import_Parser {
     }
 
     if (!(is_array($newParticipant) && civicrm_error($newParticipant))) {
-      $this->_newParticipants[] = CRM_Utils_Array::value('id', $newParticipant);
+      $this->_newParticipants[] = $newParticipant['id'] ?? NULL;
     }
 
     return CRM_Import_Parser::VALID;
@@ -535,8 +535,8 @@ class CRM_Event_Import_Parser_Participant extends CRM_Event_Import_Parser {
         elseif ($type == 'Select' || $type == 'Radio') {
           $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE);
           foreach ($customOption as $customFldID => $customValue) {
-            $val = CRM_Utils_Array::value('value', $customValue);
-            $label = CRM_Utils_Array::value('label', $customValue);
+            $val = $customValue['value'] ?? NULL;
+            $label = $customValue['label'] ?? NULL;
             $label = strtolower($label);
             $value = strtolower(trim($value));
             if (($value == $label) || ($value == strtolower($val))) {
diff --git a/civicrm/CRM/Event/Page/EventInfo.php b/civicrm/CRM/Event/Page/EventInfo.php
index 664105fabe..c07681da8b 100644
--- a/civicrm/CRM/Event/Page/EventInfo.php
+++ b/civicrm/CRM/Event/Page/EventInfo.php
@@ -117,7 +117,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
               $values['feeBlock']['value'][$fieldCnt] = '';
               $values['feeBlock']['label'][$fieldCnt] = $fieldValues['label'];
               $values['feeBlock']['lClass'][$fieldCnt] = 'price_set_option_group-label';
-              $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array::value('is_display_amounts', $fieldValues);
+              $values['feeBlock']['isDisplayAmount'][$fieldCnt] = $fieldValues['is_display_amounts'] ?? NULL;
               $fieldCnt++;
               $labelClass = 'price_set_option-label';
             }
@@ -126,9 +126,9 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
             }
             // show tax rate with amount
             $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-            $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
-            $displayOpt = CRM_Utils_Array::value('tax_display_settings', $invoiceSettings);
-            $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+            $taxTerm = $invoiceSettings['tax_term'] ?? NULL;
+            $displayOpt = $invoiceSettings['tax_display_settings'] ?? NULL;
+            $invoicing = $invoiceSettings['invoicing'] ?? NULL;
             foreach ($fieldValues['options'] as $optionId => $optionVal) {
               if (CRM_Utils_Array::value('visibility_id', $optionVal) != array_search('public', $visibility) &&
                 $adminFieldVisible == FALSE
@@ -136,7 +136,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
                 continue;
               }
 
-              $values['feeBlock']['isDisplayAmount'][$fieldCnt] = CRM_Utils_Array::value('is_display_amounts', $fieldValues);
+              $values['feeBlock']['isDisplayAmount'][$fieldCnt] = $fieldValues['is_display_amounts'] ?? NULL;
               if ($invoicing && isset($optionVal['tax_amount'])) {
                 $values['feeBlock']['value'][$fieldCnt] = CRM_Price_BAO_PriceField::getTaxLabel($optionVal, 'amount', $displayOpt, $taxTerm);
                 $values['feeBlock']['tax_amount'][$fieldCnt] = $optionVal['tax_amount'];
@@ -238,7 +238,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
       $this->assign('findParticipants', $findParticipants);
     }
 
-    $participantListingID = CRM_Utils_Array::value('participant_listing_id', $values['event']);
+    $participantListingID = $values['event']['participant_listing_id'] ?? NULL;
     if ($participantListingID) {
       $participantListingURL = CRM_Utils_System::url('civicrm/event/participant',
         "reset=1&id={$this->_id}",
@@ -247,7 +247,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
       $this->assign('participantListingURL', $participantListingURL);
     }
 
-    $hasWaitingList = CRM_Utils_Array::value('has_waitlist', $values['event']);
+    $hasWaitingList = $values['event']['has_waitlist'] ?? NULL;
     $eventFullMessage = CRM_Event_BAO_Participant::eventFull($this->_id,
       FALSE,
       $hasWaitingList
@@ -297,8 +297,8 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
     $session = CRM_Core_Session::singleton();
     $params = [
       'contact_id' => $session->get('userID'),
-      'event_id' => CRM_Utils_Array::value('id', $values['event']),
-      'role_id' => CRM_Utils_Array::value('default_role_id', $values['event']),
+      'event_id' => $values['event']['id'] ?? NULL,
+      'role_id' => $values['event']['default_role_id'] ?? NULL,
     ];
 
     if ($eventFullMessage && ($noFullMsg == 'false') || CRM_Event_BAO_Event::checkRegistration($params)) {
@@ -317,7 +317,7 @@ class CRM_Event_Page_EventInfo extends CRM_Core_Page {
         }
       }
       elseif ($hasWaitingList) {
-        $statusMessage = CRM_Utils_Array::value('waitlist_text', $values['event']);
+        $statusMessage = $values['event']['waitlist_text'] ?? NULL;
         if (!$statusMessage) {
           $statusMessage = ts('Event is currently full, but you can register and be a part of waiting list.');
         }
diff --git a/civicrm/CRM/Event/Page/List.php b/civicrm/CRM/Event/Page/List.php
new file mode 100644
index 0000000000..9a5cb1c513
--- /dev/null
+++ b/civicrm/CRM/Event/Page/List.php
@@ -0,0 +1,36 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Display a list of events on a page
+ */
+class CRM_Event_Page_List extends CRM_Core_Page {
+
+  public function run() {
+    $id = CRM_Utils_Request::retrieveValue('id', 'Positive', NULL, FALSE, 'GET');
+    $type = CRM_Utils_Request::retrieveValue('type', 'Positive', 0);
+    $start = CRM_Utils_Request::retrieveValue('start', 'Positive', 0);
+    $end = CRM_Utils_Request::retrieveValue('end', 'Positive', 0);
+
+    $info = CRM_Event_BAO_Event::getCompleteInfo($start, $type, $id, $end);
+    $this->assign('events', $info);
+
+    // check if we're in shopping cart mode for events
+    $enable_cart = (boolean) Civi::settings()->get('enable_cart');
+    $this->assign('eventCartEnabled', $enable_cart);
+
+    if ($enable_cart) {
+      $this->assign('registration_links', TRUE);
+    }
+    return parent::run();
+  }
+
+}
diff --git a/civicrm/CRM/Event/Page/ManageEvent.php b/civicrm/CRM/Event/Page/ManageEvent.php
index a0b7c3b283..20b4ed5e86 100644
--- a/civicrm/CRM/Event/Page/ManageEvent.php
+++ b/civicrm/CRM/Event/Page/ManageEvent.php
@@ -416,10 +416,10 @@ ORDER BY start_date desc
         }
 
         //show campaigns on selector.
-        $manageEvent[$dao->id]['campaign'] = CRM_Utils_Array::value($dao->campaign_id, $allCampaigns);
+        $manageEvent[$dao->id]['campaign'] = $allCampaigns[$dao->campaign_id] ?? NULL;
         $manageEvent[$dao->id]['reminder'] = CRM_Core_BAO_ActionSchedule::isConfigured($dao->id, $mapping->getId());
-        $manageEvent[$dao->id]['is_pcp_enabled'] = CRM_Utils_Array::value($dao->id, $eventPCPS);
-        $manageEvent[$dao->id]['event_type'] = CRM_Utils_Array::value($manageEvent[$dao->id]['event_type_id'], $eventType);
+        $manageEvent[$dao->id]['is_pcp_enabled'] = $eventPCPS[$dao->id] ?? NULL;
+        $manageEvent[$dao->id]['event_type'] = $eventType[$manageEvent[$dao->id]['event_type_id']] ?? NULL;
         $manageEvent[$dao->id]['is_repeating_event'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_RecurringEntity', $dao->id, 'parent_id', 'entity_id');
         // allow hooks to set 'field' value which allows configuration pop-up to show a tab as enabled/disabled
         CRM_Utils_Hook::tabset('civicrm/event/manage/rows', $manageEvent, ['event_id' => $dao->id]);
diff --git a/civicrm/CRM/Event/Page/ParticipantListing/NameStatusAndDate.php b/civicrm/CRM/Event/Page/ParticipantListing/NameStatusAndDate.php
index fef5ae7b12..8277180b52 100644
--- a/civicrm/CRM/Event/Page/ParticipantListing/NameStatusAndDate.php
+++ b/civicrm/CRM/Event/Page/ParticipantListing/NameStatusAndDate.php
@@ -86,7 +86,7 @@ LIMIT    $offset, $rowCount";
     $object = CRM_Core_DAO::executeQuery($query, $params);
     $statusLookup = CRM_Event_PseudoConstant::participantStatus(NULL, NULL, 'label');
     while ($object->fetch()) {
-      $status = CRM_Utils_Array::value($object->status_id, $statusLookup);
+      $status = $statusLookup[$object->status_id] ?? NULL;
       $row = [
         'id' => $object->contact_id,
         'participantID' => $object->participant_id,
diff --git a/civicrm/CRM/Event/PseudoConstant.php b/civicrm/CRM/Event/PseudoConstant.php
index c6439a44b8..d99496720c 100644
--- a/civicrm/CRM/Event/PseudoConstant.php
+++ b/civicrm/CRM/Event/PseudoConstant.php
@@ -46,8 +46,8 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
 
   /**
    * Participant Listing
-   *
    * @var array
+   * @deprecated
    */
   private static $participantListing;
 
@@ -67,6 +67,7 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
   /**
    * Personal campaign pages
    * @var array
+   * @deprecated
    */
   private static $pcPage;
 
@@ -125,7 +126,7 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
 
     $index = $cond ? $cond : 'No Condition';
     $index = "{$index}_{$retColumn}";
-    if (!CRM_Utils_Array::value($index, self::$participantStatus)) {
+    if (empty(self::$participantStatus[$index])) {
       self::$participantStatus[$index] = [];
       CRM_Core_PseudoConstant::populate(self::$participantStatus[$index],
         'CRM_Event_DAO_ParticipantStatusType',
@@ -182,7 +183,7 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
    */
   public static function &participantRole($id = NULL, $cond = NULL) {
     $index = $cond ? $cond : 'No Condition';
-    if (!CRM_Utils_Array::value($index, self::$participantRole)) {
+    if (empty(self::$participantRole[$index])) {
       self::$participantRole[$index] = [];
 
       $condition = NULL;
@@ -205,13 +206,13 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
   /**
    * Get all the participant listings.
    *
-   *
+   * @deprecated
    * @param int $id
-   *
    * @return array|string
    *   array reference of all participant listings if any
    */
   public static function &participantListing($id = NULL) {
+    CRM_Core_Error::deprecatedFunctionWarning('Function participantListing will be removed');
     if (!self::$participantListing) {
       self::$participantListing = [];
       self::$participantListing = CRM_Core_OptionGroup::values('participant_listing');
@@ -285,12 +286,13 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
   /**
    * Get all the Personal campaign pages.
    *
-   *
+   * @deprecated
    * @param int $id
    * @return array
    *   array reference of all pcp if any
    */
   public static function &pcPage($id = NULL) {
+    CRM_Core_Error::deprecatedFunctionWarning('Function pcPage will be removed');
     if (!self::$pcPage) {
       CRM_Core_PseudoConstant::populate(self::$pcPage,
         'CRM_PCP_DAO_PCP',
@@ -298,7 +300,7 @@ class CRM_Event_PseudoConstant extends CRM_Core_PseudoConstant {
       );
     }
     if ($id) {
-      return CRM_Utils_Array::value($id, self::$pcPage);
+      return self::$pcPage[$id] ?? NULL;
     }
     return self::$pcPage;
   }
diff --git a/civicrm/CRM/Event/Selector/Search.php b/civicrm/CRM/Event/Selector/Search.php
index 1c5f4b027a..adbc83513f 100644
--- a/civicrm/CRM/Event/Selector/Search.php
+++ b/civicrm/CRM/Event/Selector/Search.php
@@ -333,7 +333,7 @@ class CRM_Event_Selector_Search extends CRM_Core_Selector_Base implements CRM_Co
       }
 
       //carry campaign on selectors.
-      $row['campaign'] = CRM_Utils_Array::value($result->participant_campaign_id, $allCampaigns);
+      $row['campaign'] = $allCampaigns[$result->participant_campaign_id] ?? NULL;
       $row['campaign_id'] = $result->participant_campaign_id;
 
       // gross hack to show extra information for pending status
@@ -344,7 +344,7 @@ class CRM_Event_Selector_Search extends CRM_Core_Selector_Base implements CRM_Co
         $statusClass = $statusClasses[$statusId];
       }
 
-      $row['showConfirmUrl'] = ($statusClass == 'Pending') ? TRUE : FALSE;
+      $row['showConfirmUrl'] = $statusClass == 'Pending';
 
       if (!empty($row['participant_is_test'])) {
         $row['participant_status'] = CRM_Core_TestEntity::appendTestText($row['participant_status']);
diff --git a/civicrm/CRM/Event/StateMachine/Search.php b/civicrm/CRM/Event/StateMachine/Search.php
index 0c76eb6cde..f98de49db6 100644
--- a/civicrm/CRM/Event/StateMachine/Search.php
+++ b/civicrm/CRM/Event/StateMachine/Search.php
@@ -71,7 +71,7 @@ class CRM_Event_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Event/Tokens.php b/civicrm/CRM/Event/Tokens.php
index 5c6c685875..15784cd872 100644
--- a/civicrm/CRM/Event/Tokens.php
+++ b/civicrm/CRM/Event/Tokens.php
@@ -93,7 +93,7 @@ LEFT JOIN civicrm_phone phone ON phone.id = lb.phone_id
       $stateProvince = \CRM_Core_PseudoConstant::stateProvince();
       $loc['street_address'] = $actionSearchResult->street_address;
       $loc['city'] = $actionSearchResult->city;
-      $loc['state_province'] = \CRM_Utils_Array::value($actionSearchResult->state_province_id, $stateProvince);
+      $loc['state_province'] = $stateProvince[$actionSearchResult->state_province_id] ?? NULL;
       $loc['postal_code'] = $actionSearchResult->postal_code;
       //$entityTokenParams[$tokenEntity][$field] = \CRM_Utils_Address::format($loc);
       $row->tokens($entity, $field, \CRM_Utils_Address::format($loc));
@@ -115,7 +115,7 @@ LEFT JOIN civicrm_phone phone ON phone.id = lb.phone_id
       }
       elseif (!empty($actionSearchResult->entityID)) {
         $info = \CRM_Contribute_BAO_Contribution::getPaymentInfo($actionSearchResult->entityID, 'event');
-        $balancePay = \CRM_Utils_Array::value('balance', $info);
+        $balancePay = $info['balance'] ?? NULL;
         $balancePay = \CRM_Utils_Money::format($balancePay);
       }
       $row->tokens($entity, $field, $balancePay);
diff --git a/civicrm/CRM/Event/xml/Menu/Event.xml b/civicrm/CRM/Event/xml/Menu/Event.xml
index c9cc607287..aaf33b861c 100644
--- a/civicrm/CRM/Event/xml/Menu/Event.xml
+++ b/civicrm/CRM/Event/xml/Menu/Event.xml
@@ -44,11 +44,19 @@
   <item>
      <path>civicrm/event/ical</path>
      <title>Current and Upcoming Events</title>
-     <page_callback>CRM_Event_Page_ICalendar</page_callback>
+     <page_callback>CRM_Event_ICalendar::run</page_callback>
      <access_arguments>view event info</access_arguments>
      <is_public>true</is_public>
      <weight>0</weight>
   </item>
+  <item>
+    <path>civicrm/event/list</path>
+    <title>Current and Upcoming Events</title>
+    <page_callback>CRM_Event_Page_List</page_callback>
+    <access_arguments>view event info</access_arguments>
+    <is_public>true</is_public>
+    <weight>0</weight>
+  </item>
   <item>
      <path>civicrm/event/participant</path>
      <title>Event Participants List</title>
diff --git a/civicrm/CRM/Export/BAO/ExportProcessor.php b/civicrm/CRM/Export/BAO/ExportProcessor.php
index 8453d02475..fce1247c2a 100644
--- a/civicrm/CRM/Export/BAO/ExportProcessor.php
+++ b/civicrm/CRM/Export/BAO/ExportProcessor.php
@@ -518,7 +518,7 @@ class CRM_Export_BAO_ExportProcessor {
    * @return string
    */
   public function getRelationshipValue($relationshipType, $contactID, $field) {
-    return isset($this->relatedContactValues[$relationshipType][$contactID][$field]) ? $this->relatedContactValues[$relationshipType][$contactID][$field] : '';
+    return $this->relatedContactValues[$relationshipType][$contactID][$field] ?? '';
   }
 
   /**
@@ -1006,7 +1006,7 @@ class CRM_Export_BAO_ExportProcessor {
           $fieldValue = $phoneTypes[$fieldValue];
         }
         elseif ($field == 'provider_id' || $field == 'im_provider') {
-          $fieldValue = CRM_Utils_Array::value($fieldValue, $imProviders);
+          $fieldValue = $imProviders[$fieldValue] ?? NULL;
         }
         elseif (strstr($field, 'master_id')) {
           // @todo - why not just $field === 'master_id'  - what else would it be?
@@ -1031,7 +1031,7 @@ class CRM_Export_BAO_ExportProcessor {
       if (!$this->isExportSpecifiedPaymentFields()) {
         $nullContributionDetails = array_fill_keys(array_keys($this->getPaymentHeaders()), NULL);
         if ($this->isExportPaymentFields()) {
-          $paymentData = CRM_Utils_Array::value($row[$paymentTableId], $paymentDetails);
+          $paymentData = $paymentDetails[$row[$paymentTableId]] ?? NULL;
           if (!is_array($paymentData) || empty($paymentData)) {
             $paymentData = $nullContributionDetails;
           }
@@ -1170,7 +1170,7 @@ class CRM_Export_BAO_ExportProcessor {
     }
     elseif ($this->isExportSpecifiedPaymentFields() && array_key_exists($field, $this->getcomponentPaymentFields())) {
       $paymentTableId = $this->getPaymentTableID();
-      $paymentData = CRM_Utils_Array::value($iterationDAO->$paymentTableId, $paymentDetails);
+      $paymentData = $paymentDetails[$iterationDAO->$paymentTableId] ?? NULL;
       $payFieldMapper = [
         'componentPaymentField_total_amount' => 'total_amount',
         'componentPaymentField_contribution_status' => 'contribution_status',
@@ -1357,7 +1357,7 @@ class CRM_Export_BAO_ExportProcessor {
   public function setRelationshipReturnProperties($value, $relationshipKey) {
     $relationField = $value['name'];
     $relIMProviderId = NULL;
-    $relLocTypeId = CRM_Utils_Array::value('location_type_id', $value);
+    $relLocTypeId = $value['location_type_id'] ?? NULL;
     $locationName = CRM_Core_PseudoConstant::getName('CRM_Core_BAO_Address', 'location_type_id', $relLocTypeId);
     $relPhoneTypeId = CRM_Utils_Array::value('phone_type_id', $value, ($locationName ? 'Primary' : NULL));
     $relIMProviderId = CRM_Utils_Array::value('im_provider_id', $value, ($locationName ? 'Primary' : NULL));
@@ -2104,7 +2104,7 @@ WHERE  id IN ( $deleteIDString )
     if (!empty($greetingOptions)) {
       // Greeting options is keyed by 'postal_greeting' or 'addressee'.
       foreach ($greetingOptions as $key => $value) {
-        $option = CRM_Utils_Array::value($key, $formValues);
+        $option = $formValues[$key] ?? NULL;
         if ($option) {
           if ($greetingOptions[$key][$option] == ts('Other')) {
             $formValues[$key] = $formValues["{$key}_other"];
@@ -2185,7 +2185,7 @@ WHERE  id IN ( $deleteIDString )
           $fieldValue = $phoneTypes[$relationValue];
         }
         elseif ($relationField == 'provider_id') {
-          $fieldValue = CRM_Utils_Array::value($relationValue, $imProviders);
+          $fieldValue = $imProviders[$relationValue] ?? NULL;
         }
         // CRM-13995
         elseif (is_object($relDAO) && in_array($relationField, [
@@ -2356,7 +2356,7 @@ LIMIT $offset, $limit
     // the Windows variant but is tested with MS Excel for Mac (Office 365 v 16.31)
     // and it continues to work on Libre Office, Numbers, Notes etc.
     echo "\xEF\xBB\xBF";
-    CRM_Core_Report_Excel::makeCSVTable($headerRows, [], NULL, TRUE);
+    CRM_Core_Report_Excel::makeCSVTable($headerRows, [], TRUE);
   }
 
   /**
@@ -2367,7 +2367,6 @@ LIMIT $offset, $limit
     CRM_Core_Report_Excel::writeCSVFile($this->getExportFileName(),
       $headerRows,
       $componentDetails,
-      NULL,
       FALSE
     );
   }
diff --git a/civicrm/CRM/Export/Form/Select.php b/civicrm/CRM/Export/Form/Select.php
index 043c277154..af4b2bba7f 100644
--- a/civicrm/CRM/Export/Form/Select.php
+++ b/civicrm/CRM/Export/Form/Select.php
@@ -340,7 +340,7 @@ FROM   {$this->_componentTable}
       ];
 
       foreach ($greetings as $key => $value) {
-        $otherOption = CRM_Utils_Array::value($key, $params);
+        $otherOption = $params[$key] ?? NULL;
 
         if ((CRM_Utils_Array::value($otherOption, $self->_greetingOptions[$key]) == ts('Other')) && empty($params[$value])) {
 
@@ -372,7 +372,7 @@ FROM   {$this->_componentTable}
     // all submitted options or any other argument
     $exportParams = $params;
 
-    $mappingId = CRM_Utils_Array::value('mapping', $params);
+    $mappingId = $params['mapping'] ?? NULL;
     if ($mappingId) {
       $this->set('mappingId', $mappingId);
     }
diff --git a/civicrm/CRM/Extension/Manager.php b/civicrm/CRM/Extension/Manager.php
index 1040ea119e..ce4bca1550 100644
--- a/civicrm/CRM/Extension/Manager.php
+++ b/civicrm/CRM/Extension/Manager.php
@@ -13,6 +13,10 @@
  * The extension manager handles installing, disabling enabling, and
  * uninstalling extensions.
  *
+ * You should obtain a singleton of this class via
+ *
+ * $manager = CRM_Extension_Manager::singleton()->getManager();
+ *
  * @package CRM
  * @copyright CiviCRM LLC https://civicrm.org/licensing
  */
@@ -94,6 +98,34 @@ class CRM_Extension_Manager {
    */
   public $statuses;
 
+  /**
+   * Live process(es) per extension.
+   *
+   * @var array
+   *
+   * Format is: {
+   *   extensionKey => [
+   *    ['operation' => 'install|enable|uninstall|disable', 'phase' => 'queued|live|completed'
+   *     ...
+   *   ],
+   *   ...
+   * }
+   *
+   * The inner array is a stack, so the most recent current operation is the
+   * last entry. As this manager handles multiple extensions at once, here's
+   * the flow for an install operation.
+   *
+   * $manager->install(['ext1', 'ext2']);
+   *
+   * 0. {}
+   * 1. { ext1: ['install'], ext2: ['install'] }
+   * 2. { ext1: ['install', 'installing'], ext2: ['install'] }
+   * 3. { ext1: ['install'], ext2: ['install', 'installing'] }
+   * 4. { ext1: ['install'], ext2: ['install'] }
+   * 5. {}
+   */
+  protected $processes = [];
+
   /**
    * Class constructor.
    *
@@ -201,9 +233,10 @@ class CRM_Extension_Manager {
    *
    * @param string|array $keys
    *   One or more extension keys.
+   * @param string $mode install|enable
    * @throws CRM_Extension_Exception
    */
-  public function install($keys) {
+  public function install($keys, $mode = 'install') {
     $keys = (array) $keys;
     $origStatuses = $this->getStatuses();
 
@@ -221,6 +254,9 @@ class CRM_Extension_Manager {
       throw new CRM_Extension_Exception('Cannot install incompatible extension: ' . implode(', ', $incompatible));
     }
 
+    // Keep state for these operations.
+    $this->addProcess($keys, $mode);
+
     foreach ($keys as $key) {
       /** @var CRM_Extension_Info $info */
       /** @var CRM_Extension_Manager_Base $typeManager */
@@ -228,11 +264,17 @@ class CRM_Extension_Manager {
 
       switch ($origStatuses[$key]) {
         case self::STATUS_INSTALLED:
-          // ok, nothing to do
+          // ok, nothing to do. As such the status of this process is no longer
+          // 'install' install was the intent, which might have resulted in
+          // changes but these changes will not be happening, so processes that
+          // are sensitive to installs (like the managed entities reconcile
+          // operation) should not assume that these changes have happened.
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_DISABLED:
           // re-enable it
+          $this->addProcess([$key], 'enabling');
           $typeManager->onPreEnable($info);
           $this->_setExtensionActive($info, 1);
           $typeManager->onPostEnable($info);
@@ -241,10 +283,13 @@ class CRM_Extension_Manager {
           // later extensions to access classes from earlier extensions.
           $this->statuses = NULL;
           $this->mapper->refresh();
+
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_UNINSTALLED:
           // install anew
+          $this->addProcess([$key], 'installing');
           $typeManager->onPreInstall($info);
           $this->_createExtensionEntry($info);
           $typeManager->onPostInstall($info);
@@ -253,6 +298,8 @@ class CRM_Extension_Manager {
           // later extensions to access classes from earlier extensions.
           $this->statuses = NULL;
           $this->mapper->refresh();
+
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_UNKNOWN:
@@ -264,6 +311,7 @@ class CRM_Extension_Manager {
     $this->statuses = NULL;
     $this->mapper->refresh();
     CRM_Core_Invoke::rebuildMenuAndCaches(TRUE);
+
     $schema = new CRM_Logging_Schema();
     $schema->fixSchemaDifferences();
 
@@ -282,7 +330,9 @@ class CRM_Extension_Manager {
 
         case self::STATUS_UNINSTALLED:
           // install anew
+          $this->addProcess([$key], 'installing');
           $typeManager->onPostPostInstall($info);
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_UNKNOWN:
@@ -291,6 +341,8 @@ class CRM_Extension_Manager {
       }
     }
 
+    // All processes for these keys
+    $this->popProcess($keys);
   }
 
   /**
@@ -301,7 +353,7 @@ class CRM_Extension_Manager {
    * @throws CRM_Extension_Exception
    */
   public function enable($keys) {
-    $this->install($keys);
+    $this->install($keys, 'enable');
   }
 
   /**
@@ -326,14 +378,18 @@ class CRM_Extension_Manager {
       throw new CRM_Extension_Exception_DependencyException("Cannot disable extension due to dependencies. Consider disabling all these: " . implode(',', $disableRequirements));
     }
 
+    $this->addProcess($keys, 'disable');
+
     foreach ($keys as $key) {
       switch ($origStatuses[$key]) {
         case self::STATUS_INSTALLED:
+          $this->addProcess([$key], 'disabling');
           // throws Exception
           list ($info, $typeManager) = $this->_getInfoTypeHandler($key);
           $typeManager->onPreDisable($info);
           $this->_setExtensionActive($info, 0);
           $typeManager->onPostDisable($info);
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_INSTALLED_MISSING:
@@ -348,6 +404,8 @@ class CRM_Extension_Manager {
         case self::STATUS_DISABLED_MISSING:
         case self::STATUS_UNINSTALLED:
           // ok, nothing to do
+          // Remove the 'disable' process as we're not doing that.
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_UNKNOWN:
@@ -359,6 +417,8 @@ class CRM_Extension_Manager {
     $this->statuses = NULL;
     $this->mapper->refresh();
     CRM_Core_Invoke::rebuildMenuAndCaches(TRUE);
+
+    $this->popProcess($keys);
   }
 
   /**
@@ -375,6 +435,8 @@ class CRM_Extension_Manager {
     // TODO: to mitigate the risk of crashing during installation, scan
     // keys/statuses/types before doing anything
 
+    $this->addProcess($keys, 'uninstall');
+
     foreach ($keys as $key) {
       switch ($origStatuses[$key]) {
         case self::STATUS_INSTALLED:
@@ -382,6 +444,7 @@ class CRM_Extension_Manager {
           throw new CRM_Extension_Exception("Cannot uninstall extension; disable it first: $key");
 
         case self::STATUS_DISABLED:
+          $this->addProcess([$key], 'uninstalling');
           // throws Exception
           list ($info, $typeManager) = $this->_getInfoTypeHandler($key);
           $typeManager->onPreUninstall($info);
@@ -399,6 +462,8 @@ class CRM_Extension_Manager {
 
         case self::STATUS_UNINSTALLED:
           // ok, nothing to do
+          // remove the 'uninstall' process since we're not doing that.
+          $this->popProcess([$key]);
           break;
 
         case self::STATUS_UNKNOWN:
@@ -410,6 +475,7 @@ class CRM_Extension_Manager {
     $this->statuses = NULL;
     $this->mapper->refresh();
     CRM_Core_Invoke::rebuildMenuAndCaches(TRUE);
+    $this->popProcess($keys);
   }
 
   /**
@@ -491,6 +557,34 @@ class CRM_Extension_Manager {
     $this->mapper->refresh();
   }
 
+  /**
+   * Return current processes for given extension.
+   *
+   * @param String $key extension key
+   *
+   * @return array
+   */
+  public function getActiveProcesses(string $key) :Array {
+    return $this->processes[$key] ?? [];
+  }
+
+  /**
+   * Determine if the extension specified is currently involved in an install
+   * or enable process. Just sugar code to make things more readable.
+   *
+   * @param String $key extension key
+   *
+   * @return bool
+   */
+  public function extensionIsBeingInstalledOrEnabled($key) :bool {
+    foreach ($this->getActiveProcesses($key) as $process) {
+      if (in_array($process, ['install', 'installing', 'enable', 'enabling'])) {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+
   // ----------------------
 
   /**
@@ -711,6 +805,15 @@ class CRM_Extension_Manager {
     return $sorter->sort();
   }
 
+  /**
+   * Provides way to set processes property for phpunit tests - not for general use.
+   *
+   * @param $processes
+   */
+  public function setProcessesForTesting(array $processes) {
+    $this->processes = $processes;
+  }
+
   /**
    * @param $infos
    * @param $filterStatuses
@@ -726,4 +829,29 @@ class CRM_Extension_Manager {
     return $matches;
   }
 
+  /**
+   * Add a process to the stacks for the extensions.
+   *
+   * @param array $keys extensionKey
+   * @param string $process one of: install|uninstall|enable|disable|installing|uninstalling|enabling|disabling
+   */
+  protected function addProcess(array $keys, string $process) {
+    foreach ($keys as $key) {
+      $this->processes[$key][] = $process;
+    }
+  }
+
+  /**
+   * Pop the top op from the stacks for the extensions.
+   *
+   * @param array $keys extensionKey
+   */
+  protected function popProcess(array $keys) {
+    foreach ($keys as $key) {
+      if (!empty($this->process[$key])) {
+        array_pop($this->process[$key]);
+      }
+    }
+  }
+
 }
diff --git a/civicrm/CRM/Extension/Manager/Report.php b/civicrm/CRM/Extension/Manager/Report.php
index 0b164791cf..bd8b5d67a7 100644
--- a/civicrm/CRM/Extension/Manager/Report.php
+++ b/civicrm/CRM/Extension/Manager/Report.php
@@ -53,7 +53,6 @@ class CRM_Extension_Manager_Report extends CRM_Extension_Manager_Base {
     $weight = CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_OptionValue',
       ['option_group_id' => $this->groupId]
     );
-    $ids = [];
     $params = [
       'label' => $info->label . ' (' . $info->key . ')',
       'value' => $info->typeInfo['reportUrl'],
@@ -65,7 +64,7 @@ class CRM_Extension_Manager_Report extends CRM_Extension_Manager_Base {
       'is_active' => 1,
     ];
 
-    $optionValue = CRM_Core_BAO_OptionValue::add($params, $ids);
+    $optionValue = CRM_Core_BAO_OptionValue::add($params);
   }
 
   /**
diff --git a/civicrm/CRM/Extension/Manager/Search.php b/civicrm/CRM/Extension/Manager/Search.php
index a5da9e47c2..d79e2472ae 100644
--- a/civicrm/CRM/Extension/Manager/Search.php
+++ b/civicrm/CRM/Extension/Manager/Search.php
@@ -55,8 +55,7 @@ class CRM_Extension_Manager_Search extends CRM_Extension_Manager_Base {
       'is_active' => 1,
     ];
 
-    $ids = [];
-    $optionValue = CRM_Core_BAO_OptionValue::add($params, $ids);
+    $optionValue = CRM_Core_BAO_OptionValue::add($params);
 
     return $optionValue ? TRUE : FALSE;
   }
diff --git a/civicrm/CRM/Financial/BAO/FinancialAccount.php b/civicrm/CRM/Financial/BAO/FinancialAccount.php
index 0b235a72ef..9048d99028 100644
--- a/civicrm/CRM/Financial/BAO/FinancialAccount.php
+++ b/civicrm/CRM/Financial/BAO/FinancialAccount.php
@@ -379,7 +379,7 @@ LIMIT 1";
     if (!Civi::settings()->get('deferred_revenue_enabled')) {
       return FALSE;
     }
-    $recognitionDate = CRM_Utils_Array::value('revenue_recognition_date', $params);
+    $recognitionDate = $params['revenue_recognition_date'] ?? NULL;
     if (!(!CRM_Utils_System::isNull($recognitionDate)
       || ($contributionID && isset($params['prevContribution'])
         && !CRM_Utils_System::isNull($params['prevContribution']->revenue_recognition_date)))
@@ -387,8 +387,8 @@ LIMIT 1";
       return FALSE;
     }
 
-    $lineItems = CRM_Utils_Array::value('line_item', $params);
-    $financialTypeID = CRM_Utils_Array::value('financial_type_id', $params);
+    $lineItems = $params['line_item'] ?? NULL;
+    $financialTypeID = $params['financial_type_id'] ?? NULL;
     if (!$financialTypeID) {
       $financialTypeID = $params['prevContribution']->financial_type_id;
     }
diff --git a/civicrm/CRM/Financial/BAO/FinancialItem.php b/civicrm/CRM/Financial/BAO/FinancialItem.php
index 378f98eff6..60c6332f6c 100644
--- a/civicrm/CRM/Financial/BAO/FinancialItem.php
+++ b/civicrm/CRM/Financial/BAO/FinancialItem.php
@@ -86,7 +86,7 @@ class CRM_Financial_BAO_FinancialItem extends CRM_Financial_DAO_FinancialItem {
 
     if ($taxTrxnID) {
       $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-      $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
+      $taxTerm = $invoiceSettings['tax_term'] ?? NULL;
       $params['amount'] = $lineItem->tax_amount;
       $params['description'] = $taxTerm;
       $accountRelName = 'Sales Tax Account is';
@@ -142,7 +142,7 @@ class CRM_Financial_BAO_FinancialItem extends CRM_Financial_DAO_FinancialItem {
     }
 
     $financialItem->save();
-    $financialtrxnIDS = CRM_Utils_Array::value('id', $trxnIds);
+    $financialtrxnIDS = $trxnIds['id'] ?? NULL;
     if (!empty($financialtrxnIDS)) {
       if (!is_array($financialtrxnIDS)) {
         $financialtrxnIDS = [$financialtrxnIDS];
diff --git a/civicrm/CRM/Financial/BAO/FinancialType.php b/civicrm/CRM/Financial/BAO/FinancialType.php
index c551d67529..65c20c0221 100644
--- a/civicrm/CRM/Financial/BAO/FinancialType.php
+++ b/civicrm/CRM/Financial/BAO/FinancialType.php
@@ -90,7 +90,7 @@ class CRM_Financial_BAO_FinancialType extends CRM_Financial_DAO_FinancialType {
     $financialType = new CRM_Financial_DAO_FinancialType();
     $financialType->copyValues($params);
     if (!empty($ids['financialType'])) {
-      $financialType->id = CRM_Utils_Array::value('financialType', $ids);
+      $financialType->id = $ids['financialType'] ?? NULL;
       if (self::isACLFinancialTypeStatus()) {
         $prevName = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_FinancialType', $financialType->id, 'name');
         if ($prevName != $params['name']) {
diff --git a/civicrm/CRM/Financial/BAO/Payment.php b/civicrm/CRM/Financial/BAO/Payment.php
index 7cd09259cc..8a06f7f26c 100644
--- a/civicrm/CRM/Financial/BAO/Payment.php
+++ b/civicrm/CRM/Financial/BAO/Payment.php
@@ -303,12 +303,12 @@ class CRM_Financial_BAO_Payment {
       'amountOwed' => $entities['payment']['balance'],
       'totalPaid' => $entities['payment']['paid'],
       'paymentAmount' => $entities['payment']['total_amount'],
-      'checkNumber' => CRM_Utils_Array::value('check_number', $entities['payment']),
+      'checkNumber' => $entities['payment']['check_number'] ?? NULL,
       'receive_date' => $entities['payment']['trxn_date'],
       'paidBy' => CRM_Core_PseudoConstant::getLabel('CRM_Core_BAO_FinancialTrxn', 'payment_instrument_id', $entities['payment']['payment_instrument_id']),
       'isShowLocation' => (!empty($entities['event']) ? $entities['event']['is_show_location'] : FALSE),
-      'location' => CRM_Utils_Array::value('location', $entities),
-      'event' => CRM_Utils_Array::value('event', $entities),
+      'location' => $entities['location'] ?? NULL,
+      'event' => $entities['event'] ?? NULL,
       'component' => (!empty($entities['event']) ? 'event' : 'contribution'),
       'isRefund' => $entities['payment']['total_amount'] < 0,
       'isAmountzero' => $entities['payment']['total_amount'] === 0,
@@ -450,7 +450,7 @@ class CRM_Financial_BAO_Payment {
       $lineItems[$lineItemID]['balance'] = $lineItem['subTotal'] - $lineItems[$lineItemID]['paid'];
 
       if (!empty($lineItemOverrides)) {
-        $lineItems[$lineItemID]['allocation'] = CRM_Utils_Array::value($lineItemID, $lineItemOverrides);
+        $lineItems[$lineItemID]['allocation'] = $lineItemOverrides[$lineItemID] ?? NULL;
       }
       else {
         $lineItems[$lineItemID]['allocation'] = $lineItems[$lineItemID]['balance'] * $ratio;
diff --git a/civicrm/CRM/Financial/BAO/PaymentProcessor.php b/civicrm/CRM/Financial/BAO/PaymentProcessor.php
index b2508ec865..363828f31a 100644
--- a/civicrm/CRM/Financial/BAO/PaymentProcessor.php
+++ b/civicrm/CRM/Financial/BAO/PaymentProcessor.php
@@ -262,8 +262,8 @@ class CRM_Financial_BAO_PaymentProcessor extends CRM_Financial_DAO_PaymentProces
    * @return int
    */
   public static function defaultComparison($processor1, $processor2) {
-    $p1 = CRM_Utils_Array::value('is_default', $processor1);
-    $p2 = CRM_Utils_Array::value('is_default', $processor2);
+    $p1 = $processor1['is_default'] ?? NULL;
+    $p2 = $processor2['is_default'] ?? NULL;
     if ($p1 == $p2) {
       return 0;
     }
@@ -335,7 +335,7 @@ class CRM_Financial_BAO_PaymentProcessor extends CRM_Financial_DAO_PaymentProces
         }
       }
       $processors['values'][$processor['id']]['payment_processor_type'] = $processor['payment_processor_type'] = $processors['values'][$processor['id']]['api.payment_processor_type.getsingle']['name'];
-      $processors['values'][$processor['id']]['object'] = Civi\Payment\System::singleton()->getByProcessor($processor);
+      $processors['values'][$processor['id']]['object'] = Civi\Payment\System::singleton()->getByProcessor($processors['values'][$processor['id']]);
     }
 
     // Add the pay-later pseudo-processor.
@@ -448,7 +448,7 @@ class CRM_Financial_BAO_PaymentProcessor extends CRM_Financial_DAO_PaymentProces
     $capabilitiesString = implode('', $capabilities);
     if (!isset(\Civi::$statics[__CLASS__]['supported_capabilities'][$capabilitiesString])) {
       $result = self::getPaymentProcessors($capabilities);
-      \Civi::$statics[__CLASS__]['supported_capabilities'][$capabilitiesString] = (!empty($result) && array_keys($result) !== [0]) ? TRUE : FALSE;
+      \Civi::$statics[__CLASS__]['supported_capabilities'][$capabilitiesString] = (!empty($result) && array_keys($result) !== [0]);
     }
     return \Civi::$statics[__CLASS__]['supported_capabilities'][$capabilitiesString];
   }
@@ -532,7 +532,7 @@ INNER JOIN civicrm_contribution       con ON ( mp.contribution_id = con.id )
 
     }
 
-    $ppID = (isset($dao->ppID1) && $dao->ppID1) ? $dao->ppID1 : (isset($dao->ppID2) ? $dao->ppID2 : NULL);
+    $ppID = (isset($dao->ppID1) && $dao->ppID1) ? $dao->ppID1 : ($dao->ppID2 ?? NULL);
     $mode = (isset($dao->is_test) && $dao->is_test) ? 'test' : 'live';
     if (!$ppID || $type == 'id') {
       $result = $ppID;
diff --git a/civicrm/CRM/Financial/Form/FinancialType.php b/civicrm/CRM/Financial/Form/FinancialType.php
index 2e5e1ea46b..9dce6892ac 100644
--- a/civicrm/CRM/Financial/Form/FinancialType.php
+++ b/civicrm/CRM/Financial/Form/FinancialType.php
@@ -18,10 +18,12 @@
 /**
  * This class generates form components for Financial Type
  */
-class CRM_Financial_Form_FinancialType extends CRM_Contribute_Form {
+class CRM_Financial_Form_FinancialType extends CRM_Core_Form {
 
   use CRM_Core_Form_EntityFormTrait;
 
+  protected $_BAOName = 'CRM_Financial_BAO_FinancialType';
+
   /**
    * Fields for the entity to be assigned to the template.
    *
@@ -98,9 +100,11 @@ class CRM_Financial_Form_FinancialType extends CRM_Contribute_Form {
 
   /**
    * Build the form object.
+   *
+   * @throws \CRM_Core_Exception
    */
   public function buildQuickForm() {
-    self::buildQuickEntityForm();
+    $this->buildQuickEntityForm();
     if ($this->_action & CRM_Core_Action::DELETE) {
       return;
     }
@@ -114,6 +118,8 @@ class CRM_Financial_Form_FinancialType extends CRM_Contribute_Form {
 
   /**
    * Process the form submission.
+   *
+   * @throws \CiviCRM_API3_Exception
    */
   public function postProcess() {
     if ($this->_action & CRM_Core_Action::DELETE) {
@@ -148,11 +154,11 @@ class CRM_Financial_Form_FinancialType extends CRM_Contribute_Form {
           1 => $params['name'],
         ];
         $financialAccounts = civicrm_api3('EntityFinancialAccount', 'get', [
-          'return' => ["financial_account_id.name"],
-          'entity_table' => "civicrm_financial_type",
+          'return' => ['financial_account_id.name'],
+          'entity_table' => 'civicrm_financial_type',
           'entity_id' => $financialType['id'],
           'options' => ['sort' => "id"],
-          'account_relationship' => ['!=' => "Income Account is"],
+          'account_relationship' => ['!=' => 'Income Account is'],
         ]);
         if (!empty($financialAccounts['values'])) {
           foreach ($financialAccounts['values'] as $financialAccount) {
@@ -171,4 +177,19 @@ class CRM_Financial_Form_FinancialType extends CRM_Contribute_Form {
     }
   }
 
+  /**
+   * Set default values for the form. MobileProvider that in edit/view mode
+   * the default values are retrieved from the database
+   *
+   * @return array
+   */
+  public function setDefaultValues() {
+    $defaults = $this->getEntityDefaults();
+
+    if ($this->_action & CRM_Core_Action::ADD) {
+      $defaults['is_active'] = 1;
+    }
+    return $defaults;
+  }
+
 }
diff --git a/civicrm/CRM/Financial/Form/FinancialTypeAccount.php b/civicrm/CRM/Financial/Form/FinancialTypeAccount.php
index 3c0f438920..dd5733ca2a 100644
--- a/civicrm/CRM/Financial/Form/FinancialTypeAccount.php
+++ b/civicrm/CRM/Financial/Form/FinancialTypeAccount.php
@@ -165,7 +165,7 @@ class CRM_Financial_Form_FinancialTypeAccount extends CRM_Core_Form {
     if ($this->_action == CRM_Core_Action::ADD) {
       if (!empty($this->_submitValues['account_relationship']) || !empty($this->_submitValues['financial_account_id'])) {
         $financialAccountType = CRM_Financial_BAO_FinancialAccount::getfinancialAccountRelations();
-        $financialAccountType = CRM_Utils_Array::value($this->_submitValues['account_relationship'], $financialAccountType);
+        $financialAccountType = $financialAccountType[$this->_submitValues['account_relationship']] ?? NULL;
         $result = CRM_Contribute_PseudoConstant::financialAccount(NULL, $financialAccountType);
 
         $financialAccountSelect = ['' => ts('- select -')] + $result;
diff --git a/civicrm/CRM/Financial/Form/FrontEndPaymentFormTrait.php b/civicrm/CRM/Financial/Form/FrontEndPaymentFormTrait.php
index cdedf2b61e..1f29680112 100644
--- a/civicrm/CRM/Financial/Form/FrontEndPaymentFormTrait.php
+++ b/civicrm/CRM/Financial/Form/FrontEndPaymentFormTrait.php
@@ -97,7 +97,7 @@ trait CRM_Financial_Form_FrontEndPaymentFormTrait {
     $pps = [];
     if (!empty($this->_paymentProcessors)) {
       foreach ($this->_paymentProcessors as $key => $processor) {
-        $pps[$key] = $processor['title'] ?? $processor['name'];
+        $pps[$key] = $this->getPaymentProcessorTitle($processor);
       }
     }
     if ($this->getPayLaterLabel()) {
@@ -106,6 +106,18 @@ trait CRM_Financial_Form_FrontEndPaymentFormTrait {
     return $pps;
   }
 
+  /**
+   * Get the title of the payment processor to display to the user
+   * Note: There is an identical function in CRM_Core_Payment
+   *
+   * @param array $processor
+   *
+   * @return string
+   */
+  protected function getPaymentProcessorTitle($processor) {
+    return $processor['title'] ?? $processor['name'];
+  }
+
   /**
    * Adds in either a set of radio buttons or hidden fields to contain the payment processors on a front end form
    */
diff --git a/civicrm/CRM/Financial/Form/PaymentEdit.php b/civicrm/CRM/Financial/Form/PaymentEdit.php
index 8aa8539e22..f131ef7677 100644
--- a/civicrm/CRM/Financial/Form/PaymentEdit.php
+++ b/civicrm/CRM/Financial/Form/PaymentEdit.php
@@ -150,17 +150,17 @@ class CRM_Financial_Form_PaymentEdit extends CRM_Core_Form {
     $params = [
       'id' => $this->_id,
       'payment_instrument_id' => $this->_submitValues['payment_instrument_id'],
-      'trxn_id' => CRM_Utils_Array::value('trxn_id', $this->_submitValues),
+      'trxn_id' => $this->_submitValues['trxn_id'] ?? NULL,
       'trxn_date' => CRM_Utils_Array::value('trxn_date', $this->_submitValues, date('YmdHis')),
     ];
 
     $paymentInstrumentName = CRM_Core_PseudoConstant::getName('CRM_Financial_DAO_FinancialTrxn', 'payment_instrument_id', $params['payment_instrument_id']);
     if ($paymentInstrumentName == 'Credit Card') {
-      $params['card_type_id'] = CRM_Utils_Array::value('card_type_id', $this->_submitValues);
-      $params['pan_truncation'] = CRM_Utils_Array::value('pan_truncation', $this->_submitValues);
+      $params['card_type_id'] = $this->_submitValues['card_type_id'] ?? NULL;
+      $params['pan_truncation'] = $this->_submitValues['pan_truncation'] ?? NULL;
     }
     elseif ($paymentInstrumentName == 'Check') {
-      $params['check_number'] = CRM_Utils_Array::value('check_number', $this->_submitValues);
+      $params['check_number'] = $this->_submitValues['check_number'] ?? NULL;
     }
 
     $this->submit($params);
diff --git a/civicrm/CRM/Financial/Form/SalesTaxTrait.php b/civicrm/CRM/Financial/Form/SalesTaxTrait.php
index 777895dbb0..45710bd064 100644
--- a/civicrm/CRM/Financial/Form/SalesTaxTrait.php
+++ b/civicrm/CRM/Financial/Form/SalesTaxTrait.php
@@ -37,11 +37,11 @@ trait CRM_Financial_Form_SalesTaxTrait {
    */
   public function getSalesTaxTerm() {
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    $invoicing = $invoiceSettings['invoicing'] ?? NULL;
     if (!$invoicing) {
       return '';
     }
-    return CRM_Utils_Array::value('tax_term', $invoiceSettings);
+    return $invoiceSettings['tax_term'] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Financial/Page/AJAX.php b/civicrm/CRM/Financial/Page/AJAX.php
index 989e75ea09..bc2e2f7b53 100644
--- a/civicrm/CRM/Financial/Page/AJAX.php
+++ b/civicrm/CRM/Financial/Page/AJAX.php
@@ -38,7 +38,7 @@ class CRM_Financial_Page_AJAX {
     }
     else {
       $financialAccountType = CRM_Financial_BAO_FinancialAccount::getfinancialAccountRelations();
-      $financialAccountType = CRM_Utils_Array::value($_GET['_value'], $financialAccountType);
+      $financialAccountType = $financialAccountType[$_GET['_value']] ?? NULL;
       $result = CRM_Contribute_PseudoConstant::financialAccount(NULL, $financialAccountType);
       if ($financialAccountType) {
         $defaultId = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_financial_account WHERE is_default = 1 AND financial_account_type_id = $financialAccountType");
@@ -255,7 +255,7 @@ class CRM_Financial_Page_AJAX {
     $entityID = isset($_REQUEST['entityID']) ? CRM_Utils_Type::escape($_REQUEST['entityID'], 'String') : NULL;
     $notPresent = isset($_REQUEST['notPresent']) ? CRM_Utils_Type::escape($_REQUEST['notPresent'], 'String') : NULL;
     $statusID = isset($_REQUEST['statusID']) ? CRM_Utils_Type::escape($_REQUEST['statusID'], 'String') : NULL;
-    $search = isset($_REQUEST['search']) ? TRUE : FALSE;
+    $search = isset($_REQUEST['search']);
 
     $params = $_POST;
     if ($sort && $sortOrder) {
@@ -303,7 +303,7 @@ class CRM_Financial_Page_AJAX {
     $params['context'] = $context;
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['rowCount'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
     $params['total'] = 0;
 
     // get batch list
@@ -429,7 +429,7 @@ class CRM_Financial_Page_AJAX {
         );
       }
       if ($financialItem->contact_id) {
-        $row[$financialItem->id]['contact_type'] = CRM_Contact_BAO_Contact_Utils::getImage(CRM_Utils_Array::value('contact_sub_type', $row[$financialItem->id]) ? $row[$financialItem->id]['contact_sub_type'] : CRM_Utils_Array::value('contact_type', $row[$financialItem->id]), FALSE, $financialItem->contact_id);
+        $row[$financialItem->id]['contact_type'] = CRM_Contact_BAO_Contact_Utils::getImage(!empty($row[$financialItem->id]['contact_sub_type']) ? $row[$financialItem->id]['contact_sub_type'] : CRM_Utils_Array::value('contact_type', $row[$financialItem->id]), FALSE, $financialItem->contact_id);
       }
       $financialitems = $row;
     }
diff --git a/civicrm/CRM/Financial/Page/FinancialType.php b/civicrm/CRM/Financial/Page/FinancialType.php
index 7a1480d524..adb78a4ef8 100644
--- a/civicrm/CRM/Financial/Page/FinancialType.php
+++ b/civicrm/CRM/Financial/Page/FinancialType.php
@@ -110,8 +110,7 @@ class CRM_Financial_Page_FinancialType extends CRM_Core_Page_Basic {
 
       foreach ($financialAccountIds as $key => $values) {
         if (!empty($financialAccounts[$values['financial_account_id']])) {
-          $financialAccountId[$values['financial_account_id']] = CRM_Utils_Array::value(
-            $values['financial_account_id'], $financialAccounts);
+          $financialAccountId[$values['financial_account_id']] = $financialAccounts[$values['financial_account_id']] ?? NULL;
         }
       }
 
diff --git a/civicrm/CRM/Financial/Page/FinancialTypeAccount.php b/civicrm/CRM/Financial/Page/FinancialTypeAccount.php
index b01b944b72..9a3552cc61 100644
--- a/civicrm/CRM/Financial/Page/FinancialTypeAccount.php
+++ b/civicrm/CRM/Financial/Page/FinancialTypeAccount.php
@@ -133,12 +133,12 @@ class CRM_Financial_Page_FinancialTypeAccount extends CRM_Core_Page {
           }
           if (!empty($financialAccount->financial_account_type_id)) {
             $optionGroupName = 'financial_account_type';
-            $financialType[$dao->id]['financial_account_type'] = CRM_Utils_Array::value($financialAccount->financial_account_type_id, $financialAccountType);
+            $financialType[$dao->id]['financial_account_type'] = $financialAccountType[$financialAccount->financial_account_type_id] ?? NULL;
 
           }
           if (!empty($dao->account_relationship)) {
             $optionGroupName = 'account_relationship';
-            $financialType[$dao->id]['account_relationship'] = CRM_Utils_Array::value($dao->account_relationship, $accountRelationship);
+            $financialType[$dao->id]['account_relationship'] = $accountRelationship[$dao->account_relationship] ?? NULL;
           }
         }
         // form all action links
diff --git a/civicrm/CRM/Friend/BAO/Friend.php b/civicrm/CRM/Friend/BAO/Friend.php
index 773009cb28..49cb7b9d88 100644
--- a/civicrm/CRM/Friend/BAO/Friend.php
+++ b/civicrm/CRM/Friend/BAO/Friend.php
@@ -119,7 +119,7 @@ class CRM_Friend_BAO_Friend extends CRM_Friend_DAO_Friend {
       'details' => $params['suggested_message'],
       'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', 'Completed'),
       'is_test' => $params['is_test'],
-      'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
+      'campaign_id' => $params['campaign_id'] ?? NULL,
     ];
 
     // activity creation
@@ -157,9 +157,9 @@ class CRM_Friend_BAO_Friend extends CRM_Friend_DAO_Friend {
     $transaction->commit();
 
     // Process sending of mails
-    $mailParams['title'] = CRM_Utils_Array::value('title', $params);
-    $mailParams['general_link'] = CRM_Utils_Array::value('general_link', $friendParams);
-    $mailParams['message'] = CRM_Utils_Array::value('suggested_message', $params);
+    $mailParams['title'] = $params['title'] ?? NULL;
+    $mailParams['general_link'] = $friendParams['general_link'] ?? NULL;
+    $mailParams['message'] = $params['suggested_message'] ?? NULL;
 
     // Default "from email address" is default domain address.
     list($_, $mailParams['email_from']) = CRM_Core_BAO_Domain::getNameAndEmail();
diff --git a/civicrm/CRM/Friend/Form.php b/civicrm/CRM/Friend/Form.php
index e1e03c3576..2af78a571a 100644
--- a/civicrm/CRM/Friend/Form.php
+++ b/civicrm/CRM/Friend/Form.php
@@ -73,8 +73,8 @@ class CRM_Friend_Form extends CRM_Core_Form {
       CRM_Core_DAO::commonRetrieve('CRM_Contribute_DAO_ContributionPage',
         $params, $values, ['title', 'campaign_id', 'is_share']
       );
-      $this->_title = CRM_Utils_Array::value('title', $values);
-      $this->_campaignId = CRM_Utils_Array::value('campaign_id', $values);
+      $this->_title = $values['title'] ?? NULL;
+      $this->_campaignId = $values['campaign_id'] ?? NULL;
       $this->_entityTable = 'civicrm_contribution_page';
       if ($pcomponent == 'event') {
         $this->_entityTable = 'civicrm_event';
@@ -82,7 +82,7 @@ class CRM_Friend_Form extends CRM_Core_Form {
         $this->_title = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $this->_entityId, 'title');
       }
       else {
-        $isShare = CRM_Utils_Array::value('is_share', $values);
+        $isShare = $values['is_share'] ?? NULL;
       }
       // Tell Form.tpl whether to include SocialNetwork.tpl for social media sharing
       $this->assign('isShare', $isShare);
diff --git a/civicrm/CRM/Friend/Form/Contribute.php b/civicrm/CRM/Friend/Form/Contribute.php
index 67e35a989d..56dac3ce18 100644
--- a/civicrm/CRM/Friend/Form/Contribute.php
+++ b/civicrm/CRM/Friend/Form/Contribute.php
@@ -48,11 +48,11 @@ class CRM_Friend_Form_Contribute extends CRM_Contribute_Form_ContributionPage {
       $defaults['entity_table'] = 'civicrm_contribution_page';
       $defaults['entity_id'] = $this->_id;
       CRM_Friend_BAO_Friend::getValues($defaults);
-      $this->_friendId = CRM_Utils_Array::value('id', $defaults);
-      $defaults['tf_title'] = CRM_Utils_Array::value('title', $defaults);
-      $defaults['tf_is_active'] = CRM_Utils_Array::value('is_active', $defaults);
-      $defaults['tf_thankyou_title'] = CRM_Utils_Array::value('thankyou_title', $defaults);
-      $defaults['tf_thankyou_text'] = CRM_Utils_Array::value('thankyou_text', $defaults);
+      $this->_friendId = $defaults['id'] ?? NULL;
+      $defaults['tf_title'] = $defaults['title'] ?? NULL;
+      $defaults['tf_is_active'] = $defaults['is_active'] ?? NULL;
+      $defaults['tf_thankyou_title'] = $defaults['thankyou_title'] ?? NULL;
+      $defaults['tf_thankyou_text'] = $defaults['thankyou_text'] ?? NULL;
     }
 
     if (!$this->_friendId) {
@@ -76,7 +76,7 @@ class CRM_Friend_Form_Contribute extends CRM_Contribute_Form_ContributionPage {
       $defaults['entity_table'] = 'civicrm_contribution_page';
       $defaults['entity_id'] = $this->_id;
       CRM_Friend_BAO_Friend::getValues($defaults);
-      $this->_friendId = CRM_Utils_Array::value('id', $defaults);
+      $this->_friendId = $defaults['id'] ?? NULL;
     }
 
     CRM_Friend_BAO_Friend::buildFriendForm($this);
@@ -97,8 +97,8 @@ class CRM_Friend_Form_Contribute extends CRM_Contribute_Form_ContributionPage {
     $formValues['entity_id'] = $this->_id;
     $formValues['title'] = $formValues['tf_title'];
     $formValues['is_active'] = CRM_Utils_Array::value('tf_is_active', $formValues, FALSE);
-    $formValues['thankyou_title'] = CRM_Utils_Array::value('tf_thankyou_title', $formValues);
-    $formValues['thankyou_text'] = CRM_Utils_Array::value('tf_thankyou_text', $formValues);
+    $formValues['thankyou_title'] = $formValues['tf_thankyou_title'] ?? NULL;
+    $formValues['thankyou_text'] = $formValues['tf_thankyou_text'] ?? NULL;
 
     if (($this->_action & CRM_Core_Action::UPDATE) && $this->_friendId) {
       $formValues['id'] = $this->_friendId;
diff --git a/civicrm/CRM/Friend/Form/Event.php b/civicrm/CRM/Friend/Form/Event.php
index 871ed9df58..a40c68e874 100644
--- a/civicrm/CRM/Friend/Form/Event.php
+++ b/civicrm/CRM/Friend/Form/Event.php
@@ -49,16 +49,16 @@ class CRM_Friend_Form_Event extends CRM_Event_Form_ManageEvent {
       $defaults['entity_id'] = $this->_id;
       CRM_Friend_BAO_Friend::getValues($defaults);
       if (!empty($defaults['id'])) {
-        $defaults['tf_id'] = CRM_Utils_Array::value('id', $defaults);
+        $defaults['tf_id'] = $defaults['id'] ?? NULL;
         $this->_friendId = $defaults['tf_id'];
         // lets unset the 'id' since it conflicts with eventID (or contribID)
         // CRM-12667
         unset($defaults['id']);
       }
-      $defaults['tf_title'] = CRM_Utils_Array::value('title', $defaults);
-      $defaults['tf_is_active'] = CRM_Utils_Array::value('is_active', $defaults);
-      $defaults['tf_thankyou_title'] = CRM_Utils_Array::value('thankyou_title', $defaults);
-      $defaults['tf_thankyou_text'] = CRM_Utils_Array::value('thankyou_text', $defaults);
+      $defaults['tf_title'] = $defaults['title'] ?? NULL;
+      $defaults['tf_is_active'] = $defaults['is_active'] ?? NULL;
+      $defaults['tf_thankyou_title'] = $defaults['thankyou_title'] ?? NULL;
+      $defaults['tf_thankyou_text'] = $defaults['thankyou_text'] ?? NULL;
     }
 
     if (!$this->_friendId) {
@@ -82,7 +82,7 @@ class CRM_Friend_Form_Event extends CRM_Event_Form_ManageEvent {
       $defaults['entity_table'] = 'civicrm_event';
       $defaults['entity_id'] = $this->_id;
       CRM_Friend_BAO_Friend::getValues($defaults);
-      $this->_friendId = CRM_Utils_Array::value('id', $defaults);
+      $this->_friendId = $defaults['id'] ?? NULL;
     }
 
     CRM_Friend_BAO_Friend::buildFriendForm($this);
@@ -106,8 +106,8 @@ class CRM_Friend_Form_Event extends CRM_Event_Form_ManageEvent {
     $formValues['entity_id'] = $this->_id;
     $formValues['title'] = $formValues['tf_title'];
     $formValues['is_active'] = CRM_Utils_Array::value('tf_is_active', $formValues, FALSE);
-    $formValues['thankyou_title'] = CRM_Utils_Array::value('tf_thankyou_title', $formValues);
-    $formValues['thankyou_text'] = CRM_Utils_Array::value('tf_thankyou_text', $formValues);
+    $formValues['thankyou_title'] = $formValues['tf_thankyou_title'] ?? NULL;
+    $formValues['thankyou_text'] = $formValues['tf_thankyou_text'] ?? NULL;
 
     if (($this->_action & CRM_Core_Action::UPDATE) && $this->_friendId) {
       $formValues['id'] = $this->_friendId;
diff --git a/civicrm/CRM/Grant/BAO/Grant.php b/civicrm/CRM/Grant/BAO/Grant.php
index 58f035100d..3d5fa8e1ac 100644
--- a/civicrm/CRM/Grant/BAO/Grant.php
+++ b/civicrm/CRM/Grant/BAO/Grant.php
@@ -154,7 +154,7 @@ class CRM_Grant_BAO_Grant extends CRM_Grant_DAO_Grant {
       }
     }
     $grant = new CRM_Grant_DAO_Grant();
-    $grant->id = CRM_Utils_Array::value('grant_id', $ids);
+    $grant->id = $ids['grant_id'] ?? NULL;
 
     $grant->copyValues($params);
 
@@ -233,7 +233,7 @@ class CRM_Grant_BAO_Grant extends CRM_Grant_DAO_Grant {
     $session = CRM_Core_Session::singleton();
     $id = $session->get('userID');
     if (!$id) {
-      $id = CRM_Utils_Array::value('contact_id', $params);
+      $id = $params['contact_id'] ?? NULL;
     }
     if (!empty($params['note']) || CRM_Utils_Array::value('id', CRM_Utils_Array::value('note', $ids))) {
       $noteParams = [
diff --git a/civicrm/CRM/Grant/StateMachine/Search.php b/civicrm/CRM/Grant/StateMachine/Search.php
index 88f6c267c6..eade9bb5b4 100644
--- a/civicrm/CRM/Grant/StateMachine/Search.php
+++ b/civicrm/CRM/Grant/StateMachine/Search.php
@@ -71,7 +71,7 @@ class CRM_Grant_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Grant/Task.php b/civicrm/CRM/Grant/Task.php
index 725697034a..4778a933b6 100644
--- a/civicrm/CRM/Grant/Task.php
+++ b/civicrm/CRM/Grant/Task.php
@@ -120,7 +120,7 @@ class CRM_Grant_Task extends CRM_Core_Task {
   public static function getTask($value) {
     self::tasks();
 
-    if (!CRM_Utils_Array::value($value, self::$_tasks)) {
+    if (empty(self::$_tasks[$value])) {
       // make it the print task by default
       $value = self::TASK_PRINT;
     }
diff --git a/civicrm/CRM/Group/Form/Edit.php b/civicrm/CRM/Group/Form/Edit.php
index fe4c54280e..fa3135f426 100644
--- a/civicrm/CRM/Group/Form/Edit.php
+++ b/civicrm/CRM/Group/Form/Edit.php
@@ -134,7 +134,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
         $groupValues = array(
           'id' => $this->_id,
           'title' => $this->_title,
-          'saved_search_id' => isset($this->_groupValues['saved_search_id']) ? $this->_groupValues['saved_search_id'] : '',
+          'saved_search_id' => $this->_groupValues['saved_search_id'] ?? '',
         );
         if (isset($this->_groupValues['saved_search_id'])) {
           $groupValues['mapping_id'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_SavedSearch',
@@ -263,7 +263,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
 
     $doParentCheck = FALSE;
     if (CRM_Core_Permission::isMultisiteEnabled()) {
-      $doParentCheck = ($this->_id && CRM_Core_BAO_Domain::isDomainGroup($this->_id)) ? FALSE : TRUE;
+      $doParentCheck = !($this->_id && CRM_Core_BAO_Domain::isDomainGroup($this->_id));
     }
 
     $options = array(
diff --git a/civicrm/CRM/Group/Page/AJAX.php b/civicrm/CRM/Group/Page/AJAX.php
index 493994720d..55428b5ef6 100644
--- a/civicrm/CRM/Group/Page/AJAX.php
+++ b/civicrm/CRM/Group/Page/AJAX.php
@@ -55,7 +55,7 @@ class CRM_Group_Page_AJAX {
       // go ahead with flat hierarchy, CRM-12225
       if (empty($groups)) {
         $groupsAccessible = CRM_Core_PseudoConstant::group();
-        $parentsOnly = CRM_Utils_Array::value('parentsOnly', $params);
+        $parentsOnly = $params['parentsOnly'] ?? NULL;
         if (!empty($groupsAccessible) && $parentsOnly) {
           // recompute group list with flat hierarchy
           $params['parentsOnly'] = 0;
diff --git a/civicrm/CRM/Import/ImportProcessor.php b/civicrm/CRM/Import/ImportProcessor.php
index be909595e7..27508e0aea 100644
--- a/civicrm/CRM/Import/ImportProcessor.php
+++ b/civicrm/CRM/Import/ImportProcessor.php
@@ -500,7 +500,7 @@ class CRM_Import_ImportProcessor {
    * @return bool
    */
   protected function isValidRelationshipKey($key) {
-    return !empty($this->getValidRelationships()[$key]) ? TRUE : FALSE;
+    return !empty($this->getValidRelationships()[$key]);
   }
 
   /**
diff --git a/civicrm/CRM/Import/Parser.php b/civicrm/CRM/Import/Parser.php
index 8eba240474..bfe559191d 100644
--- a/civicrm/CRM/Import/Parser.php
+++ b/civicrm/CRM/Import/Parser.php
@@ -335,7 +335,7 @@ abstract class CRM_Import_Parser {
       file_put_contents($statusFile, $contents);
     }
     else {
-      $rowCount = isset($this->_rowCount) ? $this->_rowCount : $this->_lineCount;
+      $rowCount = $this->_rowCount ?? $this->_lineCount;
       $currTimestamp = time();
       $totalTime = ($currTimestamp - $startTimestamp);
       $time = ($currTimestamp - $prevTimestamp);
diff --git a/civicrm/CRM/Invoicing/Utils.php b/civicrm/CRM/Invoicing/Utils.php
index daf3088747..dbcc4befac 100644
--- a/civicrm/CRM/Invoicing/Utils.php
+++ b/civicrm/CRM/Invoicing/Utils.php
@@ -59,7 +59,7 @@ class CRM_Invoicing_Utils {
       return TRUE;
     }
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    return CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    return $invoiceSettings['invoicing'] ?? NULL;
   }
 
   /**
@@ -70,7 +70,7 @@ class CRM_Invoicing_Utils {
    */
   public static function getTaxTerm() {
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    return CRM_Utils_Array::value('tax_term', $invoiceSettings);
+    return $invoiceSettings['tax_term'] ?? NULL;
   }
 
 }
diff --git a/civicrm/CRM/Logging/Differ.php b/civicrm/CRM/Logging/Differ.php
index 75c01b2bcf..2e05cf1d70 100644
--- a/civicrm/CRM/Logging/Differ.php
+++ b/civicrm/CRM/Logging/Differ.php
@@ -231,7 +231,7 @@ WHERE lt.log_conn_id = %1
             if (!empty(${$var[$diff]})) {
               $holder =& $$var;
               $val = explode(CRM_Case_BAO_Case::VALUE_SEPARATOR, $holder[$diff]);
-              $holder[$diff] = CRM_Utils_Array::value(1, $val);
+              $holder[$diff] = $val[1] ?? NULL;
             }
           }
         }
@@ -240,8 +240,8 @@ WHERE lt.log_conn_id = %1
           'action' => $changed['log_action'],
           'id' => $id,
           'field' => $diff,
-          'from' => CRM_Utils_Array::value($diff, $original),
-          'to' => CRM_Utils_Array::value($diff, $changed),
+          'from' => $original[$diff] ?? NULL,
+          'to' => $changed[$diff] ?? NULL,
           'table' => $table,
           'log_date' => $changed['log_date'],
           'log_conn_id' => $changed['log_conn_id'],
@@ -306,7 +306,7 @@ WHERE lt.log_conn_id = %1
 
         $dao = new $tableDAO();
         foreach ($dao->fields() as $field) {
-          $titles[$table][$field['name']] = CRM_Utils_Array::value('title', $field);
+          $titles[$table][$field['name']] = $field['title'] ?? NULL;
 
           if ($field['type'] == CRM_Utils_Type::T_BOOLEAN) {
             $values[$table][$field['name']] = ['0' => ts('false'), '1' => ts('true')];
diff --git a/civicrm/CRM/Logging/ReportDetail.php b/civicrm/CRM/Logging/ReportDetail.php
index d239a602da..d5822b183d 100644
--- a/civicrm/CRM/Logging/ReportDetail.php
+++ b/civicrm/CRM/Logging/ReportDetail.php
@@ -203,10 +203,10 @@ class CRM_Logging_ReportDetail extends CRM_Report_Form {
         ) {
           $froms = $tos = [];
           foreach (explode(CRM_Core_DAO::VALUE_SEPARATOR, trim($from, CRM_Core_DAO::VALUE_SEPARATOR)) as $val) {
-            $froms[] = CRM_Utils_Array::value($val, $values[$field]);
+            $froms[] = $values[$field][$val] ?? NULL;
           }
           foreach (explode(CRM_Core_DAO::VALUE_SEPARATOR, trim($to, CRM_Core_DAO::VALUE_SEPARATOR)) as $val) {
-            $tos[] = CRM_Utils_Array::value($val, $values[$field]);
+            $tos[] = $values[$field][$val] ?? NULL;
           }
           $from = implode(', ', array_filter($froms));
           $to = implode(', ', array_filter($tos));
diff --git a/civicrm/CRM/Logging/ReportSummary.php b/civicrm/CRM/Logging/ReportSummary.php
index 2a882e842d..f7e93eeb24 100644
--- a/civicrm/CRM/Logging/ReportSummary.php
+++ b/civicrm/CRM/Logging/ReportSummary.php
@@ -280,7 +280,7 @@ WHERE  log_date <= %1 AND id = %2 ORDER BY log_date DESC LIMIT 1";
         if (array_key_exists('options', $this->_logTables[$entity]['bracket_info']) &&
           $entityID
         ) {
-          return CRM_Utils_Array::value($entityID, $this->_logTables[$entity]['bracket_info']['options']);
+          return $this->_logTables[$entity]['bracket_info']['options'][$entityID] ?? NULL;
         }
       }
     }
@@ -342,7 +342,7 @@ WHERE  log_date <= %1 AND id = %2 ORDER BY log_date DESC LIMIT 1";
     $this->addToDeveloperTab($this->temporaryTable->getCreateSql());
     $this->temporaryTableName = $this->temporaryTable->getName();
 
-    $logTypes = CRM_Utils_Array::value('log_type_value', $this->_params);
+    $logTypes = $this->_params['log_type_value'] ?? NULL;
     unset($this->_params['log_type_value']);
     if (empty($logTypes)) {
       foreach (array_keys($this->_logTables) as $table) {
diff --git a/civicrm/CRM/Mailing/BAO/Mailing.php b/civicrm/CRM/Mailing/BAO/Mailing.php
index 59c588221c..4951fe4bea 100644
--- a/civicrm/CRM/Mailing/BAO/Mailing.php
+++ b/civicrm/CRM/Mailing/BAO/Mailing.php
@@ -1107,7 +1107,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
     $pEmails = [];
 
     foreach ($pTemplates as $type => $pTemplate) {
-      $html = ($type == 'html') ? TRUE : FALSE;
+      $html = $type == 'html';
       $pEmails[$type] = [];
       $pEmail = &$pEmails[$type];
       $template = &$pTemplates[$type]['template'];
@@ -1148,7 +1148,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
 
     $message = new Mail_mime("\n");
 
-    $useSmarty = defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY ? TRUE : FALSE;
+    $useSmarty = defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY;
     if ($useSmarty) {
       $smarty = CRM_Core_Smarty::singleton();
       // also add the contact tokens to the template
@@ -1191,7 +1191,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
 
     $mailParams['attachments'] = $attachments;
 
-    $mailParams['Subject'] = CRM_Utils_Array::value('subject', $pEmails);
+    $mailParams['Subject'] = $pEmails['subject'] ?? NULL;
     if (is_array($mailParams['Subject'])) {
       $mailParams['Subject'] = implode('', $mailParams['Subject']);
     }
@@ -1300,7 +1300,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
         $mailing->templates[$type] = CRM_Utils_Token::replaceDomainTokens(
           $mailing->templates[$type],
           $domain,
-          $type == 'html' ? TRUE : FALSE,
+          $type == 'html',
           $tokens[$type]
         );
         $mailing->templates[$type] = CRM_Utils_Token::replaceMailingTokens($mailing->templates[$type], $mailing, NULL, $tokens[$type]);
@@ -1329,7 +1329,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
     $token = $token_a['token'];
     $data = $token;
 
-    $useSmarty = defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY ? TRUE : FALSE;
+    $useSmarty = defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY;
 
     if ($type == 'embedded_url') {
       $embed_data = [];
@@ -1396,7 +1396,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
       }
     }
     else {
-      $data = CRM_Utils_Array::value("{$type}.{$token}", $contact);
+      $data = $contact["{$type}.{$token}"] ?? NULL;
     }
     return $data;
   }
@@ -1442,7 +1442,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
    * @return CRM_Mailing_DAO_Mailing
    */
   public static function add(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('mailing_id', $ids));
+    $id = $params['id'] ?? $ids['mailing_id'] ?? NULL;
 
     if (empty($params['id']) && !empty($ids)) {
       \Civi::log('Parameter $ids is no longer used by Mailing::add. Use the api or just pass $params', ['civi.tag' => 'deprecated']);
@@ -1523,7 +1523,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
   public static function create(&$params, $ids = []) {
 
     if (empty($params['id']) && (array_filter($ids) !== [])) {
-      $params['id'] = isset($ids['mailing_id']) ? $ids['mailing_id'] : $ids['id'];
+      $params['id'] = $ids['mailing_id'] ?? $ids['id'];
       \Civi::log('Parameter $ids is no longer used by Mailing::create. Use the api or just pass $params', ['civi.tag' => 'deprecated']);
     }
 
@@ -2102,7 +2102,7 @@ ORDER BY   civicrm_email.is_bulkmail DESC
         'link_unique' => CRM_Utils_System::url($path, "reset=1&event=click&mid=$mailing_id&uid={$mailing->id}&distinct=1"),
         'clicks' => $mailing->clicks,
         'unique' => $mailing->unique_clicks,
-        'rate' => CRM_Utils_Array::value('delivered', $report['event_totals']) ? (100.0 * $mailing->unique_clicks) / $report['event_totals']['delivered'] : 0,
+        'rate' => !empty($report['event_totals']['delivered']) ? (100.0 * $mailing->unique_clicks) / $report['event_totals']['delivered'] : 0,
         'report' => CRM_Report_Utils_Report::getNextUrl('mailing/clicks', "reset=1&mailing_id_value={$mailing_id}&url_value={$mailing->url}", FALSE, TRUE),
       ];
     }
@@ -2858,7 +2858,7 @@ ORDER BY civicrm_mailing.name";
     // format the params
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['rowCount'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
     $params['caseId'] = NULL;
 
     // get contact mailings
@@ -2951,7 +2951,7 @@ ORDER BY civicrm_mailing.name";
     $params['version'] = 3;
     $params['offset'] = ($params['page'] - 1) * $params['rp'];
     $params['limit'] = $params['rp'];
-    $params['sort'] = CRM_Utils_Array::value('sortBy', $params);
+    $params['sort'] = $params['sortBy'] ?? NULL;
 
     $result = civicrm_api('MailingContact', 'get', $params);
     return $result['values'];
diff --git a/civicrm/CRM/Mailing/BAO/MailingComponent.php b/civicrm/CRM/Mailing/BAO/MailingComponent.php
index 335370b61e..006bb3aec8 100644
--- a/civicrm/CRM/Mailing/BAO/MailingComponent.php
+++ b/civicrm/CRM/Mailing/BAO/MailingComponent.php
@@ -62,7 +62,7 @@ class CRM_Mailing_BAO_MailingComponent extends CRM_Mailing_DAO_MailingComponent
    * @return CRM_Mailing_BAO_MailingComponent
    */
   public static function add(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('id', $ids));
+    $id = $params['id'] ?? $ids['id'] ?? NULL;
     $component = new CRM_Mailing_BAO_MailingComponent();
     if ($id) {
       $component->id = $id;
diff --git a/civicrm/CRM/Mailing/BAO/Query.php b/civicrm/CRM/Mailing/BAO/Query.php
index c43d1b3562..f734f1cd12 100644
--- a/civicrm/CRM/Mailing/BAO/Query.php
+++ b/civicrm/CRM/Mailing/BAO/Query.php
@@ -106,7 +106,7 @@ class CRM_Mailing_BAO_Query {
       }
     }
 
-    if (CRM_Utils_Array::value('mailing_campaign_id', $query->_returnProperties)) {
+    if (!empty($query->_returnProperties['mailing_campaign_id'])) {
       $query->_select['mailing_campaign_id'] = 'civicrm_mailing.campaign_id as mailing_campaign_id';
       $query->_element['mailing_campaign_id'] = 1;
       $query->_tables['civicrm_campaign'] = 1;
diff --git a/civicrm/CRM/Mailing/DAO/BouncePattern.php b/civicrm/CRM/Mailing/DAO/BouncePattern.php
index c90182607a..5bb9f028cf 100644
--- a/civicrm/CRM/Mailing/DAO/BouncePattern.php
+++ b/civicrm/CRM/Mailing/DAO/BouncePattern.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/BouncePattern.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5b77be40f02d6350d3a973ae6e090883)
+ * (GenCodeChecksum:c72ed4774d00758d25e6a167f4215906)
  */
 
 /**
@@ -101,6 +101,11 @@ class CRM_Mailing_DAO_BouncePattern extends CRM_Core_DAO {
           'bao' => 'CRM_Mailing_BAO_BouncePattern',
           'localizable' => 0,
           'FKClassName' => 'CRM_Mailing_DAO_BounceType',
+          'pseudoconstant' => [
+            'table' => 'civicrm_mailing_bounce_type',
+            'keyColumn' => 'id',
+            'labelColumn' => 'name',
+          ],
         ],
         'pattern' => [
           'name' => 'pattern',
diff --git a/civicrm/CRM/Mailing/DAO/Mailing.php b/civicrm/CRM/Mailing/DAO/Mailing.php
index 27bf406064..4895def521 100644
--- a/civicrm/CRM/Mailing/DAO/Mailing.php
+++ b/civicrm/CRM/Mailing/DAO/Mailing.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Mailing.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:222c7a4f7e002c8829fc415baf214dbc)
+ * (GenCodeChecksum:5e3229fc70fd87ddb448fcc672e44c3d)
  */
 
 /**
@@ -193,7 +193,7 @@ class CRM_Mailing_DAO_Mailing extends CRM_Core_DAO {
   public $msg_template_id;
 
   /**
-   * Should we overrite VERP address in Reply-To
+   * Overwrite the VERP address in Reply-To
    *
    * @var bool
    */
@@ -709,7 +709,7 @@ class CRM_Mailing_DAO_Mailing extends CRM_Core_DAO {
           'name' => 'override_verp',
           'type' => CRM_Utils_Type::T_BOOLEAN,
           'title' => ts('Override Verp'),
-          'description' => ts('Should we overrite VERP address in Reply-To'),
+          'description' => ts('Overwrite the VERP address in Reply-To'),
           'where' => 'civicrm_mailing.override_verp',
           'default' => '0',
           'table_name' => 'civicrm_mailing',
diff --git a/civicrm/CRM/Mailing/DAO/Spool.php b/civicrm/CRM/Mailing/DAO/Spool.php
index 3305ea5fad..d5b77c77d3 100644
--- a/civicrm/CRM/Mailing/DAO/Spool.php
+++ b/civicrm/CRM/Mailing/DAO/Spool.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Spool.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:02a2772d9f468c566718c382d86373c6)
+ * (GenCodeChecksum:d7cd83f74e7fdb454cf91ea9d2fd3450)
  */
 
 /**
@@ -41,7 +41,7 @@ class CRM_Mailing_DAO_Spool extends CRM_Core_DAO {
   public $job_id;
 
   /**
-   * The email of the receipients this mail is to be sent.
+   * The email of the recipients this mail is to be sent.
    *
    * @var text
    */
@@ -134,7 +134,7 @@ class CRM_Mailing_DAO_Spool extends CRM_Core_DAO {
           'name' => 'recipient_email',
           'type' => CRM_Utils_Type::T_TEXT,
           'title' => ts('Recipient Email'),
-          'description' => ts('The email of the receipients this mail is to be sent.'),
+          'description' => ts('The email of the recipients this mail is to be sent.'),
           'where' => 'civicrm_mailing_spool.recipient_email',
           'table_name' => 'civicrm_mailing_spool',
           'entity' => 'Spool',
diff --git a/civicrm/CRM/Mailing/Form/Task.php b/civicrm/CRM/Mailing/Form/Task.php
index d0ba253d82..4a84746aaa 100644
--- a/civicrm/CRM/Mailing/Form/Task.php
+++ b/civicrm/CRM/Mailing/Form/Task.php
@@ -34,7 +34,7 @@ class CRM_Mailing_Form_Task extends CRM_Core_Form_Task {
   public static function preProcessCommon(&$form) {
     $values = $form->controller->exportValues($form->get('searchFormName'));
 
-    $form->_task = CRM_Utils_Array::value('task', $values);
+    $form->_task = $values['task'] ?? NULL;
     $mailingTasks = CRM_Mailing_Task::tasks();
     $form->assign('taskName', CRM_Utils_Array::value('task', $values));
 
diff --git a/civicrm/CRM/Mailing/Info.php b/civicrm/CRM/Mailing/Info.php
index 7a37da69d9..cfba5ccde0 100644
--- a/civicrm/CRM/Mailing/Info.php
+++ b/civicrm/CRM/Mailing/Info.php
@@ -178,9 +178,7 @@ class CRM_Mailing_Info extends CRM_Core_Component_Info {
 
     $enableWorkflow = Civi::settings()->get('civimail_workflow');
 
-    return ($enableWorkflow &&
-      $config->userSystem->is_drupal
-    ) ? TRUE : FALSE;
+    return $enableWorkflow && $config->userSystem->is_drupal;
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Page/Preview.php b/civicrm/CRM/Mailing/Page/Preview.php
index 85daed2ee3..97a15798c4 100644
--- a/civicrm/CRM/Mailing/Page/Preview.php
+++ b/civicrm/CRM/Mailing/Page/Preview.php
@@ -44,7 +44,7 @@ class CRM_Mailing_Page_Preview extends CRM_Core_Page {
     $mailing = new CRM_Mailing_BAO_Mailing();
     if (!empty($options)) {
       $mailing->id = $options['mailing_id'];
-      $fromEmail = CRM_Utils_Array::value('from_email', $options);
+      $fromEmail = $options['from_email'] ?? NULL;
     }
 
     $mailing->find(TRUE);
diff --git a/civicrm/CRM/Mailing/Page/View.php b/civicrm/CRM/Mailing/Page/View.php
index 7b858c33a7..2981807442 100644
--- a/civicrm/CRM/Mailing/Page/View.php
+++ b/civicrm/CRM/Mailing/Page/View.php
@@ -141,13 +141,13 @@ class CRM_Mailing_Page_View extends CRM_Core_Page {
       return NULL;
     }
 
-    $contactId = isset($this->_contactID) ? $this->_contactID : 0;
+    $contactId = $this->_contactID ?? 0;
 
     $result = civicrm_api3('Mailing', 'preview', [
       'id' => $this->_mailingID,
       'contact_id' => $contactId,
     ]);
-    $mailing = \CRM_Utils_Array::value('values', $result);
+    $mailing = $result['values'] ?? NULL;
 
     $title = NULL;
     if (isset($mailing['body_html']) && empty($_GET['text'])) {
diff --git a/civicrm/CRM/Member/BAO/Membership.php b/civicrm/CRM/Member/BAO/Membership.php
index a15bbe8c30..52b15d6a3a 100644
--- a/civicrm/CRM/Member/BAO/Membership.php
+++ b/civicrm/CRM/Member/BAO/Membership.php
@@ -89,7 +89,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
 
     //get the log start date.
     //it is set during renewal of membership.
-    $logStartDate = CRM_Utils_Array::value('log_start_date', $params);
+    $logStartDate = $params['log_start_date'] ?? NULL;
     $logStartDate = ($logStartDate) ? CRM_Utils_Date::isoToMysql($logStartDate) : CRM_Utils_Date::isoToMysql($membership->start_date);
     $values = self::getStatusANDTypeValues($membership->id);
 
@@ -131,7 +131,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
     $targetContactID = $membership->contact_id;
     if (!empty($params['is_for_organization'])) {
       // @todo - deprecate is_for_organization, require modified_id
-      $targetContactID = CRM_Utils_Array::value('modified_id', $params);
+      $targetContactID = $params['modified_id'] ?? NULL;
     }
 
     // add custom field values
@@ -293,7 +293,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
       if (!array_key_exists('max_related', $params) && !empty($params['membership_type_id'])) {
         $membershipType = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($params['membership_type_id']);
         if (isset($membershipType['relationship_type_id'])) {
-          $params['max_related'] = CRM_Utils_Array::value('max_related', $membershipType);
+          $params['max_related'] = $membershipType['max_related'] ?? NULL;
         }
       }
     }
@@ -365,7 +365,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
 
       foreach ($params['line_item'] as $priceSetId => $lineItems) {
         foreach ($lineItems as $lineIndex => $lineItem) {
-          $lineMembershipType = CRM_Utils_Array::value('membership_type_id', $lineItem);
+          $lineMembershipType = $lineItem['membership_type_id'] ?? NULL;
           if (!empty($params['contribution'])) {
             $params['line_item'][$priceSetId][$lineIndex]['contribution_id'] = $params['contribution']->id;
           }
@@ -520,7 +520,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
       //get the membership status and type values.
       $statusANDType = self::getStatusANDTypeValues($membership->id);
       foreach (['status', 'membership_type'] as $fld) {
-        $defaults[$fld] = CRM_Utils_Array::value($fld, $statusANDType[$membership->id]);
+        $defaults[$fld] = $statusANDType[$membership->id][$fld] ?? NULL;
       }
       if (!empty($statusANDType[$membership->id]['is_current_member'])) {
         $defaults['active'] = TRUE;
@@ -929,7 +929,7 @@ INNER JOIN  civicrm_membership_type type ON ( type.id = membership.membership_ty
             'column_name'
           );
           $value = $customFieldId ? 'custom_' . $customFieldId : $value;
-          $tmpContactField[trim($value)] = CRM_Utils_Array::value(trim($value), $contactFields);
+          $tmpContactField[trim($value)] = $contactFields[trim($value)] ?? NULL;
           if (!$status) {
             $title = $tmpContactField[trim($value)]['title'] . " " . ts('(match to contact)');
           }
@@ -1411,7 +1411,7 @@ WHERE  civicrm_membership.contact_id = civicrm_contact.id
       // Reminder should be sent only to the direct membership
       unset($params['reminder_date']);
       // unset the custom value ids
-      if (is_array(CRM_Utils_Array::value('custom', $params))) {
+      if (isset($params['custom']) && is_array($params['custom'])) {
         foreach ($params['custom'] as $k => $values) {
           foreach ($values as $i => $value) {
             unset($params['custom'][$k][$i]['id']);
@@ -1850,9 +1850,9 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
 
         $currentMembership['join_date'] = CRM_Utils_Date::customFormat($currentMembership['join_date'], $format);
         foreach (['start_date', 'end_date'] as $dateType) {
-          $currentMembership[$dateType] = CRM_Utils_Array::value($dateType, $formDates);
+          $currentMembership[$dateType] = $formDates[$dateType] ?? NULL;
           if (empty($currentMembership[$dateType])) {
-            $currentMembership[$dateType] = CRM_Utils_Array::value($dateType, $dates);
+            $currentMembership[$dateType] = $dates[$dateType] ?? NULL;
           }
         }
         $currentMembership['is_test'] = $is_test;
@@ -1893,9 +1893,9 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
         $memParams = [];
         $memParams['join_date'] = CRM_Utils_Date::isoToMysql($membership->join_date);
         $memParams['start_date'] = CRM_Utils_Array::value('start_date', $formDates, CRM_Utils_Date::isoToMysql($membership->start_date));
-        $memParams['end_date'] = CRM_Utils_Array::value('end_date', $formDates);
+        $memParams['end_date'] = $formDates['end_date'] ?? NULL;
         if (empty($memParams['end_date'])) {
-          $memParams['end_date'] = CRM_Utils_Array::value('end_date', $dates);
+          $memParams['end_date'] = $dates['end_date'] ?? NULL;
         }
         $memParams['membership_type_id'] = $membershipTypeID;
 
@@ -1934,9 +1934,9 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
         $dates = CRM_Member_BAO_MembershipType::getDatesForMembershipType($membershipTypeID, NULL, NULL, NULL, $numRenewTerms);
 
         foreach (['join_date', 'start_date', 'end_date'] as $dateType) {
-          $memParams[$dateType] = CRM_Utils_Array::value($dateType, $formDates);
+          $memParams[$dateType] = $formDates[$dateType] ?? NULL;
           if (empty($memParams[$dateType])) {
-            $memParams[$dateType] = CRM_Utils_Array::value($dateType, $dates);
+            $memParams[$dateType] = $dates[$dateType] ?? NULL;
           }
         }
 
@@ -1954,7 +1954,7 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
           $membershipTypeID,
           $memParams
         );
-        $updateStatusId = CRM_Utils_Array::value('id', $status);
+        $updateStatusId = $status['id'] ?? NULL;
       }
       else {
         // if IPN/Pay-Later set status to: PENDING
@@ -2053,7 +2053,7 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
       'price_sets' => $priceSets,
       'fields' => $fields,
       'price_fields' => [
-        'price_' . $fieldID => CRM_Utils_Array::value('id', $results),
+        'price_' . $fieldID => $results['id'] ?? NULL,
       ],
     ];
     return $returnParams;
@@ -2269,7 +2269,7 @@ WHERE      civicrm_membership.is_test = 0
           'ignore_admin_only' => TRUE,
         ], TRUE
       );
-      $statusId = CRM_Utils_Array::value('id', $newStatus);
+      $statusId = $newStatus['id'] ?? NULL;
 
       //process only when status change.
       if ($statusId &&
@@ -2390,27 +2390,22 @@ WHERE      civicrm_membership.is_test = 0
    *
    * @param array $params
    *   Array of submitted params.
-   * @param array $ids
-   *   (@return CRM_Contribute_BAO_Contribution
    *
    * @return CRM_Contribute_BAO_Contribution
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public static function recordMembershipContribution(&$params, $ids = []) {
-    if (!empty($ids)) {
-      CRM_Core_Error::deprecatedFunctionWarning('no $ids array');
-    }
+  public static function recordMembershipContribution(&$params) {
     $membershipId = $params['membership_id'];
     $contributionParams = [];
     $config = CRM_Core_Config::singleton();
     $contributionParams['currency'] = $config->defaultCurrency;
     $contributionParams['receipt_date'] = (CRM_Utils_Array::value('receipt_date', $params)) ? $params['receipt_date'] : 'null';
-    $contributionParams['source'] = CRM_Utils_Array::value('contribution_source', $params);
+    $contributionParams['source'] = $params['contribution_source'] ?? NULL;
     $contributionParams['non_deductible_amount'] = 'null';
     $contributionParams['skipCleanMoney'] = TRUE;
-    $contributionParams['payment_processor'] = CRM_Utils_Array::value('payment_processor_id', $params);
-    $contributionSoftParams = CRM_Utils_Array::value('soft_credit', $params);
+    $contributionParams['payment_processor'] = $params['payment_processor_id'] ?? NULL;
+    $contributionSoftParams = $params['soft_credit'] ?? NULL;
     $recordContribution = [
       'contact_id',
       'fee_amount',
@@ -2433,7 +2428,7 @@ WHERE      civicrm_membership.is_test = 0
       'card_type_id',
     ];
     foreach ($recordContribution as $f) {
-      $contributionParams[$f] = CRM_Utils_Array::value($f, $params);
+      $contributionParams[$f] = $params[$f] ?? NULL;
     }
 
     if (!empty($params['contribution_id'])) {
@@ -2452,7 +2447,7 @@ WHERE      civicrm_membership.is_test = 0
     if (!empty($params['processPriceSet']) &&
       !empty($params['lineItems'])
     ) {
-      $contributionParams['line_item'] = CRM_Utils_Array::value('lineItems', $params, NULL);
+      $contributionParams['line_item'] = $params['lineItems'] ?? NULL;
     }
 
     $contribution = CRM_Contribute_BAO_Contribution::create($contributionParams);
@@ -2642,9 +2637,9 @@ WHERE      civicrm_membership.is_test = 0
            * Update status
            */
           $status = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate(
-            isset($updates["start_date"]) ? $updates["start_date"] : $newMembership->start_date,
-            isset($updates["end_date"]) ? $updates["end_date"] : $newMembership->end_date,
-            isset($updates["join_date"]) ? $updates["join_date"] : $newMembership->join_date,
+            $updates["start_date"] ?? $newMembership->start_date,
+            $updates["end_date"] ?? $newMembership->end_date,
+            $updates["join_date"] ?? $newMembership->join_date,
             'today',
             FALSE,
             $newMembershipId,
@@ -2670,4 +2665,101 @@ WHERE      civicrm_membership.is_test = 0
     $sqlQueries = array_merge($sqlQueries, $newSql);
   }
 
+  /**
+   * Update membership status to deceased.
+   * function return the status message for updated membership.
+   *
+   * @param array $deceasedParams
+   *  - contact id
+   *  - is_deceased
+   *  - deceased_date
+   *
+   * @param string $contactType
+   *
+   * @return null|string
+   *   $updateMembershipMsg string  status message for updated membership.
+   */
+  public static function updateMembershipStatus($deceasedParams, $contactType) {
+    $updateMembershipMsg = NULL;
+    $contactId = $deceasedParams['contact_id'];
+    $deceasedDate = $deceasedParams['deceased_date'];
+
+    // process to set membership status to deceased for both active/inactive membership
+    if ($contactId &&
+      $contactType === 'Individual' &&
+      !empty($deceasedParams['is_deceased'])
+    ) {
+
+      $userId = CRM_Core_Session::getLoggedInContactID() ?: $contactId;
+
+      // get deceased status id
+      $allStatus = CRM_Member_PseudoConstant::membershipStatus();
+      $deceasedStatusId = array_search('Deceased', $allStatus);
+      if (!$deceasedStatusId) {
+        return $updateMembershipMsg;
+      }
+
+      $today = time();
+      if ($deceasedDate && strtotime($deceasedDate) > $today) {
+        return $updateMembershipMsg;
+      }
+
+      // get non deceased membership
+      $dao = new CRM_Member_DAO_Membership();
+      $dao->contact_id = $contactId;
+      $dao->whereAdd("status_id != $deceasedStatusId");
+      $dao->find();
+      $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, FALSE, FALSE, 'name');
+      $allStatus = CRM_Member_PseudoConstant::membershipStatus();
+      $memCount = 0;
+      while ($dao->fetch()) {
+        // update status to deceased (for both active/inactive membership )
+        CRM_Core_DAO::setFieldValue('CRM_Member_DAO_Membership', $dao->id,
+          'status_id', $deceasedStatusId
+        );
+
+        // add membership log
+        $membershipLog = [
+          'membership_id' => $dao->id,
+          'status_id' => $deceasedStatusId,
+          'start_date' => CRM_Utils_Date::isoToMysql($dao->start_date),
+          'end_date' => CRM_Utils_Date::isoToMysql($dao->end_date),
+          'modified_id' => $userId,
+          'modified_date' => date('Ymd'),
+          'membership_type_id' => $dao->membership_type_id,
+          'max_related' => $dao->max_related,
+        ];
+
+        CRM_Member_BAO_MembershipLog::add($membershipLog);
+
+        //create activity when membership status is changed
+        $activityParam = [
+          'subject' => "Status changed from {$allStatus[$dao->status_id]} to {$allStatus[$deceasedStatusId]}",
+          'source_contact_id' => $userId,
+          'target_contact_id' => $dao->contact_id,
+          'source_record_id' => $dao->id,
+          'activity_type_id' => array_search('Change Membership Status', $activityTypes),
+          'status_id' => 2,
+          'version' => 3,
+          'priority_id' => 2,
+          'activity_date_time' => date('Y-m-d H:i:s'),
+          'is_auto' => 0,
+          'is_current_revision' => 1,
+          'is_deleted' => 0,
+        ];
+        civicrm_api('activity', 'create', $activityParam);
+
+        $memCount++;
+      }
+
+      // set status msg
+      if ($memCount) {
+        CRM_Core_Session::setStatus(ts("%1 Current membership(s) for this contact have been set to 'Deceased' status.",
+          [1 => $memCount]
+        ));
+      }
+    }
+    return $updateMembershipMsg;
+  }
+
 }
diff --git a/civicrm/CRM/Member/BAO/MembershipBlock.php b/civicrm/CRM/Member/BAO/MembershipBlock.php
index f70ef619d3..cc11ae37b1 100644
--- a/civicrm/CRM/Member/BAO/MembershipBlock.php
+++ b/civicrm/CRM/Member/BAO/MembershipBlock.php
@@ -39,7 +39,7 @@ class CRM_Member_BAO_MembershipBlock extends CRM_Member_DAO_MembershipBlock {
     CRM_Utils_Hook::pre($hook, 'MembershipBlock', CRM_Utils_Array::value('id', $params), $params);
     $dao = new CRM_Member_DAO_MembershipBlock();
     $dao->copyValues($params);
-    $dao->id = CRM_Utils_Array::value('id', $params);
+    $dao->id = $params['id'] ?? NULL;
     $dao->save();
     CRM_Utils_Hook::post($hook, 'MembershipBlock', $dao->id, $dao);
     return $dao;
diff --git a/civicrm/CRM/Member/BAO/MembershipStatus.php b/civicrm/CRM/Member/BAO/MembershipStatus.php
index d283926613..fc187f186b 100644
--- a/civicrm/CRM/Member/BAO/MembershipStatus.php
+++ b/civicrm/CRM/Member/BAO/MembershipStatus.php
@@ -105,7 +105,7 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus {
    * @return object
    */
   public static function add(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('membershipStatus', $ids));
+    $id = $params['id'] ?? $ids['membershipStatus'] ?? NULL;
     if (!$id) {
       CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
       //copy name to label when not passed.
diff --git a/civicrm/CRM/Member/BAO/MembershipType.php b/civicrm/CRM/Member/BAO/MembershipType.php
index b1d5044a08..8a56e9bde5 100644
--- a/civicrm/CRM/Member/BAO/MembershipType.php
+++ b/civicrm/CRM/Member/BAO/MembershipType.php
@@ -85,13 +85,13 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
       if (isset($ids['membershipType'])) {
         Civi::log()->warning('Deprecated: Passing membershipType by $ids array in CRM_Member_BAO_MembershipType::add');
       }
-      $params['id'] = CRM_Utils_Array::value('membershipType', $ids);
+      $params['id'] = $ids['membershipType'] ?? NULL;
     }
 
     $hook = empty($params['id']) ? 'create' : 'edit';
     CRM_Utils_Hook::pre($hook, 'MembershipType', CRM_Utils_Array::value('id', $params), $params);
 
-    $membershipTypeId = CRM_Utils_Array::value('id', $params);
+    $membershipTypeId = $params['id'] ?? NULL;
 
     if (!$membershipTypeId) {
       if (!isset($params['is_active'])) {
@@ -717,15 +717,15 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
       $fieldParams['is_display_amounts'] = $fieldParams['is_required'] = 0;
       $fieldParams['weight'] = $fieldParams['option_weight'][1] = 1;
       $fieldParams['option_label'][1] = $params['name'];
-      $fieldParams['option_description'][1] = CRM_Utils_Array::value('description', $params);
+      $fieldParams['option_description'][1] = $params['description'] ?? NULL;
 
       $fieldParams['membership_type_id'][1] = $membershipTypeId;
       $fieldParams['option_amount'][1] = empty($params['minimum_fee']) ? 0 : $params['minimum_fee'];
-      $fieldParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params);
+      $fieldParams['financial_type_id'] = $params['financial_type_id'] ?? NULL;
 
       if ($previousID) {
         CRM_Member_Form_MembershipType::checkPreviousPriceField($previousID, $priceSetId, $membershipTypeId, $optionsIds);
-        $fieldParams['option_id'] = CRM_Utils_Array::value('option_id', $optionsIds);
+        $fieldParams['option_id'] = $optionsIds['option_id'] ?? NULL;
       }
       CRM_Price_BAO_PriceField::create($fieldParams);
     }
@@ -759,8 +759,8 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
           $optionsIds['id'] = current(CRM_Utils_Array::value('option_id', $optionsIds));
         }
       }
-      $results['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params);
-      $results['description'] = CRM_Utils_Array::value('description', $params);
+      $results['financial_type_id'] = $params['financial_type_id'] ?? NULL;
+      $results['description'] = $params['description'] ?? NULL;
       CRM_Price_BAO_PriceFieldValue::add($results, $optionsIds);
     }
   }
@@ -801,7 +801,7 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
             $updateParams['visibility_id'] = CRM_Price_BAO_PriceField::getVisibilityOptionID(strtolower($params['visibility']));
           }
           else {
-            $updateParams[$value] = CRM_Utils_Array::value($key, $params);
+            $updateParams[$value] = $params[$key] ?? NULL;
           }
         }
         CRM_Price_BAO_PriceFieldValue::add($updateParams);
diff --git a/civicrm/CRM/Member/Form.php b/civicrm/CRM/Member/Form.php
index 1408396daf..dc8ca97f16 100644
--- a/civicrm/CRM/Member/Form.php
+++ b/civicrm/CRM/Member/Form.php
@@ -430,7 +430,7 @@ class CRM_Member_Form extends CRM_Contribute_Form_AbstractEditPayment {
    * @return array
    */
   protected static function getPriceSetDetails($params) {
-    $priceSetID = CRM_Utils_Array::value('price_set_id', $params);
+    $priceSetID = $params['price_set_id'] ?? NULL;
     if ($priceSetID) {
       return CRM_Price_BAO_PriceSet::getSetDetail($priceSetID);
     }
@@ -450,7 +450,7 @@ class CRM_Member_Form extends CRM_Contribute_Form_AbstractEditPayment {
    * @return int
    */
   protected static function getPriceSetID($params) {
-    $priceSetID = CRM_Utils_Array::value('price_set_id', $params);
+    $priceSetID = $params['price_set_id'] ?? NULL;
     if (!$priceSetID) {
       $priceSetDetails = self::getPriceSetDetails($params);
       return key($priceSetDetails);
diff --git a/civicrm/CRM/Member/Form/Membership.php b/civicrm/CRM/Member/Form/Membership.php
index 8129a226b5..7a13df8b71 100644
--- a/civicrm/CRM/Member/Form/Membership.php
+++ b/civicrm/CRM/Member/Form/Membership.php
@@ -201,7 +201,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     parent::preProcess();
 
     // get price set id.
-    $this->_priceSetId = CRM_Utils_Array::value('priceSetId', $_GET);
+    $this->_priceSetId = $_GET['priceSetId'] ?? NULL;
     $this->set('priceSetId', $this->_priceSetId);
     $this->assign('priceSetId', $this->_priceSetId);
 
@@ -227,7 +227,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           $memberorgs = CRM_Member_BAO_MembershipType::getMemberOfContactByMemTypes($cMemTypes);
           $mems_by_org = [];
           foreach ($contactMemberships as $mem) {
-            $mem['member_of_contact_id'] = CRM_Utils_Array::value($mem['membership_type_id'], $memberorgs);
+            $mem['member_of_contact_id'] = $memberorgs[$mem['membership_type_id']] ?? NULL;
             if (!empty($mem['membership_end_date'])) {
               $mem['membership_end_date'] = CRM_Utils_Date::customFormat($mem['membership_end_date']);
             }
@@ -392,7 +392,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
   public function buildQuickForm() {
 
     $this->buildQuickEntityForm();
-    $this->assign('currency', CRM_Core_BAO_Country::defaultCurrencySymbol());
+    $this->assign('currency_symbol', CRM_Core_BAO_Country::defaultCurrencySymbol());
     $isUpdateToExistingRecurringMembership = $this->isUpdateToExistingRecurringMembership();
     // build price set form.
     $buildPriceSet = FALSE;
@@ -487,7 +487,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         continue;
       }
       else {
-        $memberOfContactId = CRM_Utils_Array::value('member_of_contact_id', $values);
+        $memberOfContactId = $values['member_of_contact_id'] ?? NULL;
         if (empty($selMemTypeOrg[$memberOfContactId])) {
           $selMemTypeOrg[$memberOfContactId] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
             $memberOfContactId,
@@ -498,10 +498,10 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           $selOrgMemType[$memberOfContactId][0] = ts('- select -');
         }
         if (empty($selOrgMemType[$memberOfContactId][$key])) {
-          $selOrgMemType[$memberOfContactId][$key] = CRM_Utils_Array::value('name', $values);
+          $selOrgMemType[$memberOfContactId][$key] = $values['name'] ?? NULL;
         }
       }
-      $totalAmount = CRM_Utils_Array::value('minimum_fee', $values);
+      $totalAmount = $values['minimum_fee'] ?? NULL;
       //CRM-18827 - override the default value if total_amount is submitted
       if (!empty($this->_submitValues['total_amount'])) {
         $totalAmount = $this->_submitValues['total_amount'];
@@ -510,12 +510,12 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       // - set the payment information block
       // - set the max related block
       $allMembershipInfo[$key] = [
-        'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $values),
+        'financial_type_id' => $values['financial_type_id'] ?? NULL,
         'total_amount' => CRM_Utils_Money::format($totalAmount, NULL, '%a'),
         'total_amount_numeric' => $totalAmount,
-        'auto_renew' => CRM_Utils_Array::value('auto_renew', $values),
+        'auto_renew' => $values['auto_renew'] ?? NULL,
         'has_related' => isset($values['relationship_type_id']),
-        'max_related' => CRM_Utils_Array::value('max_related', $values),
+        'max_related' => $values['max_related'] ?? NULL,
       ];
     }
 
@@ -552,9 +552,6 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     );
 
     $sel->setOptions([$selMemTypeOrg, $selOrgMemType]);
-    if ($isUpdateToExistingRecurringMembership) {
-      $sel->freeze();
-    }
 
     if ($this->_action & CRM_Core_Action::ADD) {
       $this->add('number', 'num_terms', ts('Number of Terms'), ['size' => 6]);
@@ -579,9 +576,6 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       $statusOverride = $this->addElement('select', 'is_override', ts('Status Override?'),
         CRM_Member_StatusOverrideTypes::getSelectOptions()
       );
-      if ($statusOverride && $isUpdateToExistingRecurringMembership) {
-        $statusOverride->freeze();
-      }
 
       $this->add('datepicker', 'status_override_end_date', ts('Status Override End Date'), '', FALSE, ['minDate' => time(), 'time' => FALSE]);
 
@@ -710,7 +704,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       if (empty($params['membership_type_id'][1])) {
         $errors['membership_type_id'] = ts('Please select a membership type.');
       }
-      $numterms = CRM_Utils_Array::value('num_terms', $params);
+      $numterms = $params['num_terms'] ?? NULL;
       if ($numterms && intval($numterms) != $numterms) {
         $errors['num_terms'] = ts('Please enter an integer for the number of terms.');
       }
@@ -947,7 +941,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
    */
   public static function emailReceipt(&$form, &$formValues, &$membership, $customValues = NULL) {
     // retrieve 'from email id' for acknowledgement
-    $receiptFrom = CRM_Utils_Array::value('from_email_address', $formValues);
+    $receiptFrom = $formValues['from_email_address'] ?? NULL;
 
     // @todo figure out how much of the stuff below is genuinely shared with the batch form & a logical shared place.
     if (!empty($formValues['payment_instrument_id'])) {
@@ -1030,7 +1024,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     $taxAmt = $template->get_template_vars('dataArray');
     $eventTaxAmt = $template->get_template_vars('totalTaxAmount');
     $prefixValue = Civi::settings()->get('contribution_invoice_settings');
-    $invoicing = CRM_Utils_Array::value('invoicing', $prefixValue);
+    $invoicing = $prefixValue['invoicing'] ?? NULL;
     if ((!empty($taxAmt) || isset($eventTaxAmt)) && (isset($invoicing) && isset($prefixValue['is_email_pdf']))) {
       $isEmailPdf = TRUE;
     }
@@ -1149,7 +1143,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     if (!empty($formValues['tax_amount'])) {
       $params['tax_amount'] = $formValues['tax_amount'];
     }
-    $params['total_amount'] = CRM_Utils_Array::value('amount', $formValues);
+    $params['total_amount'] = $formValues['amount'] ?? NULL;
     if (!empty($lineItem[$this->_priceSetId])) {
       foreach ($lineItem[$this->_priceSetId] as &$li) {
         if (!empty($li['membership_type_id'])) {
@@ -1161,7 +1155,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         ///CRM-11529 for quick config backoffice transactions
         //when financial_type_id is passed in form, update the
         //lineitems with the financial type selected in form
-        $submittedFinancialType = CRM_Utils_Array::value('financial_type_id', $formValues);
+        $submittedFinancialType = $formValues['financial_type_id'] ?? NULL;
         if ($isQuickConfig && $submittedFinancialType) {
           $li['financial_type_id'] = $submittedFinancialType;
         }
@@ -1179,7 +1173,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     ];
 
     foreach ($fields as $f) {
-      $params[$f] = CRM_Utils_Array::value($f, $formValues);
+      $params[$f] = $formValues[$f] ?? NULL;
     }
 
     // fix for CRM-3724
@@ -1214,9 +1208,9 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     foreach ($calcDates as $memType => $calcDate) {
       foreach (array_keys($dateTypes) as $d) {
         //first give priority to form values then calDates.
-        $date = CRM_Utils_Array::value($d, $formValues);
+        $date = $formValues[$d] ?? NULL;
         if (!$date) {
-          $date = CRM_Utils_Array::value($d, $calcDate);
+          $date = $calcDate[$d] ?? NULL;
         }
 
         $membershipTypeValues[$memType][$d] = CRM_Utils_Date::processDate($date);
@@ -1226,7 +1220,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     foreach ($this->_memTypeSelected as $memType) {
       if (array_key_exists('max_related', $formValues)) {
         // max related memberships - take from form or inherit from membership type
-        $membershipTypeValues[$memType]['max_related'] = CRM_Utils_Array::value('max_related', $formValues);
+        $membershipTypeValues[$memType]['max_related'] = $formValues['max_related'] ?? NULL;
       }
       $membershipTypeValues[$memType]['custom'] = CRM_Core_BAO_CustomField::postProcess($formValues,
         $this->_id,
@@ -1268,7 +1262,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       ];
 
       foreach ($recordContribution as $f) {
-        $params[$f] = CRM_Utils_Array::value($f, $formValues);
+        $params[$f] = $formValues[$f] ?? NULL;
       }
 
       if (!$this->_onlinePendingContributionId) {
@@ -1294,7 +1288,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       }
 
       if (!empty($formValues['send_receipt'])) {
-        $params['receipt_date'] = CRM_Utils_Array::value('receive_date', $formValues);
+        $params['receipt_date'] = $formValues['receive_date'] ?? NULL;
       }
 
       //insert financial type name in receipt.
@@ -1313,8 +1307,8 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       $params['total_amount'] = CRM_Utils_Array::value('total_amount', $formValues, 0);
 
       //CRM-20264 : Store CC type and number (last 4 digit) during backoffice or online payment
-      $params['card_type_id'] = CRM_Utils_Array::value('card_type_id', $this->_params);
-      $params['pan_truncation'] = CRM_Utils_Array::value('pan_truncation', $this->_params);
+      $params['card_type_id'] = $this->_params['card_type_id'] ?? NULL;
+      $params['pan_truncation'] = $this->_params['pan_truncation'] ?? NULL;
 
       if (!$isQuickConfig) {
         $params['financial_type_id'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet',
@@ -1323,7 +1317,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         );
       }
       else {
-        $params['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $formValues);
+        $params['financial_type_id'] = $formValues['financial_type_id'] ?? NULL;
       }
 
       //get the payment processor id as per mode. Try removing in favour of beginPostProcess.
@@ -1374,10 +1368,10 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
             'contact_id' => $this->_contributorContactID,
             'line_item' => $lineItem,
             'is_test' => $isTest,
-            'campaign_id' => CRM_Utils_Array::value('campaign_id', $paymentParams),
-            'contribution_page_id' => CRM_Utils_Array::value('contribution_page_id', $formValues),
+            'campaign_id' => $paymentParams['campaign_id'] ?? NULL,
+            'contribution_page_id' => $formValues['contribution_page_id'] ?? NULL,
             'source' => CRM_Utils_Array::value('source', $paymentParams, CRM_Utils_Array::value('description', $paymentParams)),
-            'thankyou_date' => CRM_Utils_Array::value('thankyou_date', $paymentParams),
+            'thankyou_date' => $paymentParams['thankyou_date'] ?? NULL,
             'payment_instrument_id' => $paymentInstrumentID,
           ],
           $financialType,
@@ -1455,7 +1449,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         [1 => $membershipType, 2 => $userName]
       );
       $params['source'] = $formValues['source'] ? $formValues['source'] : $params['contribution_source'];
-      $params['trxn_id'] = CRM_Utils_Array::value('trxn_id', $result);
+      $params['trxn_id'] = $result['trxn_id'] ?? NULL;
       $params['is_test'] = ($this->_mode === 'live') ? 0 : 1;
       if (!empty($formValues['send_receipt'])) {
         $params['receipt_date'] = $now;
@@ -1496,7 +1490,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         // appropriate as part of our 2-step always create the pending contribution & then finally add the payment
         // process -
         // @see http://wiki.civicrm.org/confluence/pages/viewpage.action?pageId=261062657#Payments&AccountsRoadmap-Movetowardsalwaysusinga2-steppaymentprocess
-        $membershipParams['contribution_status_id'] = CRM_Utils_Array::value('payment_status_id', $result);
+        $membershipParams['contribution_status_id'] = $result['payment_status_id'] ?? NULL;
         if (!empty($paymentParams['is_recur'])) {
           // The earlier process created the line items (although we want to get rid of the earlier one in favour
           // of a single path!
@@ -1505,7 +1499,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         $membershipParams['payment_instrument_id'] = $paymentInstrumentID;
         // @todo stop passing $ids (membership and userId only are set above)
         $membership = CRM_Member_BAO_Membership::create($membershipParams, $ids);
-        $params['contribution'] = CRM_Utils_Array::value('contribution', $membershipParams);
+        $params['contribution'] = $membershipParams['contribution'] ?? NULL;
         unset($params['lineItems']);
         $this->_membershipIDs[] = $membership->id;
         $createdMemberships[$memType] = $membership;
@@ -1602,7 +1596,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           }
           // @todo stop passing $ids (membership and userId only are set above)
           $membership = CRM_Member_BAO_Membership::create($membershipParams, $ids);
-          $params['contribution'] = CRM_Utils_Array::value('contribution', $membershipParams);
+          $params['contribution'] = $membershipParams['contribution'] ?? NULL;
           unset($params['lineItems']);
           // skip line item creation for next interation since line item(s) are already created.
           $params['skipLineItem'] = TRUE;
@@ -1613,7 +1607,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
         }
       }
     }
-    $isRecur = CRM_Utils_Array::value('is_recur', $params);
+    $isRecur = $params['is_recur'] ?? NULL;
     if (($this->_action & CRM_Core_Action::UPDATE)) {
       $this->addStatusMessage($this->getStatusMessageForUpdate($membership, $endDate));
     }
@@ -1623,8 +1617,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     }
 
     if (!empty($lineItem[$this->_priceSetId])) {
-      $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-      $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+      $invoicing = Civi::settings()->get('invoicing');
       $taxAmount = FALSE;
       $totalTaxAmount = 0;
       foreach ($lineItem[$this->_priceSetId] as & $priceFieldOp) {
@@ -1648,7 +1641,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
               $dataArray[$value['tax_rate']] = $dataArray[$value['tax_rate']] + CRM_Utils_Array::value('tax_amount', $value);
             }
             else {
-              $dataArray[$value['tax_rate']] = CRM_Utils_Array::value('tax_amount', $value);
+              $dataArray[$value['tax_rate']] = $value['tax_amount'] ?? NULL;
             }
           }
         }
@@ -1857,7 +1850,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
 
       //get the end date from calculated dates.
       if (!$memEndDate && !$isRecur) {
-        $memEndDate = CRM_Utils_Array::value('end_date', $calcDates[$memType]);
+        $memEndDate = $calcDates[$memType]['end_date'] ?? NULL;
       }
 
       if ($memEndDate && $memEndDate !== 'null') {
diff --git a/civicrm/CRM/Member/Form/MembershipBlock.php b/civicrm/CRM/Member/Form/MembershipBlock.php
index 90d5a63a2e..9f6b4ea011 100644
--- a/civicrm/CRM/Member/Form/MembershipBlock.php
+++ b/civicrm/CRM/Member/Form/MembershipBlock.php
@@ -337,7 +337,7 @@ class CRM_Member_Form_MembershipBlock extends CRM_Contribute_Form_ContributionPa
       if (is_array($params['membership_type'])) {
         foreach ($params['membership_type'] as $k => $v) {
           if ($v) {
-            $membershipTypes[$k] = CRM_Utils_Array::value("auto_renew_$k", $params);
+            $membershipTypes[$k] = $params["auto_renew_$k"] ?? NULL;
           }
         }
       }
@@ -347,7 +347,7 @@ class CRM_Member_Form_MembershipBlock extends CRM_Contribute_Form_ContributionPa
       }
 
       // check for price set.
-      $priceSetID = CRM_Utils_Array::value('member_price_set_id', $params);
+      $priceSetID = $params['member_price_set_id'] ?? NULL;
       if (!empty($params['member_is_active']) && is_array($membershipTypes) && !$priceSetID) {
         $usedPriceSetId = CRM_Price_BAO_PriceSet::getFor('civicrm_contribution_page', $this->_id, 2);
         if (empty($params['mem_price_field_id']) && !$usedPriceSetId) {
@@ -365,21 +365,21 @@ class CRM_Member_Form_MembershipBlock extends CRM_Contribute_Form_ContributionPa
           }
           $setParams['is_quick_config'] = 1;
           $setParams['extends'] = CRM_Core_Component::getComponentID('CiviMember');
-          $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
+          $setParams['financial_type_id'] = $this->_values['financial_type_id'] ?? NULL;
           $priceSet = CRM_Price_BAO_PriceSet::create($setParams);
           $priceSetID = $priceSet->id;
           $fieldParams['price_set_id'] = $priceSet->id;
         }
         elseif ($usedPriceSetId) {
           $setParams['extends'] = CRM_Core_Component::getComponentID('CiviMember');
-          $setParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $this->_values);
+          $setParams['financial_type_id'] = $this->_values['financial_type_id'] ?? NULL;
           $setParams['id'] = $usedPriceSetId;
           $priceSet = CRM_Price_BAO_PriceSet::create($setParams);
           $priceSetID = $priceSet->id;
           $fieldParams['price_set_id'] = $priceSet->id;
         }
         else {
-          $fieldParams['id'] = CRM_Utils_Array::value('mem_price_field_id', $params);
+          $fieldParams['id'] = $params['mem_price_field_id'] ?? NULL;
           $priceSetID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', CRM_Utils_Array::value('mem_price_field_id', $params), 'price_set_id');
         }
         $editedFieldParams = [
@@ -396,7 +396,7 @@ class CRM_Member_Form_MembershipBlock extends CRM_Contribute_Form_ContributionPa
           $fieldParams['weight'] = 1;
         }
         else {
-          $fieldParams['id'] = CRM_Utils_Array::value('id', $editedResults);
+          $fieldParams['id'] = $editedResults['id'] ?? NULL;
         }
 
         $fieldParams['label'] = !empty($params['membership_type_label']) ? $params['membership_type_label'] : ts('Membership');
@@ -416,12 +416,12 @@ class CRM_Member_Form_MembershipBlock extends CRM_Contribute_Form_ContributionPa
             unset($options[$priceFieldID]);
           }
           $membetype = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($memType);
-          $fieldParams['option_label'][$rowCount] = CRM_Utils_Array::value('name', $membetype);
+          $fieldParams['option_label'][$rowCount] = $membetype['name'] ?? NULL;
           $fieldParams['option_amount'][$rowCount] = CRM_Utils_Array::value('minimum_fee', $membetype, 0);
-          $fieldParams['option_weight'][$rowCount] = CRM_Utils_Array::value('weight', $membetype);
-          $fieldParams['option_description'][$rowCount] = CRM_Utils_Array::value('description', $membetype);
-          $fieldParams['default_option'] = CRM_Utils_Array::value('membership_type_default', $params);
-          $fieldParams['option_financial_type_id'][$rowCount] = CRM_Utils_Array::value('financial_type_id', $membetype);
+          $fieldParams['option_weight'][$rowCount] = $membetype['weight'] ?? NULL;
+          $fieldParams['option_description'][$rowCount] = $membetype['description'] ?? NULL;
+          $fieldParams['default_option'] = $params['membership_type_default'] ?? NULL;
+          $fieldParams['option_financial_type_id'][$rowCount] = $membetype['financial_type_id'] ?? NULL;
 
           $fieldParams['membership_type_id'][$rowCount] = $memType;
           // [$rowCount] = $membetype[''];
diff --git a/civicrm/CRM/Member/Form/MembershipRenewal.php b/civicrm/CRM/Member/Form/MembershipRenewal.php
index f6e50c2d87..db5b73149f 100644
--- a/civicrm/CRM/Member/Form/MembershipRenewal.php
+++ b/civicrm/CRM/Member/Form/MembershipRenewal.php
@@ -214,7 +214,7 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
     $scTypes = CRM_Core_OptionGroup::values("soft_credit_type");
     $defaults['soft_credit_type_id'] = CRM_Utils_Array::value(ts('Gift'), array_flip($scTypes));
 
-    $renewalDate = CRM_Utils_Array::value('renewal_date', $defaults);
+    $renewalDate = $defaults['renewal_date'] ?? NULL;
     $this->assign('renewalDate', $renewalDate);
     $this->assign('member_is_test', CRM_Utils_Array::value('member_is_test', $defaults));
 
@@ -259,7 +259,7 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
           continue;
         }
         else {
-          $memberOfContactId = CRM_Utils_Array::value('member_of_contact_id', $values);
+          $memberOfContactId = $values['member_of_contact_id'] ?? NULL;
           if (empty($selMemTypeOrg[$memberOfContactId])) {
             $selMemTypeOrg[$memberOfContactId] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
               $memberOfContactId,
@@ -270,13 +270,13 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
             $selOrgMemType[$memberOfContactId][0] = ts('- select -');
           }
           if (empty($selOrgMemType[$memberOfContactId][$key])) {
-            $selOrgMemType[$memberOfContactId][$key] = CRM_Utils_Array::value('name', $values);
+            $selOrgMemType[$memberOfContactId][$key] = $values['name'] ?? NULL;
           }
         }
 
         //CRM-16950
         $taxAmount = NULL;
-        $totalAmount = CRM_Utils_Array::value('minimum_fee', $values);
+        $totalAmount = $values['minimum_fee'] ?? NULL;
         // @todo - feels a bug - we use taxRate from the form default rather than from the specified type?!?
         if ($this->getTaxRateForFinancialType($values['financial_type_id'])) {
           $taxAmount = ($taxRate / 100) * CRM_Utils_Array::value('minimum_fee', $values);
@@ -286,7 +286,7 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
         // build membership info array, which is used to set the payment information block when
         // membership type is selected.
         $allMembershipInfo[$key] = [
-          'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $values),
+          'financial_type_id' => $values['financial_type_id'] ?? NULL,
           'total_amount' => CRM_Utils_Money::format($totalAmount, NULL, '%a'),
           'total_amount_numeric' => $totalAmount,
           'tax_message' => $taxAmount ? ts("Includes %1 amount of %2", [1 => $this->getSalesTaxTerm(), 2 => CRM_Utils_Money::format($taxAmount)]) : $taxAmount,
diff --git a/civicrm/CRM/Member/Form/MembershipType.php b/civicrm/CRM/Member/Form/MembershipType.php
index 152680491f..096aa786e0 100644
--- a/civicrm/CRM/Member/Form/MembershipType.php
+++ b/civicrm/CRM/Member/Form/MembershipType.php
@@ -502,7 +502,7 @@ class CRM_Member_Form_MembershipType extends CRM_Member_Form_MembershipConfig {
         ];
         $editedResults = [];
         CRM_Price_BAO_PriceFieldValue::retrieve($editedFieldParams, $editedResults);
-        $optionsIds['option_id'][1] = CRM_Utils_Array::value('id', $editedResults);
+        $optionsIds['option_id'][1] = $editedResults['id'] ?? NULL;
       }
     }
   }
diff --git a/civicrm/CRM/Member/Form/MembershipView.php b/civicrm/CRM/Member/Form/MembershipView.php
index b3f212a4f0..85d207281f 100644
--- a/civicrm/CRM/Member/Form/MembershipView.php
+++ b/civicrm/CRM/Member/Form/MembershipView.php
@@ -114,7 +114,7 @@ class CRM_Member_Form_MembershipView extends CRM_Core_Form {
           'end_date' => CRM_Utils_Date::processDate($owner['end_date'], NULL, TRUE, 'Ymd'),
           'source' => ts('Manual Assignment of Related Membership'),
           'is_test' => $owner['is_test'],
-          'campaign_id' => CRM_Utils_Array::value('campaign_id', $owner),
+          'campaign_id' => $owner['campaign_id'] ?? NULL,
           'status_id' => $owner['status_id'],
           'skipStatusCal' => TRUE,
           'createActivity' => TRUE,
@@ -379,7 +379,7 @@ SELECT r.id, c.id as cid, c.display_name as name, c.job_title as comment,
 
       $isRecur = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $this->membershipID, 'contribution_recur_id');
 
-      $autoRenew = $isRecur ? TRUE : FALSE;
+      $autoRenew = (bool) $isRecur;
     }
 
     if (!empty($values['is_test'])) {
diff --git a/civicrm/CRM/Member/Form/Task/Batch.php b/civicrm/CRM/Member/Form/Task/Batch.php
index 04c7bbb0c7..0d25822fee 100644
--- a/civicrm/CRM/Member/Form/Task/Batch.php
+++ b/civicrm/CRM/Member/Form/Task/Batch.php
@@ -133,7 +133,7 @@ class CRM_Member_Form_Task_Batch extends CRM_Member_Form_Task {
       $typeId = CRM_Core_DAO::getFieldValue("CRM_Member_DAO_Membership", $memberId, 'membership_type_id');
       foreach ($this->_fields as $name => $field) {
         if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($name)) {
-          $customValue = CRM_Utils_Array::value($customFieldID, $customFields);
+          $customValue = $customFields[$customFieldID] ?? NULL;
           $entityColumnValue = [];
           if (!empty($customValue['extends_entity_column_value'])) {
             $entityColumnValue = explode(CRM_Core_DAO::VALUE_SEPARATOR,
diff --git a/civicrm/CRM/Member/Form/Task/Email.php b/civicrm/CRM/Member/Form/Task/Email.php
index 740cacb223..aa6c7f1776 100644
--- a/civicrm/CRM/Member/Form/Task/Email.php
+++ b/civicrm/CRM/Member/Form/Task/Email.php
@@ -13,8 +13,6 @@
  *
  * @package CRM
  * @copyright CiviCRM LLC https://civicrm.org/licensing
- * $Id: Email.php 45499 2013-02-08 12:31:05Z kurund $
- *
  */
 
 /**
@@ -22,34 +20,15 @@
  * contacts.
  */
 class CRM_Member_Form_Task_Email extends CRM_Member_Form_Task {
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_single = FALSE;
-
-  /**
-   * Are we operating in "single mode", i.e. sending email to one
-   * specific contact?
-   *
-   * @var bool
-   */
-  public $_noEmails = FALSE;
-
-  /**
-   * All the existing templates in the system.
-   *
-   * @var array
-   */
-  public $_templates = NULL;
+  use CRM_Contact_Form_Task_EmailTrait;
 
   /**
    * Build all the data structures needed to build the form.
    *
    * @return void
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public function preProcess() {
     CRM_Contact_Form_Task_EmailCommon::preProcessFromAddress($this);
@@ -61,29 +40,6 @@ class CRM_Member_Form_Task_Email extends CRM_Member_Form_Task {
     $this->assign('single', $this->_single);
   }
 
-  /**
-   * Build the form object.
-   *
-   *
-   * @return void
-   */
-  public function buildQuickForm() {
-    //enable form element
-    $this->assign('emailTask', TRUE);
-
-    CRM_Contact_Form_Task_EmailCommon::buildQuickForm($this);
-  }
-
-  /**
-   * Process the form after the input has been submitted and validated.
-   *
-   *
-   * @return void
-   */
-  public function postProcess() {
-    CRM_Contact_Form_Task_EmailCommon::postProcess($this);
-  }
-
   /**
    * List available tokens for this form.
    *
diff --git a/civicrm/CRM/Member/Form/Task/Label.php b/civicrm/CRM/Member/Form/Task/Label.php
index 2068aeec02..df6aa2d3b0 100644
--- a/civicrm/CRM/Member/Form/Task/Label.php
+++ b/civicrm/CRM/Member/Form/Task/Label.php
@@ -54,7 +54,7 @@ class CRM_Member_Form_Task_Label extends CRM_Member_Form_Task {
   public function setDefaultValues() {
     $defaults = [];
     $format = CRM_Core_BAO_LabelFormat::getDefaultValues();
-    $defaults['label_name'] = CRM_Utils_Array::value('name', $format);
+    $defaults['label_name'] = $format['name'] ?? NULL;
     $defaults['merge_same_address'] = 0;
     $defaults['merge_same_household'] = 0;
     $defaults['do_not_mail'] = 1;
@@ -70,11 +70,11 @@ class CRM_Member_Form_Task_Label extends CRM_Member_Form_Task {
   public function postProcess() {
     $formValues = $this->controller->exportValues($this->_name);
     $locationTypeID = $formValues['location_type_id'];
-    $respectDoNotMail = CRM_Utils_Array::value('do_not_mail', $formValues);
+    $respectDoNotMail = $formValues['do_not_mail'] ?? NULL;
     $labelName = $formValues['label_name'];
-    $mergeSameAddress = CRM_Utils_Array::value('merge_same_address', $formValues);
-    $mergeSameHousehold = CRM_Utils_Array::value('merge_same_household', $formValues);
-    $isPerMembership = CRM_Utils_Array::value('per_membership', $formValues);
+    $mergeSameAddress = $formValues['merge_same_address'] ?? NULL;
+    $mergeSameHousehold = $formValues['merge_same_household'] ?? NULL;
+    $isPerMembership = $formValues['per_membership'] ?? NULL;
     if ($isPerMembership && ($mergeSameAddress || $mergeSameHousehold)) {
       // this shouldn't happen  - perhaps is could if JS is disabled
       CRM_Core_Session::setStatus(ts('As you are printing one label per membership your merge settings are being ignored'));
diff --git a/civicrm/CRM/Member/Form/Task/PDFLetter.php b/civicrm/CRM/Member/Form/Task/PDFLetter.php
index 799399247f..22eb984b8b 100644
--- a/civicrm/CRM/Member/Form/Task/PDFLetter.php
+++ b/civicrm/CRM/Member/Form/Task/PDFLetter.php
@@ -76,8 +76,8 @@ class CRM_Member_Form_Task_PDFLetter extends CRM_Member_Form_Task {
   public function postProcess() {
     // TODO: rewrite using contribution token and one letter by contribution
     $this->setContactIDs();
-    $skipOnHold = isset($this->skipOnHold) ? $this->skipOnHold : FALSE;
-    $skipDeceased = isset($this->skipDeceased) ? $this->skipDeceased : TRUE;
+    $skipOnHold = $this->skipOnHold ?? FALSE;
+    $skipDeceased = $this->skipDeceased ?? TRUE;
     CRM_Member_Form_Task_PDFLetterCommon::postProcessMembers(
       $this, $this->_memberIds, $skipOnHold, $skipDeceased, $this->_contactIds
     );
diff --git a/civicrm/CRM/Member/Import/Form/MapField.php b/civicrm/CRM/Member/Import/Form/MapField.php
index a991c85bcf..1d537f7bcb 100644
--- a/civicrm/CRM/Member/Import/Form/MapField.php
+++ b/civicrm/CRM/Member/Import/Form/MapField.php
@@ -45,7 +45,7 @@ class CRM_Member_Import_Form_MapField extends CRM_Import_Form_MapField {
     $this->assign('dataValues', $this->_dataValues);
 
     $skipColumnHeader = $this->controller->exportValue('DataSource', 'skipColumnHeader');
-    $this->_onDuplicate = $this->get('onDuplicate', isset($onDuplicate) ? $onDuplicate : "");
+    $this->_onDuplicate = $this->get('onDuplicate', $onDuplicate ?? "");
 
     $highlightedFields = array();
     if ($skipColumnHeader) {
@@ -113,9 +113,9 @@ class CRM_Member_Import_Form_MapField extends CRM_Import_Form_MapField {
 
       $mappingName = $mappingName[1];
       $mappingContactType = $mappingContactType[1];
-      $mappingLocation = CRM_Utils_Array::value('1', $mappingLocation);
-      $mappingPhoneType = CRM_Utils_Array::value('1', $mappingPhoneType);
-      $mappingRelation = CRM_Utils_Array::value('1', $mappingRelation);
+      $mappingLocation = $mappingLocation['1'] ?? NULL;
+      $mappingPhoneType = $mappingPhoneType['1'] ?? NULL;
+      $mappingRelation = $mappingRelation['1'] ?? NULL;
 
       //mapping is to be loaded from database
 
@@ -361,7 +361,7 @@ class CRM_Member_Import_Form_MapField extends CRM_Import_Form_MapField {
     }
 
     if (!empty($fields['saveMapping'])) {
-      $nameField = CRM_Utils_Array::value('saveMappingName', $fields);
+      $nameField = $fields['saveMappingName'] ?? NULL;
       if (empty($nameField)) {
         $errors['saveMappingName'] = ts('Name is required to save Import Mapping');
       }
@@ -455,9 +455,9 @@ class CRM_Member_Import_Form_MapField extends CRM_Import_Form_MapField {
         $updateMappingFields->column_number = $i;
 
         $mapperKeyParts = explode('_', $mapperKeys[$i][0], 3);
-        $id = isset($mapperKeyParts[0]) ? $mapperKeyParts[0] : NULL;
-        $first = isset($mapperKeyParts[1]) ? $mapperKeyParts[1] : NULL;
-        $second = isset($mapperKeyParts[2]) ? $mapperKeyParts[2] : NULL;
+        $id = $mapperKeyParts[0] ?? NULL;
+        $first = $mapperKeyParts[1] ?? NULL;
+        $second = $mapperKeyParts[2] ?? NULL;
         $updateMappingFields->name = $mapper[$i];
         $updateMappingFields->save();
       }
@@ -479,9 +479,9 @@ class CRM_Member_Import_Form_MapField extends CRM_Import_Form_MapField {
         $saveMappingFields->column_number = $i;
 
         $mapperKeyParts = explode('_', $mapperKeys[$i][0], 3);
-        $id = isset($mapperKeyParts[0]) ? $mapperKeyParts[0] : NULL;
-        $first = isset($mapperKeyParts[1]) ? $mapperKeyParts[1] : NULL;
-        $second = isset($mapperKeyParts[2]) ? $mapperKeyParts[2] : NULL;
+        $id = $mapperKeyParts[0] ?? NULL;
+        $first = $mapperKeyParts[1] ?? NULL;
+        $second = $mapperKeyParts[2] ?? NULL;
         $saveMappingFields->name = $mapper[$i];
         $saveMappingFields->save();
       }
diff --git a/civicrm/CRM/Member/Import/Parser/Membership.php b/civicrm/CRM/Member/Import/Parser/Membership.php
index 2b7fc23041..0a1bd220ab 100644
--- a/civicrm/CRM/Member/Import/Parser/Membership.php
+++ b/civicrm/CRM/Member/Import/Parser/Membership.php
@@ -524,7 +524,7 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser {
           $formatted
         );
         if (empty($formatted['status_id'])) {
-          $formatted['status_id'] = CRM_Utils_Array::value('id', $calcStatus);
+          $formatted['status_id'] = $calcStatus['id'] ?? NULL;
         }
         elseif (empty($formatted['member_is_override'])) {
           if (empty($calcStatus)) {
@@ -670,7 +670,7 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser {
           break;
 
         case 'membership_type_id':
-          if (!CRM_Utils_Array::value($value, CRM_Member_PseudoConstant::membershipType())) {
+          if (!array_key_exists($value, CRM_Member_PseudoConstant::membershipType())) {
             throw new Exception('Invalid Membership Type Id');
           }
           $values[$key] = $value;
diff --git a/civicrm/CRM/Member/Page/AJAX.php b/civicrm/CRM/Member/Page/AJAX.php
index 4f44feaed8..85dd654166 100644
--- a/civicrm/CRM/Member/Page/AJAX.php
+++ b/civicrm/CRM/Member/Page/AJAX.php
@@ -50,7 +50,7 @@ WHERE   id = %1";
     // fix the display of the monetary value, CRM-4038
     $details['total_amount'] = CRM_Utils_Money::format($details['total_amount'], NULL, '%a');
     $options = CRM_Core_SelectValues::memberAutoRenew();
-    $details['auto_renew'] = CRM_Utils_Array::value('auto_renew', $options[$details]);
+    $details['auto_renew'] = $options[$details]['auto_renew'] ?? NULL;
     CRM_Utils_JSON::output($details);
   }
 
diff --git a/civicrm/CRM/Member/Page/DashBoard.php b/civicrm/CRM/Member/Page/DashBoard.php
index a4e2a410df..57fb30cda5 100644
--- a/civicrm/CRM/Member/Page/DashBoard.php
+++ b/civicrm/CRM/Member/Page/DashBoard.php
@@ -51,7 +51,7 @@ class CRM_Member_Page_DashBoard extends CRM_Core_Page {
     $isCurrentMonth = 0;
 
     // You can force the dashboard to display based upon a certain date
-    $ym = CRM_Utils_Array::value('date', $_GET);
+    $ym = $_GET['date'] ?? NULL;
 
     if ($ym) {
       if (preg_match('/^\d{6}$/', $ym) == 0 ||
diff --git a/civicrm/CRM/Member/Page/MembershipType.php b/civicrm/CRM/Member/Page/MembershipType.php
index 6f2810aae0..1012cd28c6 100644
--- a/civicrm/CRM/Member/Page/MembershipType.php
+++ b/civicrm/CRM/Member/Page/MembershipType.php
@@ -125,7 +125,7 @@ class CRM_Member_Page_MembershipType extends CRM_Core_Page {
             $value, $relationshipName
           );
         }
-        $membershipType[$dao->id]['maxRelated'] = CRM_Utils_Array::value('max_related', $membershipType[$dao->id]);
+        $membershipType[$dao->id]['maxRelated'] = $membershipType[$dao->id]['max_related'] ?? NULL;
       }
       if (CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus() && !CRM_Core_Permission::check('edit contributions of type ' . CRM_Contribute_PseudoConstant::financialType($dao->financial_type_id))) {
         unset($links[CRM_Core_Action::UPDATE], $links[CRM_Core_Action::ENABLE], $links[CRM_Core_Action::DISABLE]);
diff --git a/civicrm/CRM/Member/Page/RecurringContributions.php b/civicrm/CRM/Member/Page/RecurringContributions.php
index 546350457f..aac582c389 100644
--- a/civicrm/CRM/Member/Page/RecurringContributions.php
+++ b/civicrm/CRM/Member/Page/RecurringContributions.php
@@ -96,7 +96,7 @@ class CRM_Member_Page_RecurringContributions extends CRM_Core_Page {
 
       $recurringContributions[$recurringContributionID]['id'] = $recurringContributionID;
       $recurringContributions[$recurringContributionID]['contactId'] = $contactID;
-      $recurringContributions[$recurringContributionID]['contribution_status'] = CRM_Utils_Array::value($contributionStatusID, $contributionStatuses);
+      $recurringContributions[$recurringContributionID]['contribution_status'] = $contributionStatuses[$contributionStatusID] ?? NULL;
 
       $this->setActionsForRecurringContribution($recurringContributionID, $recurringContributions[$recurringContributionID]);
     }
diff --git a/civicrm/CRM/Member/Page/Tab.php b/civicrm/CRM/Member/Page/Tab.php
index da7ee0a78d..8301a964a7 100644
--- a/civicrm/CRM/Member/Page/Tab.php
+++ b/civicrm/CRM/Member/Page/Tab.php
@@ -69,12 +69,12 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
       CRM_Core_DAO::storeValues($dao, $membership[$dao->id]);
 
       //carry campaign.
-      $membership[$dao->id]['campaign'] = CRM_Utils_Array::value($dao->campaign_id, $allCampaigns);
+      $membership[$dao->id]['campaign'] = $allCampaigns[$dao->campaign_id] ?? NULL;
 
       //get the membership status and type values.
       $statusANDType = CRM_Member_BAO_Membership::getStatusANDTypeValues($dao->id);
       foreach (['status', 'membership_type'] as $fld) {
-        $membership[$dao->id][$fld] = CRM_Utils_Array::value($fld, $statusANDType[$dao->id]);
+        $membership[$dao->id][$fld] = $statusANDType[$dao->id][$fld] ?? NULL;
       }
       if (!empty($statusANDType[$dao->id]['is_current_member'])) {
         $membership[$dao->id]['active'] = TRUE;
@@ -162,7 +162,7 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
      LEFT JOIN civicrm_contact ct ON ct.id = m.contact_id
   WHERE m.owner_membership_id = {$dao->id} AND m.is_test = 0 AND ms.is_current_member = 1 AND ct.is_deleted = 0";
         $num_related = CRM_Core_DAO::singleValueQuery($query);
-        $max_related = CRM_Utils_Array::value('max_related', $membership[$dao->id]);
+        $max_related = $membership[$dao->id]['max_related'] ?? NULL;
         $membership[$dao->id]['related_count'] = ($max_related == '' ? ts('%1 created', [1 => $num_related]) : ts('%1 out of %2', [
           1 => $num_related,
           2 => $max_related,
@@ -181,7 +181,7 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
         'limit' => 0,
       ],
     ]);
-    $membershipTypes = CRM_Utils_Array::value('values', $membershipTypesResult, NULL);
+    $membershipTypes = $membershipTypesResult['values'] ?? NULL;
 
     foreach ($membershipTypes as $key => $value) {
       $membershipTypes[$key]['action'] = CRM_Core_Action::formLink(self::membershipTypeslinks(),
@@ -475,7 +475,7 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
     $isCancelSupported = FALSE,
     $isUpdateBilling = FALSE
   ) {
-    if (!CRM_Utils_Array::value('view', self::$_links)) {
+    if (empty(self::$_links['view'])) {
       self::$_links['view'] = [
         CRM_Core_Action::VIEW => [
           'name' => ts('View'),
@@ -486,7 +486,7 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
       ];
     }
 
-    if (!CRM_Utils_Array::value('all', self::$_links)) {
+    if (empty(self::$_links['all'])) {
       $extraLinks = [
         CRM_Core_Action::UPDATE => [
           'name' => ts('Edit'),
diff --git a/civicrm/CRM/Member/Page/UserDashboard.php b/civicrm/CRM/Member/Page/UserDashboard.php
index 95759377f5..7ac24c15ff 100644
--- a/civicrm/CRM/Member/Page/UserDashboard.php
+++ b/civicrm/CRM/Member/Page/UserDashboard.php
@@ -43,7 +43,7 @@ class CRM_Member_Page_UserDashboard extends CRM_Contact_Page_View_UserDashBoard
         'status',
         'membership_type',
       ] as $fld) {
-        $membership[$dao->id][$fld] = CRM_Utils_Array::value($fld, $statusANDType[$dao->id]);
+        $membership[$dao->id][$fld] = $statusANDType[$dao->id][$fld] ?? NULL;
       }
       if (!empty($statusANDType[$dao->id]['is_current_member'])) {
         $membership[$dao->id]['active'] = TRUE;
diff --git a/civicrm/CRM/Member/PseudoConstant.php b/civicrm/CRM/Member/PseudoConstant.php
index dad1efc157..455ff98c9e 100644
--- a/civicrm/CRM/Member/PseudoConstant.php
+++ b/civicrm/CRM/Member/PseudoConstant.php
@@ -96,7 +96,7 @@ class CRM_Member_PseudoConstant extends CRM_Core_PseudoConstant {
 
     $value = NULL;
     if ($id) {
-      $value = CRM_Utils_Array::value($id, self::$membershipStatus[$cacheKey]);
+      $value = self::$membershipStatus[$cacheKey][$id] ?? NULL;
     }
     else {
       $value = self::$membershipStatus[$cacheKey];
diff --git a/civicrm/CRM/Member/Selector/Search.php b/civicrm/CRM/Member/Selector/Search.php
index eed017706d..45ccf50992 100644
--- a/civicrm/CRM/Member/Selector/Search.php
+++ b/civicrm/CRM/Member/Selector/Search.php
@@ -357,7 +357,7 @@ class CRM_Member_Selector_Search extends CRM_Core_Selector_Base implements CRM_C
       }
 
       //carry campaign on selectors.
-      $row['campaign'] = CRM_Utils_Array::value($result->member_campaign_id, $allCampaigns);
+      $row['campaign'] = $allCampaigns[$result->member_campaign_id] ?? NULL;
       $row['campaign_id'] = $result->member_campaign_id;
 
       if (!empty($row['member_is_test'])) {
diff --git a/civicrm/CRM/Member/StateMachine/Search.php b/civicrm/CRM/Member/StateMachine/Search.php
index 9f9a951493..8d3ea7a3c3 100644
--- a/civicrm/CRM/Member/StateMachine/Search.php
+++ b/civicrm/CRM/Member/StateMachine/Search.php
@@ -69,7 +69,7 @@ class CRM_Member_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/PCP/BAO/PCP.php b/civicrm/CRM/PCP/BAO/PCP.php
index 6b4660548e..95af552f52 100644
--- a/civicrm/CRM/PCP/BAO/PCP.php
+++ b/civicrm/CRM/PCP/BAO/PCP.php
@@ -90,12 +90,12 @@ WHERE  civicrm_pcp.contact_id = civicrm_contact.id
   public static function getPcpDashboardInfo($contactId) {
     $links = self::pcpLinks();
 
-    $query = "
+    $query = '
 SELECT pcp.*, block.is_tellfriend_enabled FROM civicrm_pcp pcp
 LEFT JOIN civicrm_pcp_block block ON block.id = pcp.pcp_block_id
 WHERE pcp.is_active = 1
   AND pcp.contact_id = %1
-ORDER BY page_type, page_id";
+ORDER BY page_type, page_id';
 
     $params = [1 => [$contactId, 'Integer']];
 
@@ -104,10 +104,7 @@ ORDER BY page_type, page_id";
     $hide = $mask = array_sum(array_keys($links['all']));
     $contactPCPPages = [];
 
-    $event = CRM_Event_PseudoConstant::event(NULL, FALSE, "( is_template IS NULL OR is_template != 1 )");
-    $contribute = CRM_Contribute_PseudoConstant::contributionPage();
-    $pcpStatus = CRM_Contribute_PseudoConstant::pcpStatus();
-    $approved = CRM_Utils_Array::key('Approved', $pcpStatus);
+    $approved = CRM_Core_PseudoConstant::getKey('CRM_PCP_BAO_PCP', 'status_id', 'Approved');
 
     while ($pcpInfoDao->fetch()) {
       $mask = $hide;
@@ -137,14 +134,14 @@ ORDER BY page_type, page_id";
       }
       $action = CRM_Core_Action::formLink($pcpLink, $mask, $replace, ts('more'),
         FALSE, 'pcp.dashboard.active', 'PCP', $pcpInfoDao->id);
-      $component = $pcpInfoDao->page_type;
-      $pageTitle = CRM_Utils_Array::value($pcpInfoDao->page_id, $$component);
+
+      $pageTitle = self::getPcpTitle($pcpInfoDao->page_type, (int) $pcpInfoDao->page_id);
 
       $pcpInfo[] = [
         'pageTitle' => $pageTitle,
         'pcpId' => $pcpInfoDao->id,
         'pcpTitle' => $pcpInfoDao->title,
-        'pcpStatus' => $pcpStatus[$pcpInfoDao->status_id],
+        'pcpStatus' => CRM_Core_PseudoConstant::getLabel('CRM_PCP_BAO_PCP', 'status_id', $pcpInfoDao->status_id),
         'action' => $action,
         'class' => $class,
       ];
@@ -185,8 +182,8 @@ ORDER BY target_entity_type, target_entity_id
       $pcpLink = $links['add'];
       $action = CRM_Core_Action::formLink($pcpLink, $mask, $replace, ts('more'),
         FALSE, 'pcp.dashboard.other', "{$pcpBlockDao->target_entity_type}_PCP", $pcpBlockDao->target_entity_id);
-      $component = $pcpBlockDao->target_entity_type;
-      if ($pageTitle = CRM_Utils_Array::value($pcpBlockDao->target_entity_id, $$component)) {
+      $pageTitle = self::getPcpTitle($pcpBlockDao->target_entity_type, (int) $pcpBlockDao->target_entity_id);
+      if ($pageTitle) {
         $pcpBlock[] = [
           'pageId' => $pcpBlockDao->target_entity_id,
           'pageTitle' => $pageTitle,
@@ -891,7 +888,7 @@ WHERE pcp.id = %1";
       'contribute' => 'civicrm_contribution_page',
       'civicrm_contribution_page' => 'civicrm_contribution_page',
     ];
-    return isset($entity_table_map[$component]) ? $entity_table_map[$component] : FALSE;
+    return $entity_table_map[$component] ?? FALSE;
   }
 
   /**
@@ -946,4 +943,19 @@ INNER JOIN civicrm_uf_group ufgroup
     }
   }
 
+  /**
+   * Get the title of the pcp.
+   *
+   * @param string $component
+   * @param int $id
+   *
+   * @return bool|string|null
+   */
+  protected static function getPcpTitle(string $component, int $id) {
+    if ($component === 'contribute') {
+      return CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_Contribution', 'contribution_page_id', $id);
+    }
+    return CRM_Core_PseudoConstant::getLabel('CRM_Event_BAO_Participant', 'event_id', $id);
+  }
+
 }
diff --git a/civicrm/CRM/PCP/Form/Campaign.php b/civicrm/CRM/PCP/Form/Campaign.php
index 44d7d872f8..59c56d9ca9 100644
--- a/civicrm/CRM/PCP/Form/Campaign.php
+++ b/civicrm/CRM/PCP/Form/Campaign.php
@@ -68,8 +68,8 @@ class CRM_PCP_Form_Campaign extends CRM_Core_Form {
         $defaults['goal_amount'] = CRM_Utils_Money::format($defaults['goal_amount'], NULL, '%a');
       }
 
-      $defaults['pcp_title'] = CRM_Utils_Array::value('title', $defaults);
-      $defaults['pcp_intro_text'] = CRM_Utils_Array::value('intro_text', $defaults);
+      $defaults['pcp_title'] = $defaults['title'] ?? NULL;
+      $defaults['pcp_intro_text'] = $defaults['intro_text'] ?? NULL;
     }
 
     if ($this->get('action') & CRM_Core_Action::ADD) {
@@ -79,8 +79,8 @@ class CRM_PCP_Form_Campaign extends CRM_Core_Form {
       $defaults['is_notify'] = 1;
     }
 
-    $this->_contactID = CRM_Utils_Array::value('contact_id', $defaults);
-    $this->_contriPageId = CRM_Utils_Array::value('page_id', $defaults);
+    $this->_contactID = $defaults['contact_id'] ?? NULL;
+    $this->_contriPageId = $defaults['page_id'] ?? NULL;
 
     return $defaults;
   }
@@ -187,7 +187,7 @@ class CRM_PCP_Form_Campaign extends CRM_Core_Form {
       }
     }
     $session = CRM_Core_Session::singleton();
-    $contactID = isset($this->_contactID) ? $this->_contactID : $session->get('userID');
+    $contactID = $this->_contactID ?? $session->get('userID');
     if (!$contactID) {
       $contactID = $this->get('contactID');
     }
diff --git a/civicrm/CRM/PCP/Form/Contribute.php b/civicrm/CRM/PCP/Form/Contribute.php
index 124bbcf1fe..bbe080e1e4 100644
--- a/civicrm/CRM/PCP/Form/Contribute.php
+++ b/civicrm/CRM/PCP/Form/Contribute.php
@@ -47,7 +47,7 @@ class CRM_PCP_Form_Contribute extends CRM_Contribute_Form_ContributionPage {
     if (isset($this->_id)) {
       $params = ['entity_id' => $this->_id, 'entity_table' => 'civicrm_contribution_page'];
       CRM_Core_DAO::commonRetrieve('CRM_PCP_DAO_PCPBlock', $params, $defaults);
-      $defaults['pcp_active'] = CRM_Utils_Array::value('is_active', $defaults);
+      $defaults['pcp_active'] = $defaults['is_active'] ?? NULL;
       // Assign contribution page ID to pageId for referencing in PCP.hlp - since $id is overwritten there. dgg
       $this->assign('pageId', $this->_id);
     }
diff --git a/civicrm/CRM/PCP/Form/Event.php b/civicrm/CRM/PCP/Form/Event.php
index 5ea57f4686..004282d383 100644
--- a/civicrm/CRM/PCP/Form/Event.php
+++ b/civicrm/CRM/PCP/Form/Event.php
@@ -48,7 +48,7 @@ class CRM_PCP_Form_Event extends CRM_Event_Form_ManageEvent {
 
       $params = ['entity_id' => $this->_id, 'entity_table' => 'civicrm_event'];
       CRM_Core_DAO::commonRetrieve('CRM_PCP_DAO_PCPBlock', $params, $defaults);
-      $defaults['pcp_active'] = CRM_Utils_Array::value('is_active', $defaults);
+      $defaults['pcp_active'] = $defaults['is_active'] ?? NULL;
       // Assign contribution page ID to pageId for referencing in PCP.hlp - since $id is overwritten there. dgg
       $this->assign('pageId', $this->_id);
     }
diff --git a/civicrm/CRM/PCP/Form/PCP.php b/civicrm/CRM/PCP/Form/PCP.php
index cb7482a3ff..d9fbcb7c69 100644
--- a/civicrm/CRM/PCP/Form/PCP.php
+++ b/civicrm/CRM/PCP/Form/PCP.php
@@ -43,8 +43,8 @@ class CRM_PCP_Form_PCP extends CRM_Core_Form {
     }
 
     if (!$this->_action) {
-      $this->_action = CRM_Utils_Array::value('action', $_GET);
-      $this->_id = CRM_Utils_Array::value('id', $_GET);
+      $this->_action = $_GET['action'] ?? NULL;
+      $this->_id = $_GET['id'] ?? NULL;
     }
     else {
       $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this);
diff --git a/civicrm/CRM/PCP/Form/PCPAccount.php b/civicrm/CRM/PCP/Form/PCPAccount.php
index 2246b187c2..d240da76aa 100644
--- a/civicrm/CRM/PCP/Form/PCPAccount.php
+++ b/civicrm/CRM/PCP/Form/PCPAccount.php
@@ -53,7 +53,7 @@ class CRM_PCP_Form_PCPAccount extends CRM_Core_Form {
       $contactID = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP', $this->_id, 'contact_id');
     }
 
-    $this->_contactID = isset($contactID) ? $contactID : $session->get('userID');
+    $this->_contactID = $contactID ?? $session->get('userID');
     if (!$this->_pageId) {
       if (!$this->_id) {
         $msg = ts('We can\'t load the requested web page due to an incomplete link. This can be caused by using your browser\'s Back button or by using an incomplete or invalid link.');
diff --git a/civicrm/CRM/PCP/Page/PCPInfo.php b/civicrm/CRM/PCP/Page/PCPInfo.php
index 8468710369..de831f3b24 100644
--- a/civicrm/CRM/PCP/Page/PCPInfo.php
+++ b/civicrm/CRM/PCP/Page/PCPInfo.php
@@ -139,7 +139,7 @@ class CRM_PCP_Page_PCPInfo extends CRM_Core_Page {
 
     if ($pcpInfo['contact_id'] == $session->get('userID')) {
       $owner = $pageInfo;
-      $owner['status'] = CRM_Utils_Array::value($pcpInfo['status_id'], $pcpStatus);
+      $owner['status'] = $pcpStatus[$pcpInfo['status_id']] ?? NULL;
 
       $this->assign('owner', $owner);
 
diff --git a/civicrm/CRM/Pledge/BAO/Pledge.php b/civicrm/CRM/Pledge/BAO/Pledge.php
index ef21f1a79c..4fdc3ec5f6 100644
--- a/civicrm/CRM/Pledge/BAO/Pledge.php
+++ b/civicrm/CRM/Pledge/BAO/Pledge.php
@@ -157,7 +157,7 @@ class CRM_Pledge_BAO_Pledge extends CRM_Pledge_DAO_Pledge {
         }
       }
     }
-    $paymentParams['status_id'] = CRM_Utils_Array::value('status_id', $params);
+    $paymentParams['status_id'] = $params['status_id'] ?? NULL;
 
     $pledge = self::add($params);
     if (is_a($pledge, 'CRM_Core_Error')) {
@@ -195,7 +195,7 @@ class CRM_Pledge_BAO_Pledge extends CRM_Pledge_DAO_Pledge {
         'actual_amount',
       );
       foreach ($paymentKeys as $key) {
-        $paymentParams[$key] = CRM_Utils_Array::value($key, $params, NULL);
+        $paymentParams[$key] = $params[$key] ?? NULL;
       }
       CRM_Pledge_BAO_PledgePayment::create($paymentParams);
     }
@@ -524,14 +524,14 @@ GROUP BY  currency
             $contributionParams, $contributionStatus, $returnProperties
           );
           $contributionValue = array(
-            'status' => CRM_Utils_Array::value('contribution_status_id', $contributionStatus),
-            'receive_date' => CRM_Utils_Array::value('receive_date', $contributionStatus),
+            'status' => $contributionStatus['contribution_status_id'] ?? NULL,
+            'receive_date' => $contributionStatus['receive_date'] ?? NULL,
           );
         }
         $payments[$payID] = array_merge($contributionValue,
           array(
-            'amount' => CRM_Utils_Array::value('scheduled_amount', $values),
-            'due_date' => CRM_Utils_Array::value('scheduled_date', $values),
+            'amount' => $values['scheduled_amount'] ?? NULL,
+            'due_date' => $values['scheduled_date'] ?? NULL,
           )
         );
 
@@ -626,8 +626,8 @@ GROUP BY  currency
 
     // check for online pledge.
     if (!empty($params['receipt_from_email'])) {
-      $userName = CRM_Utils_Array::value('receipt_from_name', $params);
-      $userEmail = CRM_Utils_Array::value('receipt_from_email', $params);
+      $userName = $params['receipt_from_name'] ?? NULL;
+      $userEmail = $params['receipt_from_email'] ?? NULL;
     }
     elseif (!empty($params['from_email_id'])) {
       $receiptFrom = $params['from_email_id'];
@@ -638,8 +638,8 @@ GROUP BY  currency
     }
     else {
       // set the domain values.
-      $userName = CRM_Utils_Array::value('name', $domainValues);
-      $userEmail = CRM_Utils_Array::value('email', $domainValues);
+      $userName = $domainValues['name'] ?? NULL;
+      $userEmail = $domainValues['email'] ?? NULL;
     }
 
     if (!isset($receiptFrom)) {
@@ -683,7 +683,7 @@ GROUP BY  currency
         'is_test' => $params['is_test'],
         'status_id' => 2,
         'details' => $details,
-        'campaign_id' => CRM_Utils_Array::value('campaign_id', $params),
+        'campaign_id' => $params['campaign_id'] ?? NULL,
       );
 
       // lets insert assignee record.
diff --git a/civicrm/CRM/Pledge/BAO/PledgeBlock.php b/civicrm/CRM/Pledge/BAO/PledgeBlock.php
index 6935d239bb..8d363e06f9 100644
--- a/civicrm/CRM/Pledge/BAO/PledgeBlock.php
+++ b/civicrm/CRM/Pledge/BAO/PledgeBlock.php
@@ -90,7 +90,7 @@ class CRM_Pledge_BAO_PledgeBlock extends CRM_Pledge_DAO_PledgeBlock {
     $pledgeBlock = new CRM_Pledge_DAO_PledgeBlock();
 
     // fix for pledge_frequency_unit
-    $freqUnits = CRM_Utils_Array::value('pledge_frequency_unit', $params);
+    $freqUnits = $params['pledge_frequency_unit'] ?? NULL;
 
     if ($freqUnits && is_array($freqUnits)) {
       unset($params['pledge_frequency_unit']);
@@ -229,9 +229,9 @@ class CRM_Pledge_BAO_PledgeBlock extends CRM_Pledge_DAO_PledgeBlock {
         foreach ($overduePayments as $id => $payment) {
           $label = ts("%1 - due on %2 (overdue)", array(
             1 => CRM_Utils_Money::format(CRM_Utils_Array::value('scheduled_amount', $payment), CRM_Utils_Array::value('scheduled_amount_currency', $payment)),
-            2 => CRM_Utils_Array::value('scheduled_date', $payment),
+            2 => $payment['scheduled_date'] ?? NULL,
           ));
-          $paymentID = CRM_Utils_Array::value('id', $payment);
+          $paymentID = $payment['id'] ?? NULL;
           $payments[] = $form->createElement('checkbox', $paymentID, NULL, $label, array('amount' => CRM_Utils_Array::value('scheduled_amount', $payment)));
         }
       }
@@ -239,9 +239,9 @@ class CRM_Pledge_BAO_PledgeBlock extends CRM_Pledge_DAO_PledgeBlock {
       if (!empty($nextPayment)) {
         $label = ts("%1 - due on %2", array(
           1 => CRM_Utils_Money::format(CRM_Utils_Array::value('scheduled_amount', $nextPayment), CRM_Utils_Array::value('scheduled_amount_currency', $nextPayment)),
-          2 => CRM_Utils_Array::value('scheduled_date', $nextPayment),
+          2 => $nextPayment['scheduled_date'] ?? NULL,
         ));
-        $paymentID = CRM_Utils_Array::value('id', $nextPayment);
+        $paymentID = $nextPayment['id'] ?? NULL;
         $payments[] = $form->createElement('checkbox', $paymentID, NULL, $label, array('amount' => CRM_Utils_Array::value('scheduled_amount', $nextPayment)));
       }
       // give error if empty or build form for payment.
diff --git a/civicrm/CRM/Pledge/BAO/Query.php b/civicrm/CRM/Pledge/BAO/Query.php
index 7ea0fcb316..4b780c5983 100644
--- a/civicrm/CRM/Pledge/BAO/Query.php
+++ b/civicrm/CRM/Pledge/BAO/Query.php
@@ -524,7 +524,7 @@ class CRM_Pledge_BAO_Query extends CRM_Core_BAO_Query {
   }
 
   /**
-   * Build the search for for pledges.
+   * Build the search for pledges.
    *
    * @param CRM_Pledge_Form_Search|\CRM_Contact_Form_Search_Advanced $form
    *
diff --git a/civicrm/CRM/Pledge/Form/Pledge.php b/civicrm/CRM/Pledge/Form/Pledge.php
index 010335cddd..a4418c1813 100644
--- a/civicrm/CRM/Pledge/Form/Pledge.php
+++ b/civicrm/CRM/Pledge/Form/Pledge.php
@@ -205,7 +205,7 @@ class CRM_Pledge_Form_Pledge extends CRM_Core_Form {
     }
 
     $showAdditionalInfo = FALSE;
-    $this->_formType = CRM_Utils_Array::value('formType', $_GET);
+    $this->_formType = $_GET['formType'] ?? NULL;
 
     $defaults = [];
 
@@ -446,12 +446,12 @@ class CRM_Pledge_Form_Pledge extends CRM_Core_Form {
       'campaign_id',
     ];
     foreach ($fields as $f) {
-      $params[$f] = CRM_Utils_Array::value($f, $formValues);
+      $params[$f] = $formValues[$f] ?? NULL;
     }
 
     // format amount
     $params['amount'] = CRM_Utils_Rule::cleanMoney(CRM_Utils_Array::value('amount', $formValues));
-    $params['currency'] = CRM_Utils_Array::value('currency', $formValues);
+    $params['currency'] = $formValues['currency'] ?? NULL;
     $params['original_installment_amount'] = ($params['amount'] / $params['installments']);
 
     $dates = ['create_date', 'start_date', 'acknowledge_date', 'cancel_date'];
diff --git a/civicrm/CRM/Pledge/Selector/Search.php b/civicrm/CRM/Pledge/Selector/Search.php
index fa142004dc..aef07fbcfa 100644
--- a/civicrm/CRM/Pledge/Selector/Search.php
+++ b/civicrm/CRM/Pledge/Selector/Search.php
@@ -167,8 +167,8 @@ class CRM_Pledge_Selector_Search extends CRM_Core_Selector_Base {
    */
   public static function &links() {
     $args = func_get_args();
-    $hideOption = CRM_Utils_Array::value(0, $args);
-    $key = CRM_Utils_Array::value(1, $args);
+    $hideOption = $args[0] ?? NULL;
+    $key = $args[1] ?? NULL;
 
     $extraParams = ($key) ? "&key={$key}" : NULL;
 
@@ -299,7 +299,7 @@ class CRM_Pledge_Selector_Search extends CRM_Core_Selector_Base {
       }
 
       // carry campaign on selectors.
-      $row['campaign'] = CRM_Utils_Array::value($result->pledge_campaign_id, $allCampaigns);
+      $row['campaign'] = $allCampaigns[$result->pledge_campaign_id] ?? NULL;
       $row['campaign_id'] = $result->pledge_campaign_id;
 
       // add pledge status name
diff --git a/civicrm/CRM/Pledge/StateMachine/Search.php b/civicrm/CRM/Pledge/StateMachine/Search.php
index 9b8eb4a85a..b47ba015f9 100644
--- a/civicrm/CRM/Pledge/StateMachine/Search.php
+++ b/civicrm/CRM/Pledge/StateMachine/Search.php
@@ -69,7 +69,7 @@ class CRM_Pledge_StateMachine_Search extends CRM_Core_StateMachine {
    */
   public function taskName($controller, $formName = 'Search') {
     // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
+    $value = $_POST['task'] ?? NULL;
     if (!isset($value)) {
       $value = $this->_controller->get('task');
     }
diff --git a/civicrm/CRM/Pledge/Task.php b/civicrm/CRM/Pledge/Task.php
index 2e48bc430a..95b027a012 100644
--- a/civicrm/CRM/Pledge/Task.php
+++ b/civicrm/CRM/Pledge/Task.php
@@ -105,7 +105,7 @@ class CRM_Pledge_Task extends CRM_Core_Task {
   public static function getTask($value) {
     self::tasks();
 
-    if (!CRM_Utils_Array::value($value, self::$_tasks)) {
+    if (empty(self::$_tasks[$value])) {
       // make it the print task by default
       $value = self::TASK_PRINT;
     }
diff --git a/civicrm/CRM/Price/BAO/LineItem.php b/civicrm/CRM/Price/BAO/LineItem.php
index c1f017f435..516b2c84ec 100644
--- a/civicrm/CRM/Price/BAO/LineItem.php
+++ b/civicrm/CRM/Price/BAO/LineItem.php
@@ -32,7 +32,7 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem {
    * @throws \Exception
    */
   public static function create(&$params) {
-    $id = CRM_Utils_Array::value('id', $params);
+    $id = $params['id'] ?? NULL;
     if ($id) {
       CRM_Utils_Hook::pre('edit', 'LineItem', $id, $params);
       $op = CRM_Core_Action::UPDATE;
@@ -45,8 +45,8 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem {
     // unset entity table and entity id in $params
     // we never update the entity table and entity id during update mode
     if ($id) {
-      $entity_id = CRM_Utils_Array::value('entity_id', $params);
-      $entity_table = CRM_Utils_Array::value('entity_table', $params);
+      $entity_id = $params['entity_id'] ?? NULL;
+      $entity_table = $params['entity_table'] ?? NULL;
       unset($params['entity_id'], $params['entity_table']);
     }
     else {
@@ -242,7 +242,7 @@ WHERE li.contribution_id = %1";
 
     $getTaxDetails = FALSE;
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    $invoicing = $invoiceSettings['invoicing'] ?? NULL;
 
     $dao = CRM_Core_DAO::executeQuery("$selectClause $fromClause $whereClause $orderByClause", $params);
     while ($dao->fetch()) {
@@ -286,7 +286,7 @@ WHERE li.contribution_id = %1";
     }
     if ($invoicing) {
       // @todo - this is an inappropriate place to be doing form level assignments.
-      $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
+      $taxTerm = $invoiceSettings['tax_term'] ?? NULL;
       $smarty = CRM_Core_Smarty::singleton();
       $smarty->assign('taxTerm', $taxTerm);
       $smarty->assign('getTaxDetails', $getTaxDetails);
@@ -329,7 +329,7 @@ WHERE li.contribution_id = %1";
     else {
       CRM_Price_BAO_PriceFieldValue::getValues($fid, $options, 'weight', TRUE);
     }
-    $fieldTitle = CRM_Utils_Array::value('label', $fields);
+    $fieldTitle = $fields['label'] ?? NULL;
     if (!$fieldTitle) {
       $fieldTitle = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $fid, 'label');
     }
@@ -342,21 +342,21 @@ WHERE li.contribution_id = %1";
       $values[$oid] = [
         'price_field_id' => $fid,
         'price_field_value_id' => $oid,
-        'label' => CRM_Utils_Array::value('label', $options[$oid]),
+        'label' => $options[$oid]['label'] ?? NULL,
         'field_title' => $fieldTitle,
-        'description' => CRM_Utils_Array::value('description', $options[$oid]),
+        'description' => $options[$oid]['description'] ?? NULL,
         'qty' => $qty,
         'unit_price' => $price,
         'line_total' => $qty * $price,
         'participant_count' => $qty * $participantsPerField,
-        'max_value' => CRM_Utils_Array::value('max_value', $options[$oid]),
-        'membership_type_id' => CRM_Utils_Array::value('membership_type_id', $options[$oid]),
-        'membership_num_terms' => CRM_Utils_Array::value('membership_num_terms', $options[$oid]),
-        'auto_renew' => CRM_Utils_Array::value('auto_renew', $options[$oid]),
+        'max_value' => $options[$oid]['max_value'] ?? NULL,
+        'membership_type_id' => $options[$oid]['membership_type_id'] ?? NULL,
+        'membership_num_terms' => $options[$oid]['membership_num_terms'] ?? NULL,
+        'auto_renew' => $options[$oid]['auto_renew'] ?? NULL,
         'html_type' => $fields['html_type'],
-        'financial_type_id' => CRM_Utils_Array::value('financial_type_id', $options[$oid]),
+        'financial_type_id' => $options[$oid]['financial_type_id'] ?? NULL,
         'tax_amount' => CRM_Utils_Array::value('tax_amount', $options[$oid], 0),
-        'non_deductible_amount' => CRM_Utils_Array::value('non_deductible_amount', $options[$oid]),
+        'non_deductible_amount' => $options[$oid]['non_deductible_amount'] ?? NULL,
       ];
 
       if ($values[$oid]['membership_type_id'] && empty($values[$oid]['auto_renew'])) {
@@ -533,7 +533,7 @@ WHERE li.contribution_id = %1";
     if (!$entityId) {
       $priceSetDetails = CRM_Price_BAO_PriceSet::getDefaultPriceSet($entityTable);
       $totalAmount = CRM_Utils_Array::value('partial_payment_total', $params, CRM_Utils_Array::value('total_amount', $params));
-      $financialType = CRM_Utils_Array::value('financial_type_id', $params);
+      $financialType = $params['financial_type_id'] ?? NULL;
       foreach ($priceSetDetails as $values) {
         if ($entityTable == 'membership') {
           if ($isRelatedID != $values['membership_type_id']) {
diff --git a/civicrm/CRM/Price/BAO/PriceField.php b/civicrm/CRM/Price/BAO/PriceField.php
index b5660d92be..411d11ede5 100644
--- a/civicrm/CRM/Price/BAO/PriceField.php
+++ b/civicrm/CRM/Price/BAO/PriceField.php
@@ -143,15 +143,15 @@ class CRM_Price_BAO_PriceField extends CRM_Price_DAO_PriceField {
           'membership_type_id' => CRM_Utils_Array::value($index, CRM_Utils_Array::value('membership_type_id', $params), NULL),
           'weight' => $params['option_weight'][$index],
           'is_active' => 1,
-          'is_default' => CRM_Utils_Array::value($params['option_weight'][$index], $defaultArray) ? $defaultArray[$params['option_weight'][$index]] : 0,
+          'is_default' => !empty($defaultArray[$params['option_weight'][$index]]) ? $defaultArray[$params['option_weight'][$index]] : 0,
           'membership_num_terms' => NULL,
-          'non_deductible_amount' => CRM_Utils_Array::value('non_deductible_amount', $params),
+          'non_deductible_amount' => $params['non_deductible_amount'] ?? NULL,
           'visibility_id' => CRM_Utils_Array::value($index, CRM_Utils_Array::value('option_visibility_id', $params), self::getVisibilityOptionID('public')),
         ];
 
         if ($options['membership_type_id']) {
           $options['membership_num_terms'] = CRM_Utils_Array::value($index, CRM_Utils_Array::value('membership_num_terms', $params), 1);
-          $options['is_default'] = CRM_Utils_Array::value($params['membership_type_id'][$index], $defaultArray) ? $defaultArray[$params['membership_type_id'][$index]] : 0;
+          $options['is_default'] = !empty($defaultArray[$params['membership_type_id'][$index]]) ? $defaultArray[$params['membership_type_id'][$index]] : 0;
         }
 
         if (CRM_Utils_Array::value($index, CRM_Utils_Array::value('option_financial_type_id', $params))) {
@@ -294,7 +294,7 @@ class CRM_Price_BAO_PriceField extends CRM_Price_DAO_PriceField {
       $is_pay_later = 1;
     }
     elseif (isset($qf->_values)) {
-      $is_pay_later = CRM_Utils_Array::value('is_pay_later', $qf->_values);
+      $is_pay_later = $qf->_values['is_pay_later'] ?? NULL;
     }
 
     $otherAmount = $qf->get('values');
@@ -325,15 +325,15 @@ class CRM_Price_BAO_PriceField extends CRM_Price_DAO_PriceField {
     $valueFieldName = 'amount';
     $seperator = '|';
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
-    $displayOpt = CRM_Utils_Array::value('tax_display_settings', $invoiceSettings);
-    $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    $taxTerm = $invoiceSettings['tax_term'] ?? NULL;
+    $displayOpt = $invoiceSettings['tax_display_settings'] ?? NULL;
+    $invoicing = $invoiceSettings['invoicing'] ?? NULL;
     switch ($field->html_type) {
       case 'Text':
         $optionKey = key($customOption);
         $count = CRM_Utils_Array::value('count', $customOption[$optionKey], '');
         $max_value = CRM_Utils_Array::value('max_value', $customOption[$optionKey], '');
-        $taxAmount = CRM_Utils_Array::value('tax_amount', $customOption[$optionKey]);
+        $taxAmount = $customOption[$optionKey]['tax_amount'] ?? NULL;
         if (isset($taxAmount) && $displayOpt && $invoicing) {
           $qf->assign('displayOpt', $displayOpt);
           $qf->assign('taxTerm', $taxTerm);
@@ -400,7 +400,7 @@ class CRM_Price_BAO_PriceField extends CRM_Price_DAO_PriceField {
         }
 
         foreach ($customOption as $opId => $opt) {
-          $taxAmount = CRM_Utils_Array::value('tax_amount', $opt);
+          $taxAmount = $opt['tax_amount'] ?? NULL;
           if ($field->is_display_amounts) {
             $opt['label'] = !empty($opt['label']) ? $opt['label'] . '<span class="crm-price-amount-label-separator">&nbsp;-&nbsp;</span>' : '';
             $preHelpText = $postHelpText = '';
@@ -512,7 +512,7 @@ class CRM_Price_BAO_PriceField extends CRM_Price_DAO_PriceField {
         $selectOption = $allowedOptions = $priceVal = [];
 
         foreach ($customOption as $opt) {
-          $taxAmount = CRM_Utils_Array::value('tax_amount', $opt);
+          $taxAmount = $opt['tax_amount'] ?? NULL;
           $count = CRM_Utils_Array::value('count', $opt, '');
           $max_value = CRM_Utils_Array::value('max_value', $opt, '');
 
@@ -568,7 +568,7 @@ class CRM_Price_BAO_PriceField extends CRM_Price_DAO_PriceField {
 
         $check = [];
         foreach ($customOption as $opId => $opt) {
-          $taxAmount = CRM_Utils_Array::value('tax_amount', $opt);
+          $taxAmount = $opt['tax_amount'] ?? NULL;
           $count = CRM_Utils_Array::value('count', $opt, '');
           $max_value = CRM_Utils_Array::value('max_value', $opt, '');
 
diff --git a/civicrm/CRM/Price/BAO/PriceFieldValue.php b/civicrm/CRM/Price/BAO/PriceFieldValue.php
index c3728227d1..34d431210a 100644
--- a/civicrm/CRM/Price/BAO/PriceFieldValue.php
+++ b/civicrm/CRM/Price/BAO/PriceFieldValue.php
@@ -39,7 +39,7 @@ class CRM_Price_BAO_PriceFieldValue extends CRM_Price_DAO_PriceFieldValue {
     $fieldValueBAO->copyValues($params);
 
     // CRM-16189
-    $priceFieldID = CRM_Utils_Array::value('price_field_id', $params);
+    $priceFieldID = $params['price_field_id'] ?? NULL;
 
     $id = CRM_Utils_Array::value('id', $ids, CRM_Utils_Array::value('id', $params));
 
@@ -73,7 +73,7 @@ class CRM_Price_BAO_PriceFieldValue extends CRM_Price_DAO_PriceFieldValue {
    * @throws \CRM_Core_Exception
    */
   public static function create(&$params, $ids = []) {
-    $id = CRM_Utils_Array::value('id', $params, CRM_Utils_Array::value('id', $ids));
+    $id = $params['id'] ?? $ids['id'] ?? NULL;
     if (!is_array($params) || empty($params)) {
       return NULL;
     }
@@ -102,7 +102,7 @@ class CRM_Price_BAO_PriceFieldValue extends CRM_Price_DAO_PriceFieldValue {
       }
     }
 
-    $financialType = CRM_Utils_Array::value('financial_type_id', $params, NULL);
+    $financialType = $params['financial_type_id'] ?? NULL;
     if (!$financialType && $id) {
       $financialType = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $id, 'financial_type_id', 'id');
     }
@@ -157,7 +157,7 @@ class CRM_Price_BAO_PriceFieldValue extends CRM_Price_DAO_PriceFieldValue {
    *
    */
   public static function getValues($fieldId, &$values, $orderBy = 'weight', $isActive = FALSE, $admin = FALSE) {
-    $sql = "SELECT cs.id FROM civicrm_price_set cs INNER JOIN civicrm_price_field cp ON cp.price_set_id = cs.id 
+    $sql = "SELECT cs.id FROM civicrm_price_set cs INNER JOIN civicrm_price_field cp ON cp.price_set_id = cs.id
               WHERE cs.name IN ('default_contribution_amount', 'default_membership_type_amount') AND cp.id = {$fieldId} ";
     $setId = CRM_Core_DAO::singleValueQuery($sql);
     $fieldValueDAO = new CRM_Price_DAO_PriceFieldValue();
diff --git a/civicrm/CRM/Price/BAO/PriceSet.php b/civicrm/CRM/Price/BAO/PriceSet.php
index f9e24c14d9..c0cbf660a5 100644
--- a/civicrm/CRM/Price/BAO/PriceSet.php
+++ b/civicrm/CRM/Price/BAO/PriceSet.php
@@ -61,7 +61,7 @@ class CRM_Price_BAO_PriceSet extends CRM_Price_DAO_PriceSet {
       $params['extends'] = CRM_Utils_Array::implodePadded($params['extends']);
     }
     else {
-      $priceSetID = CRM_Utils_Array::value('id', $params);
+      $priceSetID = $params['id'] ?? NULL;
     }
     $priceSetBAO = new CRM_Price_BAO_PriceSet();
     $priceSetBAO->copyValues($params);
@@ -340,7 +340,7 @@ WHERE     cpf.price_set_id = %1";
       }
     }
     else {
-      $fid = CRM_Utils_Array::value('fid', $params);
+      $fid = $params['fid'] ?? NULL;
     }
 
     if (isset($fid)) {
@@ -603,8 +603,8 @@ WHERE  id = %1";
 
       $form->_priceSetId = $priceSetId;
       $priceSet = self::getSetDetail($priceSetId, $required, $validOnly);
-      $form->_priceSet = CRM_Utils_Array::value($priceSetId, $priceSet);
-      $form->_values['fee'] = CRM_Utils_Array::value('fields', $form->_priceSet);
+      $form->_priceSet = $priceSet[$priceSetId] ?? NULL;
+      $form->_values['fee'] = $form->_priceSet['fields'] ?? NULL;
 
       //get the price set fields participant count.
       if ($entityTable == 'civicrm_event') {
@@ -829,7 +829,7 @@ WHERE  id = %1";
     }
 
     $priceSet = self::getSetDetail($priceSetId, TRUE, $validFieldsOnly);
-    $form->_priceSet = CRM_Utils_Array::value($priceSetId, $priceSet);
+    $form->_priceSet = $priceSet[$priceSetId] ?? NULL;
     $validPriceFieldIds = array_keys($form->_priceSet['fields']);
     $form->_quickConfig = $quickConfig = 0;
     if (CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config')) {
@@ -900,7 +900,7 @@ WHERE  id = %1";
         (CRM_Utils_Array::value('visibility', $field) == 'admin' && $adminFieldVisible == TRUE) ||
         !$validFieldsOnly
       ) {
-        $options = CRM_Utils_Array::value('options', $field);
+        $options = $field['options'] ?? NULL;
         if ($className == 'CRM_Contribute_Form_Contribution_Main' && $component = 'membership') {
           $userid = $form->getVar('_membershipContactID');
           $checklifetime = self::checkCurrentMembership($options, $userid);
diff --git a/civicrm/CRM/Price/Form/Field.php b/civicrm/CRM/Price/Form/Field.php
index 5e4a5c4e8d..c8e0f2a7b7 100644
--- a/civicrm/CRM/Price/Form/Field.php
+++ b/civicrm/CRM/Price/Form/Field.php
@@ -574,7 +574,7 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
           for ($index = 1; $index <= self::NUM_OPTION; $index++) {
 
             $isOptionSet = !empty($fields['option_label'][$index]) || !empty($fields['option_amount'][$index]);
-            $currentOptionVisibility = CRM_Utils_Array::value($fields['option_visibility_id'][$index], $visibilityOptions);
+            $currentOptionVisibility = $visibilityOptions[$fields['option_visibility_id'][$index]] ?? NULL;
 
             if ($isOptionSet && $currentOptionVisibility == 'public') {
               $errors["option_visibility_id[{$index}]"] = ts('\'Admin\' field should only have \'Admin\' visibility options.');
diff --git a/civicrm/CRM/Price/Form/Set.php b/civicrm/CRM/Price/Form/Set.php
index 47f45516f2..96a5b53cb3 100644
--- a/civicrm/CRM/Price/Form/Set.php
+++ b/civicrm/CRM/Price/Form/Set.php
@@ -269,7 +269,7 @@ class CRM_Price_Form_Set extends CRM_Core_Form {
     $params['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params, FALSE);
 
     $compIds = [];
-    $extends = CRM_Utils_Array::value('extends', $params);
+    $extends = $params['extends'] ?? NULL;
     if (is_array($extends)) {
       foreach ($extends as $compId => $selected) {
         if ($selected) {
diff --git a/civicrm/CRM/Price/Page/Field.php b/civicrm/CRM/Price/Page/Field.php
index 8279fc310a..141670e4d1 100644
--- a/civicrm/CRM/Price/Page/Field.php
+++ b/civicrm/CRM/Price/Page/Field.php
@@ -111,8 +111,8 @@ class CRM_Price_Page_Field extends CRM_Core_Page {
 
     // display taxTerm for priceFields
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
-    $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    $taxTerm = $invoiceSettings['tax_term'] ?? NULL;
+    $invoicing = $invoiceSettings['invoicing'] ?? NULL;
     $getTaxDetails = FALSE;
     $taxRate = CRM_Core_PseudoConstant::getTaxRates();
     CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes);
@@ -126,7 +126,7 @@ class CRM_Price_Page_Field extends CRM_Core_Page {
         $params = ['price_field_id' => $priceFieldBAO->id];
 
         CRM_Price_BAO_PriceFieldValue::retrieve($params, $optionValues);
-        $priceField[$priceFieldBAO->id]['price'] = CRM_Utils_Array::value('amount', $optionValues);
+        $priceField[$priceFieldBAO->id]['price'] = $optionValues['amount'] ?? NULL;
         $financialTypeId = $optionValues['financial_type_id'];
         if ($invoicing && isset($taxRate[$financialTypeId])) {
           $priceField[$priceFieldBAO->id]['tax_rate'] = $taxRate[$financialTypeId];
diff --git a/civicrm/CRM/Price/Page/Option.php b/civicrm/CRM/Price/Page/Option.php
index f7b46ab689..df3b6a3fc9 100644
--- a/civicrm/CRM/Price/Page/Option.php
+++ b/civicrm/CRM/Price/Page/Option.php
@@ -130,8 +130,8 @@ class CRM_Price_Page_Option extends CRM_Core_Page {
     $taxRate = CRM_Core_PseudoConstant::getTaxRates();
     // display taxTerm for priceFields
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
-    $taxTerm = CRM_Utils_Array::value('tax_term', $invoiceSettings);
-    $invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
+    $taxTerm = $invoiceSettings['tax_term'] ?? NULL;
+    $invoicing = $invoiceSettings['invoicing'] ?? NULL;
     $getTaxDetails = FALSE;
     foreach ($customOption as $id => $values) {
       $action = array_sum(array_keys(self::actionLinks()));
diff --git a/civicrm/CRM/Profile/Form.php b/civicrm/CRM/Profile/Form.php
index bbd5210e37..2567e79ec2 100644
--- a/civicrm/CRM/Profile/Form.php
+++ b/civicrm/CRM/Profile/Form.php
@@ -357,7 +357,7 @@ class CRM_Profile_Form extends CRM_Core_Form {
         $this->_ufGroup = (array) $dao;
       }
 
-      if (!CRM_Utils_Array::value('is_active', $this->_ufGroup)) {
+      if (empty($this->_ufGroup['is_active'])) {
         CRM_Core_Error::fatal(ts('The requested profile (gid=%1) is inactive or does not exist.', [
           1 => $this->_gid,
         ]));
@@ -841,7 +841,7 @@ class CRM_Profile_Form extends CRM_Core_Form {
         $addCaptcha[$field['group_id']] = $field['add_captcha'];
       }
 
-      if (($name == 'email-Primary') || ($name == 'email-' . isset($primaryLocationType) ? $primaryLocationType : "")) {
+      if (($name == 'email-Primary') || ($name == 'email-' . ($primaryLocationType ?? ""))) {
         $emailPresent = TRUE;
         $this->_mail = $name;
       }
@@ -994,7 +994,7 @@ class CRM_Profile_Form extends CRM_Core_Form {
     if (!$register && empty($fields['_qf_Edit_upload_duplicate'])) {
       // fix for CRM-3240
       if (!empty($fields['email-Primary'])) {
-        $fields['email'] = CRM_Utils_Array::value('email-Primary', $fields);
+        $fields['email'] = $fields['email-Primary'] ?? NULL;
       }
 
       // fix for CRM-6141
@@ -1187,7 +1187,7 @@ class CRM_Profile_Form extends CRM_Core_Form {
       }
     }
 
-    $addToGroupId = CRM_Utils_Array::value('add_to_group_id', $this->_ufGroup);
+    $addToGroupId = $this->_ufGroup['add_to_group_id'] ?? NULL;
     if (!empty($addToGroupId)) {
       //run same check whether group is a mailing list
       $groupTypes = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Group',
diff --git a/civicrm/CRM/Profile/Form/Edit.php b/civicrm/CRM/Profile/Form/Edit.php
index 29c350841a..e041c1c1f0 100644
--- a/civicrm/CRM/Profile/Form/Edit.php
+++ b/civicrm/CRM/Profile/Form/Edit.php
@@ -146,7 +146,7 @@ SELECT module,is_reserved
 
     }
     else {
-      $groupTitle = $this->_ufGroup['title'];
+      $groupTitle = CRM_Core_BAO_UFGroup::getFrontEndTitle($this->_ufGroup['id']);
     }
     CRM_Utils_System::setTitle($groupTitle);
     $this->assign('recentlyViewed', FALSE);
@@ -188,7 +188,7 @@ SELECT module,is_reserved
       $this->_cancelURL = str_replace('&amp;', '&', $this->_cancelURL);
 
       // also retain error URL if set
-      $this->_errorURL = CRM_Utils_Array::value('errorURL', $_POST);
+      $this->_errorURL = $_POST['errorURL'] ?? NULL;
       if ($this->_errorURL) {
         // we do this gross hack since qf also does entity replacement
         $this->_errorURL = str_replace('&amp;', '&', $this->_errorURL);
@@ -252,7 +252,7 @@ SELECT module,is_reserved
       ]);
       foreach (explode(',', $this->returnExtra) as $field) {
         $field = trim($field);
-        $this->ajaxResponse['extra'][$field] = CRM_Utils_Array::value($field, $contact);
+        $this->ajaxResponse['extra'][$field] = $contact[$field] ?? NULL;
       }
     }
 
diff --git a/civicrm/CRM/Profile/Page/Listings.php b/civicrm/CRM/Profile/Page/Listings.php
index 0b84b8753e..46807507ce 100644
--- a/civicrm/CRM/Profile/Page/Listings.php
+++ b/civicrm/CRM/Profile/Page/Listings.php
@@ -205,7 +205,7 @@ class CRM_Profile_Page_Listings extends CRM_Core_Page {
         }
       }
 
-      $customField = CRM_Utils_Array::value($name, $this->_customFields);
+      $customField = $this->_customFields[$name] ?? NULL;
 
       if (!empty($_POST) && empty($_POST[$name])) {
         if ($customField) {
@@ -410,7 +410,7 @@ class CRM_Profile_Page_Listings extends CRM_Core_Page {
       CRM_Core_Error::statusBounce(ts('This profile does not have the map feature turned on.'));
     }
 
-    $groupId = CRM_Utils_Array::value('limit_listings_group_id', $details);
+    $groupId = $details['limit_listings_group_id'] ?? NULL;
 
     // add group id to params if a uf group belong to a any group
     if ($groupId) {
diff --git a/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php b/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php
index 0593c82c3d..18cba944bf 100644
--- a/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php
+++ b/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php
@@ -220,7 +220,7 @@ class CRM_Profile_Page_MultipleRecordFieldsListing extends CRM_Core_Page_Basic {
           $dateFields[$fieldIDs[$key]] = 1;
           $actualPHPFormats = CRM_Utils_Date::datePluginToPHPFormats();
           $dateFormat = (array) CRM_Utils_Array::value($returnValues['date_format'], $actualPHPFormats);
-          $timeFormat = CRM_Utils_Array::value('time_format', $returnValues);
+          $timeFormat = $returnValues['time_format'] ?? NULL;
         }
 
         $optionValuePairs = CRM_Core_BAO_CustomOption::getCustomOption($fieldIDs[$key]);
@@ -233,12 +233,12 @@ class CRM_Profile_Page_MultipleRecordFieldsListing extends CRM_Core_Page_Basic {
         $options[$fieldIDs[$key]]['attributes']['html_type'] = $returnValues['html_type'];
         $options[$fieldIDs[$key]]['attributes']['data_type'] = $returnValues['data_type'];
         $options[$fieldIDs[$key]]['attributes']['is_required'] = !empty($returnValues['is_required']);
-        $options[$fieldIDs[$key]]['attributes']['default_value'] = CRM_Utils_Array::value('default_value', $returnValues);
-        $options[$fieldIDs[$key]]['attributes']['is_view'] = CRM_Utils_Array::value('is_view', $returnValues);
+        $options[$fieldIDs[$key]]['attributes']['default_value'] = $returnValues['default_value'] ?? NULL;
+        $options[$fieldIDs[$key]]['attributes']['is_view'] = $returnValues['is_view'] ?? NULL;
 
         $options[$fieldIDs[$key]]['attributes']['format']
-          = $options[$fieldIDs[$key]]['attributes']['date_format'] = CRM_Utils_Array::value('date_format', $returnValues);
-        $options[$fieldIDs[$key]]['attributes']['time_format'] = CRM_Utils_Array::value('time_format', $returnValues);
+          = $options[$fieldIDs[$key]]['attributes']['date_format'] = $returnValues['date_format'] ?? NULL;
+        $options[$fieldIDs[$key]]['attributes']['time_format'] = $returnValues['time_format'] ?? NULL;
       }
       $linkAction = array_sum(array_keys($this->links()));
     }
diff --git a/civicrm/CRM/Profile/Selector/Listings.php b/civicrm/CRM/Profile/Selector/Listings.php
index 09eb0a6e98..8c7cd19959 100644
--- a/civicrm/CRM/Profile/Selector/Listings.php
+++ b/civicrm/CRM/Profile/Selector/Listings.php
@@ -307,9 +307,9 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
 
           if (strpos($name, '-') !== FALSE) {
             $value = explode('-', $name);
-            $fieldName = CRM_Utils_Array::value(0, $value);
-            $lType = CRM_Utils_Array::value(1, $value);
-            $type = CRM_Utils_Array::value(2, $value);
+            $fieldName = $value[0] ?? NULL;
+            $lType = $value[1] ?? NULL;
+            $type = $value[2] ?? NULL;
 
             if (!in_array($fieldName, $multipleFields)) {
               if ($lType == 'Primary') {
@@ -380,7 +380,7 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
     if ($this->_multiRecordTableName &&
       !array_key_exists($this->_multiRecordTableName, $this->_query->_whereTables)
     ) {
-      $additionalFromClause = CRM_Utils_Array::value($this->_multiRecordTableName, $this->_query->_tables);
+      $additionalFromClause = $this->_query->_tables[$this->_multiRecordTableName] ?? NULL;
       $returnQuery = TRUE;
     }
 
@@ -436,7 +436,7 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
       foreach ($vars as $key => $field) {
         $field = $vars[$key];
         $fieldArray = explode('-', $field['name']);
-        $fieldType = CRM_Utils_Array::value('2', $fieldArray);
+        $fieldType = $fieldArray['2'] ?? NULL;
         if (is_numeric(CRM_Utils_Array::value('1', $fieldArray))) {
           if (!in_array($fieldType, $multipleFields)) {
             $locationType = new CRM_Core_DAO_LocationType();
@@ -513,14 +513,14 @@ class CRM_Profile_Selector_Listings extends CRM_Core_Selector_Base implements CR
       ) {
         if (strpos($key, '-') !== FALSE) {
           $value = explode('-', $key);
-          $fieldName = CRM_Utils_Array::value(0, $value);
-          $id = CRM_Utils_Array::value(1, $value);
-          $type = CRM_Utils_Array::value(2, $value);
+          $fieldName = $value[0] ?? NULL;
+          $id = $value[1] ?? NULL;
+          $type = $value[2] ?? NULL;
 
           if (!in_array($fieldName, $multipleFields)) {
             $locationTypeName = NULL;
             if (is_numeric($id)) {
-              $locationTypeName = CRM_Utils_Array::value($id, $locationTypes);
+              $locationTypeName = $locationTypes[$id] ?? NULL;
             }
             else {
               if ($id == 'Primary') {
diff --git a/civicrm/CRM/Queue/Runner.php b/civicrm/CRM/Queue/Runner.php
index d44a073b52..bac1f8e449 100644
--- a/civicrm/CRM/Queue/Runner.php
+++ b/civicrm/CRM/Queue/Runner.php
@@ -97,8 +97,8 @@ class CRM_Queue_Runner {
     $this->queue = $runnerSpec['queue'];
     $this->errorMode = CRM_Utils_Array::value('errorMode', $runnerSpec, self::ERROR_ABORT);
     $this->isMinimal = CRM_Utils_Array::value('isMinimal', $runnerSpec, FALSE);
-    $this->onEnd = CRM_Utils_Array::value('onEnd', $runnerSpec, NULL);
-    $this->onEndUrl = CRM_Utils_Array::value('onEndUrl', $runnerSpec, NULL);
+    $this->onEnd = $runnerSpec['onEnd'] ?? NULL;
+    $this->onEndUrl = $runnerSpec['onEndUrl'] ?? NULL;
     $this->pathPrefix = CRM_Utils_Array::value('pathPrefix', $runnerSpec, 'civicrm/queue');
     $this->buttons = CRM_Utils_Array::value('buttons', $runnerSpec, ['retry' => TRUE, 'skip' => TRUE]);
     // perhaps this value should be randomized?
@@ -315,7 +315,7 @@ class CRM_Queue_Runner {
     $result = [];
     $result['is_error'] = $isOK ? 0 : 1;
     $result['exception'] = $exception;
-    $result['last_task_title'] = isset($this->lastTaskTitle) ? $this->lastTaskTitle : '';
+    $result['last_task_title'] = $this->lastTaskTitle ?? '';
     $result['numberOfItems'] = $this->queue->numberOfItems();
     if ($result['numberOfItems'] <= 0) {
       // nothing to do
diff --git a/civicrm/CRM/Report/BAO/ReportInstance.php b/civicrm/CRM/Report/BAO/ReportInstance.php
index 2c7f103428..daeff31df1 100644
--- a/civicrm/CRM/Report/BAO/ReportInstance.php
+++ b/civicrm/CRM/Report/BAO/ReportInstance.php
@@ -50,7 +50,7 @@ class CRM_Report_BAO_ReportInstance extends CRM_Report_DAO_ReportInstance {
       $params['is_reserved'] = CRM_Utils_Array::value('is_reserved', $params, FALSE);
       $params['domain_id'] = CRM_Utils_Array::value('domain_id', $params, CRM_Core_Config::domainID());
       // CRM-17256 set created_id on report creation.
-      $params['created_id'] = isset($params['created_id']) ? $params['created_id'] : CRM_Core_Session::getLoggedInContactID();
+      $params['created_id'] = $params['created_id'] ?? CRM_Core_Session::getLoggedInContactID();
     }
 
     if ($instanceID) {
@@ -114,10 +114,10 @@ class CRM_Report_BAO_ReportInstance extends CRM_Report_DAO_ReportInstance {
    */
   public static function &create(&$params) {
     if (isset($params['report_header'])) {
-      $params['header'] = CRM_Utils_Array::value('report_header', $params);
+      $params['header'] = $params['report_header'] ?? NULL;
     }
     if (isset($params['report_footer'])) {
-      $params['footer'] = CRM_Utils_Array::value('report_footer', $params);
+      $params['footer'] = $params['report_footer'] ?? NULL;
     }
 
     // build navigation parameters
@@ -131,8 +131,8 @@ class CRM_Report_BAO_ReportInstance extends CRM_Report_DAO_ReportInstance {
       $navigationParams['label'] = $params['title'];
       $navigationParams['name'] = $params['title'];
 
-      $navigationParams['current_parent_id'] = CRM_Utils_Array::value('parent_id', $navigationParams);
-      $navigationParams['parent_id'] = CRM_Utils_Array::value('parent_id', $params);
+      $navigationParams['current_parent_id'] = $navigationParams['parent_id'] ?? NULL;
+      $navigationParams['parent_id'] = $params['parent_id'] ?? NULL;
       $navigationParams['is_active'] = 1;
 
       if ($permission = CRM_Utils_Array::value('permission', $params)) {
@@ -144,7 +144,7 @@ class CRM_Report_BAO_ReportInstance extends CRM_Report_DAO_ReportInstance {
       unset($params['is_navigation']);
     }
 
-    $viewMode = !empty($params['view_mode']) ? $params['view_mode'] : FALSE;
+    $viewMode = !empty($params['view_mode']);
     if ($viewMode) {
       // Do not save to the DB - it's saved in the url.
       unset($params['view_mode']);
diff --git a/civicrm/CRM/Report/DAO/ReportInstance.php b/civicrm/CRM/Report/DAO/ReportInstance.php
index 0bdead7770..cc235a182d 100644
--- a/civicrm/CRM/Report/DAO/ReportInstance.php
+++ b/civicrm/CRM/Report/DAO/ReportInstance.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Report/ReportInstance.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4e7df5b68b3cb5f69c91c4da8613c053)
+ * (GenCodeChecksum:3b68bec0504edaba7f0038dc41baa524)
  */
 
 /**
@@ -94,7 +94,7 @@ class CRM_Report_DAO_ReportInstance extends CRM_Core_DAO {
   /**
    * Submitted form values for this report
    *
-   * @var text
+   * @var longtext
    */
   public $form_values;
 
@@ -353,7 +353,7 @@ class CRM_Report_DAO_ReportInstance extends CRM_Core_DAO {
         ],
         'form_values' => [
           'name' => 'form_values',
-          'type' => CRM_Utils_Type::T_TEXT,
+          'type' => CRM_Utils_Type::T_LONGTEXT,
           'title' => ts('Submitted Form Values'),
           'description' => ts('Submitted form values for this report'),
           'import' => TRUE,
diff --git a/civicrm/CRM/Report/Form.php b/civicrm/CRM/Report/Form.php
index 56bfdd6f7e..694b77b7e6 100644
--- a/civicrm/CRM/Report/Form.php
+++ b/civicrm/CRM/Report/Form.php
@@ -139,11 +139,6 @@ class CRM_Report_Form extends CRM_Core_Form {
    */
   protected $_groupFilter = FALSE;
 
-  /**
-   * Required for civiexportexcel.
-   */
-  public $supportsExportExcel = TRUE;
-
   /**
    * Has the report been optimised for group filtering.
    *
@@ -619,7 +614,7 @@ class CRM_Report_Form extends CRM_Core_Form {
         CRM_Utils_System::civiExit();
       }
 
-      $formValues = CRM_Utils_Array::value('form_values', $this->_instanceValues);
+      $formValues = $this->_instanceValues['form_values'] ?? NULL;
       if ($formValues) {
         $this->_formValues = CRM_Utils_String::unserialize($formValues);
       }
@@ -761,7 +756,7 @@ class CRM_Report_Form extends CRM_Core_Form {
         if (!empty($table[$fieldGrp]) && is_array($table[$fieldGrp])) {
           foreach ($table[$fieldGrp] as $fieldName => $field) {
             // $name is the field name used to reference the BAO/DAO export fields array
-            $name = isset($field['name']) ? $field['name'] : $fieldName;
+            $name = $field['name'] ?? $fieldName;
 
             // Sometimes the field name key in the BAO/DAO export fields array is
             // different from the actual database field name.
@@ -795,8 +790,8 @@ class CRM_Report_Form extends CRM_Core_Form {
             }
 
             // set alias = table-name, unless already set
-            $alias = isset($field['alias']) ? $field['alias'] : (
-              isset($this->_columns[$tableName]['alias']) ? $this->_columns[$tableName]['alias'] : $tableName
+            $alias = $field['alias'] ?? (
+              $this->_columns[$tableName]['alias'] ?? $tableName
             );
             $this->_columns[$tableName][$fieldGrp][$fieldName]['alias'] = $alias;
 
@@ -952,8 +947,8 @@ class CRM_Report_Form extends CRM_Core_Form {
             if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE
             ) {
               if (is_array($field['default'])) {
-                $this->_defaults["{$fieldName}_from"] = CRM_Utils_Array::value('from', $field['default']);
-                $this->_defaults["{$fieldName}_to"] = CRM_Utils_Array::value('to', $field['default']);
+                $this->_defaults["{$fieldName}_from"] = $field['default']['from'] ?? NULL;
+                $this->_defaults["{$fieldName}_to"] = $field['default']['to'] ?? NULL;
                 $this->_defaults["{$fieldName}_relative"] = 0;
               }
               else {
@@ -962,8 +957,8 @@ class CRM_Report_Form extends CRM_Core_Form {
             }
             else {
               if ((CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_INT) && is_array($field['default'])) {
-                $this->_defaults["{$fieldName}_min"] = CRM_Utils_Array::value('min', $field['default']);
-                $this->_defaults["{$fieldName}_max"] = CRM_Utils_Array::value('max', $field['default']);
+                $this->_defaults["{$fieldName}_min"] = $field['default']['min'] ?? NULL;
+                $this->_defaults["{$fieldName}_max"] = $field['default']['max'] ?? NULL;
               }
               $this->_defaults["{$fieldName}_value"] = $field['default'];
             }
@@ -1221,11 +1216,11 @@ class CRM_Report_Form extends CRM_Core_Form {
               $colGroups[$tableName]['use_accordian_for_field_selection'] = TRUE;
             }
 
-            $colGroups[$tableName]['fields'][$fieldName] = CRM_Utils_Array::value('title', $field);
+            $colGroups[$tableName]['fields'][$fieldName] = $field['title'] ?? NULL;
             if ($groupTitle && empty($colGroups[$tableName]['group_title'])) {
               $colGroups[$tableName]['group_title'] = $groupTitle;
             }
-            $options[$fieldName] = CRM_Utils_Array::value('title', $field);
+            $options[$fieldName] = $field['title'] ?? NULL;
           }
         }
       }
@@ -1350,14 +1345,12 @@ class CRM_Report_Form extends CRM_Core_Form {
 
           case CRM_Report_Form::OP_DATE:
             // build datetime fields
-            CRM_Core_Form_Date::buildDateRange($this, $fieldName, $count, '_from', '_to', ts('From:'), FALSE, $operations);
-            $count++;
+            $this->addDatePickerRange($fieldName, $field['title'], FALSE, FALSE, 'From', 'To', $operations, '_to', '_from');
             break;
 
           case CRM_Report_Form::OP_DATETIME:
             // build datetime fields
-            CRM_Core_Form_Date::buildDateRange($this, $fieldName, $count, '_from', '_to', ts('From:'), FALSE, $operations, 'searchDate', TRUE);
-            $count++;
+            $this->addDatePickerRange($fieldName, $field['title'], TRUE, FALSE, 'From', 'To', $operations, '_to', '_from');
             break;
 
           case CRM_Report_Form::OP_INT:
@@ -1423,7 +1416,7 @@ class CRM_Report_Form extends CRM_Core_Form {
     if (!CRM_Core_Permission::check('view report sql')) {
       return;
     }
-    $ignored_output_modes = ['pdf', 'csv', 'print', 'excel2007'];
+    $ignored_output_modes = ['pdf', 'csv', 'print'];
     if (in_array($this->_outputMode, $ignored_output_modes)) {
       return;
     }
@@ -2173,16 +2166,17 @@ class CRM_Report_Form extends CRM_Core_Form {
       return "( {$fieldName} {$sqlOP} )";
     }
 
-    list($from, $to) = $this->getFromTo($relative, $from, $to, $fromTime, $toTime);
+    if ($relative) {
+      list($from, $to) = $this->getFromTo($relative, $from, $to, $fromTime, $toTime);
+    }
 
     if ($from) {
-      $clauses[] = "( {$fieldName} >= $from )";
+      $clauses[] = "( {$fieldName} >= " . date('YmdHis', strtotime($from)) . ')';
     }
 
     if ($to) {
-      $clauses[] = "( {$fieldName} <= {$to} )";
+      $clauses[] = "( {$fieldName} <= " . date('YmdHis', strtotime($to)) . ')';
     }
-
     if (!empty($clauses)) {
       return implode(' AND ', $clauses);
     }
@@ -2204,13 +2198,10 @@ class CRM_Report_Form extends CRM_Core_Form {
    * @return array
    */
   public function getFromTo($relative, $from, $to, $fromTime = NULL, $toTime = NULL) {
-    if (empty($toTime)) {
-      // odd legacy behaviour to treat NULL as 'end of the day'
-      // recommend updating reports to call CRM_Utils_Date::getFromTo
-      //directly (default on the function is the actual default there).
-      $toTime = '235959';
+    if (!empty($fromTime) || !empty($toTime)) {
+      throw new CRM_Core_Exception('Report template needs to be updated as getFromTo no longer supports fromTime or ToTime Parameters');
     }
-    return CRM_Utils_Date::getFromTo($relative, $from, $to, $fromTime, $toTime);
+    return CRM_Utils_Date::getFromTo($relative, $from, $to);
   }
 
   /**
@@ -2746,9 +2737,9 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
   public function selectClause(&$tableName, $tableKey, &$fieldName, &$field) {
     if (!empty($field['pseudofield'])) {
       $alias = "{$tableName}_{$fieldName}";
-      $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-      $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-      $this->_columnHeaders["{$tableName}_{$fieldName}"]['dbAlias'] = CRM_Utils_Array::value('dbAlias', $field);
+      $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+      $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+      $this->_columnHeaders["{$tableName}_{$fieldName}"]['dbAlias'] = $field['dbAlias'] ?? NULL;
       $this->_selectAliases[] = $alias;
       return ' 1 as  ' . $alias;
     }
@@ -2850,11 +2841,6 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
       $this->_absoluteUrl = TRUE;
       $this->addPaging = FALSE;
     }
-    elseif ($this->_outputMode == 'excel2007') {
-      $printOnly = TRUE;
-      $this->_absoluteUrl = TRUE;
-      $this->addPaging = FALSE;
-    }
     elseif ($this->_outputMode == 'group') {
       $this->assign('outputMode', 'group');
     }
@@ -3041,7 +3027,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
 
           // Record any section headers for assignment to the template
           if (!empty($orderBy['section'])) {
-            $orderByField['pageBreak'] = CRM_Utils_Array::value('pageBreak', $orderBy);
+            $orderByField['pageBreak'] = $orderBy['pageBreak'] ?? NULL;
             $this->_sections[$orderByField['tplField']] = $orderByField;
           }
         }
@@ -3305,21 +3291,19 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
             CRM_Utils_Array::value('operatorType', $field) !=
             CRM_Report_Form::OP_MONTH
           ) {
-            list($from, $to)
-              = $this->getFromTo(
-                CRM_Utils_Array::value("{$fieldName}_relative", $this->_params),
-                CRM_Utils_Array::value("{$fieldName}_from", $this->_params),
-                CRM_Utils_Array::value("{$fieldName}_to", $this->_params),
-                CRM_Utils_Array::value("{$fieldName}_from_time", $this->_params),
-                CRM_Utils_Array::value("{$fieldName}_to_time", $this->_params)
-              );
-            $from_time_format = !empty($this->_params["{$fieldName}_from_time"]) ? 'h' : 'd';
-            $from = CRM_Utils_Date::customFormat($from, NULL, [$from_time_format]);
-
-            $to_time_format = !empty($this->_params["{$fieldName}_to_time"]) ? 'h' : 'd';
-            $to = CRM_Utils_Date::customFormat($to, NULL, [$to_time_format]);
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
+            if (!empty($this->_params["{$fieldName}_relative"])) {
+              list($from, $to) = CRM_Utils_Date::getFromTo($this->_params["{$fieldName}_relative"], NULL, NULL);
+            }
 
             if ($from || $to) {
+              if ($from) {
+                $from = date('l j F Y, g:iA', strtotime($from));
+              }
+              if ($to) {
+                $to = date('l j F Y, g:iA', strtotime($to));
+              }
               $statistics['filters'][] = [
                 'title' => $field['title'],
                 'value' => ts("Between %1 and %2", [1 => $from, 2 => $to]),
@@ -3336,16 +3320,16 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             $value = NULL;
             if ($op) {
               $pair = $this->getOperationPair(
                 CRM_Utils_Array::value('operatorType', $field),
                 $fieldName
               );
-              $min = CRM_Utils_Array::value("{$fieldName}_min", $this->_params);
-              $max = CRM_Utils_Array::value("{$fieldName}_max", $this->_params);
-              $val = CRM_Utils_Array::value("{$fieldName}_value", $this->_params);
+              $min = $this->_params["{$fieldName}_min"] ?? NULL;
+              $max = $this->_params["{$fieldName}_max"] ?? NULL;
+              $val = $this->_params["{$fieldName}_value"] ?? NULL;
               if (in_array($op, ['bw', 'nbw']) && ($min || $max)) {
                 $value = "{$pair[$op]} $min " . ts('and') . " $max";
               }
@@ -3388,7 +3372,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
             }
             if ($value && empty($field['no_display'])) {
               $statistics['filters'][] = [
-                'title' => CRM_Utils_Array::value('title', $field),
+                'title' => $field['title'] ?? NULL,
                 'value' => CRM_Utils_String::htmlToText($value),
               ];
             }
@@ -3497,9 +3481,6 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
     elseif ($this->_outputMode == 'csv') {
       CRM_Report_Utils_Report::export2csv($this, $rows);
     }
-    elseif ($this->_outputMode == 'excel2007') {
-      CRM_CiviExportExcel_Utils_Report::export2excel2007($this, $rows);
-    }
     elseif ($this->_outputMode == 'group') {
       $group = $this->_params['groups'];
       $this->add2group($group);
@@ -3889,6 +3870,9 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
    * Buld contact acl clause
    * @deprecated in favor of buildPermissionClause
    *
+   * Note that if the buildPermissionClause function is called (which most reports do from
+   * buildQuery then the results of this function are re-calculated and overwritten.
+   *
    * @param string $tableAlias
    */
   public function buildACLClause($tableAlias = 'contact_a') {
@@ -4424,7 +4408,7 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a
         'fields' => [
           'address_name' => [
             'title' => ts('Address Name'),
-            'default' => CRM_Utils_Array::value('name', $defaults, FALSE),
+            'default' => $defaults['name'] ?? FALSE,
             'name' => 'name',
           ],
         ],
@@ -4434,7 +4418,7 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a
     foreach ($defaultAddressFields as $fieldName => $fieldLabel) {
       $addressFields['civicrm_address']['fields'][$fieldName] = [
         'title' => $fieldLabel,
-        'default' => CRM_Utils_Array::value($fieldName, $defaults, FALSE),
+        'default' => $defaults[$fieldName] ?? FALSE,
       ];
     }
 
@@ -4666,46 +4650,6 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a
     ($fy['d'] > 1 ? (" - INTERVAL " . ($fy['d'] - 1) . " DAY") : '') . " )";
   }
 
-  /**
-   * Add Address into From Table if required.
-   *
-   * @deprecated use joinAddressFromContact
-   * (left here in case extensions use it).
-   */
-  public function addAddressFromClause() {
-    CRM_Core_Error::deprecatedFunctionWarning('CRM_Report_Form::joinAddressFromContact');
-    // include address field if address column is to be included
-    if ((isset($this->_addressField) &&
-        $this->_addressField
-      ) ||
-      $this->isTableSelected('civicrm_address')
-    ) {
-      $this->_from .= "
-                 LEFT JOIN civicrm_address {$this->_aliases['civicrm_address']}
-                           ON ({$this->_aliases['civicrm_contact']}.id =
-                               {$this->_aliases['civicrm_address']}.contact_id) AND
-                               {$this->_aliases['civicrm_address']}.is_primary = 1\n";
-    }
-  }
-
-  /**
-   * Add Phone into From Table if required.
-   *
-   * @deprecated use joinPhoneFromContact
-   *  (left here in case extensions use it).
-   */
-  public function addPhoneFromClause() {
-    CRM_Core_Error::deprecatedFunctionWarning('CRM_Report_Form::joinPhoneFromContact');
-    // include address field if address column is to be included
-    if ($this->isTableSelected('civicrm_phone')) {
-      $this->_from .= "
-      LEFT JOIN civicrm_phone {$this->_aliases['civicrm_phone']}
-      ON ({$this->_aliases['civicrm_contact']}.id =
-      {$this->_aliases['civicrm_phone']}.contact_id) AND
-      {$this->_aliases['civicrm_phone']}.is_primary = 1\n";
-    }
-  }
-
   /**
    * Add Address into From Table if required.
    *
@@ -5330,8 +5274,8 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a
   protected function addBasicFieldToSelect($tableName, $fieldName, $field, $select) {
     $alias = "{$tableName}_{$fieldName}";
     $select[] = "{$field['dbAlias']} as $alias";
-    $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-    $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+    $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+    $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
     $this->_selectAliases[] = $alias;
     return $select;
   }
@@ -5968,7 +5912,7 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a
   protected function getSelectClauseWithGroupConcatIfNotGroupedBy($tableName, &$fieldName, &$field) {
     if ($this->groupConcatTested && (!empty($this->_groupByArray) || $this->isForceGroupBy)) {
       if ((empty($field['statistics']) || in_array('GROUP_CONCAT', $field['statistics']))) {
-        $label = CRM_Utils_Array::value('title', $field);
+        $label = $field['title'] ?? NULL;
         $alias = $field['tplField'] ?? "{$tableName}_{$fieldName}";
         $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $label;
         $this->_selectAliases[] = $alias;
@@ -5996,24 +5940,22 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a
       if (CRM_Utils_Array::value('operatorType', $field) ==
         CRM_Report_Form::OP_MONTH
       ) {
-        $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
-        $value = CRM_Utils_Array::value("{$fieldName}_value", $this->_params);
+        $op = $this->_params["{$fieldName}_op"] ?? NULL;
+        $value = $this->_params["{$fieldName}_value"] ?? NULL;
         if (is_array($value) && !empty($value)) {
           return "(month({$field['dbAlias']}) $op (" . implode(', ', $value) .
             '))';
         }
       }
       else {
-        $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-        $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-        $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
-        $fromTime = CRM_Utils_Array::value("{$fieldName}_from_time", $this->_params);
-        $toTime = CRM_Utils_Array::value("{$fieldName}_to_time", $this->_params);
-        return $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type'], $fromTime, $toTime);
+        $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+        $from = $this->_params["{$fieldName}_from"] ?? NULL;
+        $to = $this->_params["{$fieldName}_to"] ?? NULL;
+        return $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type']);
       }
     }
     else {
-      $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+      $op = $this->_params["{$fieldName}_op"] ?? NULL;
       if ($op) {
         return $this->whereClause($field,
           $op,
diff --git a/civicrm/CRM/Report/Form/Activity.php b/civicrm/CRM/Report/Form/Activity.php
index 76b3ae2d4e..cdaf918dfa 100644
--- a/civicrm/CRM/Report/Form/Activity.php
+++ b/civicrm/CRM/Report/Form/Activity.php
@@ -312,6 +312,10 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
         'operatorType' => CRM_Report_Form::OP_SELECT,
         'options' => ['0' => ts('No'), '1' => ts('Yes')],
       ];
+      $this->_columns['civicrm_case_activity'] = [
+        'dao' => 'CRM_Case_DAO_CaseActivity',
+        'fields' => [],
+      ];
     }
 
     if ($campaignEnabled) {
@@ -349,22 +353,16 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
     parent::__construct();
   }
 
-  public function preProcess() {
-    // Is "Include Case Activities" selected?  If yes, include the case_id as a hidden column
-    $formToUse = $this->noController ? NULL : $this;
-    $includeCaseActivities = CRM_Utils_Request::retrieve('include_case_activities_value', 'Boolean', $formToUse);
-    if (!empty($includeCaseActivities)) {
-      $this->_columns['civicrm_case_activity'] = [
-        'dao' => 'CRM_Case_DAO_CaseActivity',
-        'fields' => [
-          'case_id' => [
-            'no_display' => TRUE,
-            'required' => TRUE,
-          ],
-        ],
-      ];
-    }
-    parent::preProcess();
+  protected static function addCaseActivityColumns($columns) {
+    $columns['civicrm_case_activity']['fields'] = [
+      'case_id' => [
+        'title' => ts('Case ID'),
+        'required' => TRUE,
+        'dbAlias' => $columns['civicrm_case_activity']['alias'] . '.case_id',
+        'type' => CRM_Utils_Type::T_INT,
+      ],
+    ];
+    return $columns;
   }
 
   /**
@@ -536,14 +534,14 @@ class CRM_Report_Form_Activity extends CRM_Report_Form {
             continue;
           }
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
-            $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
+            $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op && !($fieldName === "contact_{$recordType}" && ($op === 'nnll' || $op === 'nll'))) {
               $clause = $this->whereClause($field,
                 $op,
@@ -733,6 +731,10 @@ GROUP BY civicrm_activity_id $having {$this->_orderBy}";
       }
     }
 
+    if (!empty($this->_params['include_case_activities_value'])) {
+      $this->_columns = self::addCaseActivityColumns($this->_columns);
+    }
+
     // @todo - all this temp table stuff is here because pre 4.4 the activity contact
     // form did not exist.
     // Fixing the way the construct method declares them will make all this redundant.
diff --git a/civicrm/CRM/Report/Form/ActivitySummary.php b/civicrm/CRM/Report/Form/ActivitySummary.php
index 14b5946642..0e7e780f91 100644
--- a/civicrm/CRM/Report/Form/ActivitySummary.php
+++ b/civicrm/CRM/Report/Form/ActivitySummary.php
@@ -260,15 +260,15 @@ class CRM_Report_Form_ActivitySummary extends CRM_Report_Form {
               else {
                 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
               }
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
             }
           }
         }
@@ -364,14 +364,14 @@ class CRM_Report_Form_ActivitySummary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
-            $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
+            $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Campaign/SurveyDetails.php b/civicrm/CRM/Report/Form/Campaign/SurveyDetails.php
index 8b524e07b3..5398ef6f5a 100644
--- a/civicrm/CRM/Report/Form/Campaign/SurveyDetails.php
+++ b/civicrm/CRM/Report/Form/Campaign/SurveyDetails.php
@@ -250,7 +250,7 @@ class CRM_Report_Form_Campaign_SurveyDetails extends CRM_Report_Form {
           $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
 
           // Set default title
-          $title = CRM_Utils_Array::value('title', $field);
+          $title = $field['title'] ?? NULL;
           // Check for an override.
           if (!empty($this->_columnTitleOverrides["{$tableName}_{$fieldName}"])) {
             $title = $this->_columnTitleOverrides["{$tableName}_{$fieldName}"];
@@ -309,14 +309,14 @@ class CRM_Report_Form_Campaign_SurveyDetails extends CRM_Report_Form {
           $clause = NULL;
 
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
@@ -371,7 +371,7 @@ class CRM_Report_Form_Campaign_SurveyDetails extends CRM_Report_Form {
    */
   private function _surveyCoverSheet() {
     $coverSheet = NULL;
-    $surveyIds = CRM_Utils_Array::value('survey_id_value', $this->_params);
+    $surveyIds = $this->_params['survey_id_value'] ?? NULL;
     if (CRM_Utils_System::isNull($surveyIds)) {
       return $coverSheet;
     }
@@ -498,7 +498,7 @@ INNER JOIN  civicrm_option_value val ON ( val.option_group_id = survey.result_id
    * @param $rows
    */
   private function _formatSurveyResult(&$rows) {
-    $surveyIds = CRM_Utils_Array::value('survey_id_value', $this->_params);
+    $surveyIds = $this->_params['survey_id_value'] ?? NULL;
     if (CRM_Utils_System::isNull($surveyIds) ||
       empty($this->_params['fields']['result']) ||
       !in_array($this->_outputMode, array('print', 'pdf'))
@@ -523,16 +523,16 @@ INNER JOIN  civicrm_survey survey ON ( survey.result_id = grp.id )
       $resultSet[$result->id][$result->value] = $result->label;
     }
 
-    $statusId = CRM_Utils_Array::value('status_id_value', $this->_params);
-    $respondentStatus = CRM_Utils_Array::value($statusId, self::$_surveyRespondentStatus);
+    $statusId = $this->_params['status_id_value'] ?? NULL;
+    $respondentStatus = self::$_surveyRespondentStatus[$statusId] ?? NULL;
 
-    $surveyId = CRM_Utils_Array::value(0, $surveyIds);
+    $surveyId = $surveyIds[0] ?? NULL;
     foreach ($rows as & $row) {
       if (!empty($row['civicrm_activity_survey_id'])) {
         $surveyId = $row['civicrm_activity_survey_id'];
       }
       $result = CRM_Utils_Array::value($surveyId, $resultSet, array());
-      $resultLabel = CRM_Utils_Array::value('civicrm_activity_result', $row);
+      $resultLabel = $row['civicrm_activity_result'] ?? NULL;
       if ($respondentStatus == 'Reserved') {
         $row['civicrm_activity_result'] = implode(' | ', array_keys($result));
       }
@@ -549,7 +549,7 @@ INNER JOIN  civicrm_survey survey ON ( survey.result_id = grp.id )
    * @param $rows
    */
   private function _formatSurveyResponseData(&$rows) {
-    $surveyIds = CRM_Utils_Array::value('survey_id_value', $this->_params);
+    $surveyIds = $this->_params['survey_id_value'] ?? NULL;
     if (CRM_Utils_System::isNull($surveyIds) ||
       empty($this->_params['fields']['survey_response'])
     ) {
@@ -586,8 +586,8 @@ INNER JOIN  civicrm_survey survey ON ( survey.result_id = grp.id )
     }
 
     //do check respondent status.
-    $statusId = CRM_Utils_Array::value('status_id_value', $this->_params);
-    $respondentStatus = CRM_Utils_Array::value($statusId, self::$_surveyRespondentStatus);
+    $statusId = $this->_params['status_id_value'] ?? NULL;
+    $respondentStatus = self::$_surveyRespondentStatus[$statusId] ?? NULL;
 
     if (!$hasResponseData &&
       ($respondentStatus != 'Reserved')
@@ -655,7 +655,7 @@ INNER JOIN  civicrm_custom_group cg ON ( cg.id = cf.custom_group_id )
         if ($respondentStatus == 'Reserved' &&
           in_array($this->_outputMode, array('print', 'pdf'))
         ) {
-          $optGrpId = CRM_Utils_Array::value('option_group_id', $responseFields[$name]);
+          $optGrpId = $responseFields[$name]['option_group_id'] ?? NULL;
           $options = CRM_Utils_Array::value($optGrpId, $fieldValueMap, array());
           $value = implode(' | ', array_keys($options));
         }
@@ -671,7 +671,7 @@ INNER JOIN  civicrm_custom_group cg ON ( cg.id = cf.custom_group_id )
   }
 
   private function _addSurveyResponseColumns() {
-    $surveyIds = CRM_Utils_Array::value('survey_id_value', $this->_params);
+    $surveyIds = $this->_params['survey_id_value'] ?? NULL;
     if (CRM_Utils_System::isNull($surveyIds) ||
       empty($this->_params['fields']['survey_response'])
     ) {
@@ -741,14 +741,11 @@ INNER  JOIN  civicrm_custom_field cf ON ( cg.id = cf.custom_group_id )
       if (empty($this->_columns[$resTable]['alias'])) {
         $this->_columns[$resTable]['alias'] = "{$resTable}_survey_response";
       }
-      if (!is_array(CRM_Utils_Array::value('fields', $this->_columns[$resTable]))) {
-        $this->_columns[$resTable]['fields'] = array();
+      if (empty($this->_columns[$resTable]['fields'])) {
+        $this->_columns[$resTable]['fields'] = [];
       }
 
-      if (in_array($this->_outputMode, array(
-        'print',
-        'pdf',
-      ))) {
+      if (in_array($this->_outputMode, ['print', 'pdf'])) {
         $this->_columnTitleOverrides["{$resTable}_{$fieldName}"] = 'Q' . $fieldCnt;
         $fieldCnt++;
       }
diff --git a/civicrm/CRM/Report/Form/Case/Demographics.php b/civicrm/CRM/Report/Form/Case/Demographics.php
index 8115604f02..6c9f105f85 100644
--- a/civicrm/CRM/Report/Form/Case/Demographics.php
+++ b/civicrm/CRM/Report/Form/Case/Demographics.php
@@ -250,7 +250,7 @@ where (cg.extends='Contact' OR cg.extends='Individual' OR cg.extends_entity_colu
             }
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
           }
         }
@@ -308,18 +308,18 @@ where (cg.extends='Contact' OR cg.extends='Individual' OR cg.extends_entity_colu
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if ($field['operatorType'] & CRM_Report_Form::OP_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to, CRM_Utils_Type::T_DATE);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               // handle special case
               if ($fieldName == 'case_id_filter') {
-                $choice = CRM_Utils_Array::value("{$fieldName}_value", $this->_params);
+                $choice = $this->_params["{$fieldName}_value"] ?? NULL;
                 if ($choice == 1) {
                   $clause = "({$this->_aliases['civicrm_case']}.id Is Not Null)";
                 }
diff --git a/civicrm/CRM/Report/Form/Case/Detail.php b/civicrm/CRM/Report/Form/Case/Detail.php
index 1f7d6cc381..95a91ff9b3 100644
--- a/civicrm/CRM/Report/Form/Case/Detail.php
+++ b/civicrm/CRM/Report/Form/Case/Detail.php
@@ -350,7 +350,7 @@ class CRM_Report_Form_Case_Detail extends CRM_Report_Form {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
             }
 
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
           }
         }
@@ -417,15 +417,15 @@ class CRM_Report_Form_Case_Detail extends CRM_Report_Form {
           $clause = NULL;
 
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type']);
           }
           else {
 
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($fieldName == 'case_type_id' &&
               !empty($this->_params['case_type_id_value'])
             ) {
@@ -509,7 +509,7 @@ class CRM_Report_Form_Case_Detail extends CRM_Report_Form {
 
       $this->_columnHeaders['case_activity_all_dates'] = [
         'title' => $this->_caseDetailExtra['case_activity_all_dates']['title'] . ": {$this->caseActivityTypes[$activityType]}",
-        'type' => CRM_Utils_Array::value('type', $this->_caseDetailExtra['case_activity_all_dates']),
+        'type' => $this->_caseDetailExtra['case_activity_all_dates']['type'] ?? NULL,
       ];
     }
 
diff --git a/civicrm/CRM/Report/Form/Case/Summary.php b/civicrm/CRM/Report/Form/Case/Summary.php
index ab089194bb..52fb291cc1 100644
--- a/civicrm/CRM/Report/Form/Case/Summary.php
+++ b/civicrm/CRM/Report/Form/Case/Summary.php
@@ -209,7 +209,7 @@ class CRM_Report_Form_Case_Summary extends CRM_Report_Form {
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
             }
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
           }
         }
diff --git a/civicrm/CRM/Report/Form/Case/TimeSpent.php b/civicrm/CRM/Report/Form/Case/TimeSpent.php
index 5e3d04bca8..53572ae20b 100644
--- a/civicrm/CRM/Report/Form/Case/TimeSpent.php
+++ b/civicrm/CRM/Report/Form/Case/TimeSpent.php
@@ -183,9 +183,9 @@ class CRM_Report_Form_Case_TimeSpent extends CRM_Report_Form {
             )
           ) {
 
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
 
             if ($fieldName == 'activity_type_id') {
               $this->has_activity_type = TRUE;
@@ -240,18 +240,18 @@ class CRM_Report_Form_Case_TimeSpent extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               // handle special case
               if ($fieldName == 'case_id_filter') {
-                $choice = CRM_Utils_Array::value("{$fieldName}_value", $this->_params);
+                $choice = $this->_params["{$fieldName}_value"] ?? NULL;
                 if ($choice == 1) {
                   $clause = "({$this->_aliases['civicrm_case_activity']}.id Is Not Null)";
                 }
@@ -340,13 +340,13 @@ class CRM_Report_Form_Case_TimeSpent extends CRM_Report_Form {
       if (isset($row['civicrm_activity_activity_type_id'])) {
         $entryFound = TRUE;
         $val = $row['civicrm_activity_activity_type_id'];
-        $rows[$rowNum]['civicrm_activity_activity_type_id'] = isset($this->activityTypes[$val]) ? $this->activityTypes[$val] : '';
+        $rows[$rowNum]['civicrm_activity_activity_type_id'] = $this->activityTypes[$val] ?? '';
       }
 
       if (isset($row['civicrm_activity_status_id'])) {
         $entryFound = TRUE;
         $val = $row['civicrm_activity_status_id'];
-        $rows[$rowNum]['civicrm_activity_status_id'] = isset($this->activityStatuses[$val]) ? $this->activityStatuses[$val] : '';
+        $rows[$rowNum]['civicrm_activity_status_id'] = $this->activityStatuses[$val] ?? '';
       }
 
       // The next two make it easier to make pivot tables after exporting to Excel
diff --git a/civicrm/CRM/Report/Form/Contact/CurrentEmployer.php b/civicrm/CRM/Report/Form/Contact/CurrentEmployer.php
index 80e033a070..5a2479b14b 100644
--- a/civicrm/CRM/Report/Form/Contact/CurrentEmployer.php
+++ b/civicrm/CRM/Report/Form/Contact/CurrentEmployer.php
@@ -196,8 +196,8 @@ class CRM_Report_Form_Contact_CurrentEmployer extends CRM_Report_Form {
           ) {
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
@@ -239,14 +239,14 @@ FROM civicrm_contact {$this->_aliases['civicrm_contact']}
           $clause = NULL;
           if (CRM_Utils_Array::value('operatorType', $field) & CRM_Report_Form::OP_DATE
           ) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Contact/Detail.php b/civicrm/CRM/Report/Form/Contact/Detail.php
index 56acf7e334..edbff9f3e9 100644
--- a/civicrm/CRM/Report/Form/Contact/Detail.php
+++ b/civicrm/CRM/Report/Form/Contact/Detail.php
@@ -208,7 +208,9 @@ class CRM_Report_Form_Contact_Detail extends CRM_Report_Form {
             'title' => ts('Membership Type'),
             'default' => TRUE,
           ],
-          'join_date' => NULL,
+          'join_date' => [
+            'title' => ts('Join Date'),
+          ],
           'membership_start_date' => [
             'title' => ts('Start Date'),
             'default' => TRUE,
@@ -389,8 +391,8 @@ class CRM_Report_Form_Contact_Detail extends CRM_Report_Form {
             //isolate the select clause compoenent wise
             if (in_array($table['alias'], $this->_component)) {
               $select[$table['alias']][] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeadersComponent[$table['alias']]["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeadersComponent[$table['alias']]["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+              $this->_columnHeadersComponent[$table['alias']]["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeadersComponent[$table['alias']]["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
             }
             elseif ($table['alias'] ==
               $this->_aliases['civicrm_activity_target'] ||
@@ -413,12 +415,12 @@ class CRM_Report_Form_Contact_Detail extends CRM_Report_Form {
 
               $tableName = $table['alias'];
               $select['activity_civireport'][] = "$tableName.display_name as {$tableName}_{$fieldName}, $addContactId ";
-              $this->_columnHeadersComponent['activity_civireport']["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeadersComponent['activity_civireport']["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+              $this->_columnHeadersComponent['activity_civireport']["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeadersComponent['activity_civireport']["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
             }
           }
@@ -606,14 +608,14 @@ HERESQL;
           $clause = NULL;
           if (CRM_Utils_Array::value('operatorType', $field) & CRM_Report_Form::OP_DATE
           ) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             $clause = $this->whereClause($field,
               $op,
               CRM_Utils_Array::value("{$fieldName}_value", $this->_params),
diff --git a/civicrm/CRM/Report/Form/Contact/Log.php b/civicrm/CRM/Report/Form/Contact/Log.php
index e846ca5775..3fbec11212 100644
--- a/civicrm/CRM/Report/Form/Contact/Log.php
+++ b/civicrm/CRM/Report/Form/Contact/Log.php
@@ -136,7 +136,7 @@ class CRM_Report_Form_Contact_Log extends CRM_Report_Form {
           ) {
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
           }
         }
@@ -181,14 +181,14 @@ class CRM_Report_Form_Contact_Log extends CRM_Report_Form {
           $clause = NULL;
           if (CRM_Utils_Array::value('operatorType', $field) & CRM_Report_Form::OP_DATE
           ) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Contact/LoggingSummary.php b/civicrm/CRM/Report/Form/Contact/LoggingSummary.php
index 751a00eb91..c3ed3f5429 100644
--- a/civicrm/CRM/Report/Form/Contact/LoggingSummary.php
+++ b/civicrm/CRM/Report/Form/Contact/LoggingSummary.php
@@ -294,7 +294,7 @@ class CRM_Report_Form_Contact_LoggingSummary extends CRM_Logging_ReportSummary {
 
     $detail = $this->_logTables[$entity];
     $tableName = CRM_Utils_Array::value('table_name', $detail, $entity);
-    $clause = CRM_Utils_Array::value('entity_table', $detail);
+    $clause = $detail['entity_table'] ?? NULL;
     $clause = $clause ? "AND entity_log_civireport.entity_table = 'civicrm_contact'" : NULL;
 
     $joinClause = "
@@ -302,7 +302,7 @@ INNER JOIN civicrm_contact modified_contact_civireport
         ON (entity_log_civireport.{$detail['fk']} = modified_contact_civireport.id {$clause})";
 
     if (!empty($detail['joins'])) {
-      $clause = CRM_Utils_Array::value('entity_table', $detail);
+      $clause = $detail['entity_table'] ?? NULL;
       $clause = $clause ? "AND fk_table.entity_table = 'civicrm_contact'" : NULL;
       $joinClause = "
 INNER JOIN `{$this->loggingDB}`.{$detail['joins']['table']} fk_table ON {$detail['joins']['join']}
diff --git a/civicrm/CRM/Report/Form/Contact/Relationship.php b/civicrm/CRM/Report/Form/Contact/Relationship.php
index f2756c3e65..d6873e3408 100644
--- a/civicrm/CRM/Report/Form/Contact/Relationship.php
+++ b/civicrm/CRM/Report/Form/Contact/Relationship.php
@@ -372,8 +372,8 @@ class CRM_Report_Form_Contact_Relationship extends CRM_Report_Form {
               $this->_phoneField_b = TRUE;
             }
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
@@ -454,9 +454,9 @@ class CRM_Report_Form_Contact_Relationship extends CRM_Report_Form {
 
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($fieldName == 'active_period_date') {
               $clause = $this->activeClause($field['name'], $relative, $from, $to, $field['type']);
@@ -466,14 +466,14 @@ class CRM_Report_Form_Contact_Relationship extends CRM_Report_Form {
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               if (($tableName == 'civicrm_contact' ||
                   $tableName == 'civicrm_contact_b') &&
                 ($fieldName == 'contact_type_a' ||
                   $fieldName == 'contact_type_b')
               ) {
-                $cTypes = CRM_Utils_Array::value("{$fieldName}_value", $this->_params);
+                $cTypes = $this->_params["{$fieldName}_value"] ?? NULL;
                 $contactTypes = $contactSubTypes = [];
                 if (!empty($cTypes)) {
                   foreach ($cTypes as $ctype) {
@@ -630,7 +630,7 @@ class CRM_Report_Form_Contact_Relationship extends CRM_Report_Form {
   }
 
   public function beginPostProcessCommon() {
-    $originalRelationshipTypeIdValue = CRM_Utils_Array::value('relationship_type_id_value', $this->_params);
+    $originalRelationshipTypeIdValue = $this->_params['relationship_type_id_value'] ?? NULL;
     if ($originalRelationshipTypeIdValue) {
       $relationshipTypes = [];
       $direction = [];
@@ -792,7 +792,7 @@ class CRM_Report_Form_Contact_Relationship extends CRM_Report_Form {
     if (!$lookup) {
       $lookup = CRM_Contact_BAO_Relationship::buildOptions("is_permission_a_b");
     };
-    return CRM_Utils_Array::value($key, $lookup);
+    return $lookup[$key] ?? NULL;
   }
 
   /**
@@ -821,21 +821,18 @@ class CRM_Report_Form_Contact_Relationship extends CRM_Report_Form {
    * @param string $from
    * @param string $to
    * @param string $type
-   * @param string $fromTime
-   * @param string $toTime
    *
    * @return null|string
    */
   public function activeClause(
     $fieldName,
-    $relative, $from, $to, $type = NULL, $fromTime = NULL, $toTime = NULL
-    ) {
+    $relative, $from, $to, $type = NULL) {
     $clauses = [];
     if (in_array($relative, array_keys($this->getOperationPair(CRM_Report_Form::OP_DATE)))) {
       return NULL;
     }
 
-    list($from, $to) = $this->getFromTo($relative, $from, $to, $fromTime, $toTime);
+    list($from, $to) = $this->getFromTo($relative, $from, $to);
 
     if ($from) {
       $from = ($type == CRM_Utils_Type::T_DATE) ? substr($from, 0, 8) : $from;
diff --git a/civicrm/CRM/Report/Form/Contribute/Bookkeeping.php b/civicrm/CRM/Report/Form/Contribute/Bookkeeping.php
index 24dc5ba2b0..1da37dac56 100644
--- a/civicrm/CRM/Report/Form/Contribute/Bookkeeping.php
+++ b/civicrm/CRM/Report/Form/Contribute/Bookkeeping.php
@@ -450,7 +450,7 @@ class CRM_Report_Form_Contribute_Bookkeeping extends CRM_Report_Form {
                 break;
             }
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
           }
         }
       }
@@ -533,14 +533,14 @@ class CRM_Report_Form_Contribute_Bookkeeping extends CRM_Report_Form {
               END";
           }
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
@@ -674,7 +674,7 @@ class CRM_Report_Form_Contribute_Bookkeeping extends CRM_Report_Form {
       }
 
       if (!empty($row['civicrm_financial_trxn_card_type_id'])) {
-        $rows[$rowNum]['civicrm_financial_trxn_card_type_id'] = CRM_Utils_Array::value($row['civicrm_financial_trxn_card_type_id'], $creditCardTypes);
+        $rows[$rowNum]['civicrm_financial_trxn_card_type_id'] = $creditCardTypes[$row['civicrm_financial_trxn_card_type_id']] ?? NULL;
         $entryFound = TRUE;
       }
 
diff --git a/civicrm/CRM/Report/Form/Contribute/Detail.php b/civicrm/CRM/Report/Form/Contribute/Detail.php
index 294c40ecdd..1d59e4c711 100644
--- a/civicrm/CRM/Report/Form/Contribute/Detail.php
+++ b/civicrm/CRM/Report/Form/Contribute/Detail.php
@@ -343,12 +343,25 @@ class CRM_Report_Form_Contribute_Detail extends CRM_Report_Form {
             ],
           ],
         ],
+        'civicrm_pledge_payment' => [
+          'dao' => 'CRM_Pledge_DAO_PledgePayment',
+          'fields' => [
+            'pledge_id' => [
+              'title' => ts('Pledge ID'),
+            ],
+          ],
+          'filters' => [
+            'pledge_id' => [
+              'title' => ts('Pledge ID'),
+              'type' => CRM_Utils_Type::T_INT,
+            ],
+          ],
+        ],
       ],
       $this->getColumns('Address')
     );
     // The tests test for this variation of the sort_name field. Don't argue with the tests :-).
     $this->_columns['civicrm_contact']['fields']['sort_name']['title'] = ts('Donor Name');
-
     $this->_groupFilter = TRUE;
     $this->_tagFilter = TRUE;
     // If we have campaigns enabled, add those elements to both the fields, filters and sorting
@@ -697,7 +710,7 @@ UNION ALL
         $entryFound = TRUE;
       }
       if (!empty($row['civicrm_batch_batch_id'])) {
-        $rows[$rowNum]['civicrm_batch_batch_id'] = CRM_Utils_Array::value($row['civicrm_batch_batch_id'], $batches);
+        $rows[$rowNum]['civicrm_batch_batch_id'] = $batches[$row['civicrm_batch_batch_id']] ?? NULL;
         $entryFound = TRUE;
       }
       if (!empty($row['civicrm_financial_trxn_card_type_id'])) {
@@ -793,6 +806,27 @@ WHERE  civicrm_contribution_contribution_id={$row['civicrm_contribution_contribu
         );
       }
 
+      // Contribution amount links to viewing contribution
+      if ($value = CRM_Utils_Array::value('civicrm_pledge_payment_pledge_id', $row)) {
+        if (CRM_Core_Permission::check('access CiviContribute')) {
+          $url = CRM_Utils_System::url(
+            "civicrm/contact/view/pledge",
+            [
+              'reset' => 1,
+              'id' => $row['civicrm_pledge_payment_pledge_id'],
+              'cid' => $row['civicrm_contact_id'],
+              'action' => 'view',
+              'context' => 'pledge',
+              'selectedChild' => 'pledge',
+            ],
+            $this->_absoluteUrl
+          );
+          $rows[$rowNum]['civicrm_pledge_payment_pledge_id_link'] = $url;
+          $rows[$rowNum]['civicrm_pledge_payment_pledge_id_hover'] = ts("View Details of this Pledge.");
+        }
+        $entryFound = TRUE;
+      }
+
       $entryFound = $this->alterDisplayAddressFields($row, $rows, $rowNum, 'contribute/detail', 'List all contribution(s) for this ') ? TRUE : $entryFound;
 
       // skip looking further in rows, if first row itself doesn't
@@ -965,6 +999,12 @@ WHERE  civicrm_contribution_contribution_id={$row['civicrm_contribution_contribu
     }
     // for credit card type
     $this->addFinancialTrxnFromClause();
+
+    if ($this->isTableSelected('civicrm_pledge_payment')) {
+      $this->_from .= "
+        LEFT JOIN civicrm_pledge_payment {$this->_aliases['civicrm_pledge_payment']} ON {$this->_aliases['civicrm_pledge_payment']}.contribution_id = {$this->_aliases['civicrm_contribution']}.id
+      ";
+    }
   }
 
   /**
diff --git a/civicrm/CRM/Report/Form/Contribute/History.php b/civicrm/CRM/Report/Form/Contribute/History.php
index 99983fcf3f..ecb52f68ec 100644
--- a/civicrm/CRM/Report/Form/Contribute/History.php
+++ b/civicrm/CRM/Report/Form/Contribute/History.php
@@ -326,7 +326,7 @@ class CRM_Report_Form_Contribute_History extends CRM_Report_Form {
           ) {
             if ($tableName == 'civicrm_relationship') {
               $this->_relationshipColumns["{$tableName}_{$fieldName}"] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
               continue;
             }
@@ -355,7 +355,7 @@ class CRM_Report_Form_Contribute_History extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
             }
             if (!empty($field['no_display'])) {
@@ -403,14 +403,14 @@ class CRM_Report_Form_Contribute_History extends CRM_Report_Form {
           }
           elseif (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE
           ) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Contribute/HouseholdSummary.php b/civicrm/CRM/Report/Form/Contribute/HouseholdSummary.php
index 1789bcd33a..8e0c9a2422 100644
--- a/civicrm/CRM/Report/Form/Contribute/HouseholdSummary.php
+++ b/civicrm/CRM/Report/Form/Contribute/HouseholdSummary.php
@@ -214,8 +214,8 @@ class CRM_Report_Form_Contribute_HouseholdSummary extends CRM_Report_Form {
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
 
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             }
           }
         }
@@ -250,13 +250,13 @@ class CRM_Report_Form_Contribute_HouseholdSummary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               if ($fieldName == 'relationship_type_id') {
                 $clause = "{$this->_aliases['civicrm_relationship']}.relationship_type_id=" . $this->relationshipId;
diff --git a/civicrm/CRM/Report/Form/Contribute/OrganizationSummary.php b/civicrm/CRM/Report/Form/Contribute/OrganizationSummary.php
index 80880b15d7..78d7d62823 100644
--- a/civicrm/CRM/Report/Form/Contribute/OrganizationSummary.php
+++ b/civicrm/CRM/Report/Form/Contribute/OrganizationSummary.php
@@ -219,8 +219,8 @@ class CRM_Report_Form_Contribute_OrganizationSummary extends CRM_Report_Form {
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
 
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             }
           }
         }
@@ -257,14 +257,14 @@ class CRM_Report_Form_Contribute_OrganizationSummary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               if ($fieldName == 'relationship_type_id') {
                 $clause = "{$this->_aliases['civicrm_relationship']}.relationship_type_id=" . $this->relationshipId;
diff --git a/civicrm/CRM/Report/Form/Contribute/PCP.php b/civicrm/CRM/Report/Form/Contribute/PCP.php
index 8b0ec5f5e5..3b640a8d6d 100644
--- a/civicrm/CRM/Report/Form/Contribute/PCP.php
+++ b/civicrm/CRM/Report/Form/Contribute/PCP.php
@@ -250,13 +250,13 @@ LEFT JOIN civicrm_event {$this->_aliases['civicrm_event']}
           $clause = NULL;
 
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
 
             if ($op) {
               $clause = $this->whereClause($field,
diff --git a/civicrm/CRM/Report/Form/Contribute/Recur.php b/civicrm/CRM/Report/Form/Contribute/Recur.php
index bf79da0244..4dac3ad8f9 100644
--- a/civicrm/CRM/Report/Form/Contribute/Recur.php
+++ b/civicrm/CRM/Report/Form/Contribute/Recur.php
@@ -293,9 +293,9 @@ class CRM_Report_Form_Contribute_Recur extends CRM_Report_Form {
       if (!empty($this->_params['calculated_end_date_' . $suffix])) {
         // The calculated date field is in use - spring into action
         // Gather values
-        $relative = CRM_Utils_Array::value("calculated_end_date_relative", $this->_params);
-        $from = CRM_Utils_Array::value("calculated_end_date_from", $this->_params);
-        $to = CRM_Utils_Array::value("calculated_end_date_to", $this->_params);
+        $relative = $this->_params["calculated_end_date_relative"] ?? NULL;
+        $from = $this->_params["calculated_end_date_from"] ?? NULL;
+        $to = $this->_params["calculated_end_date_to"] ?? NULL;
         $end_date_db_alias = $this->_columns['civicrm_contribution_recur']['filters']['end_date']['dbAlias'];
         $end_date_type = $this->_columns['civicrm_contribution_recur']['filters']['end_date']['type'];
         $start_date_type = $this->_columns['civicrm_contribution_recur']['filters']['start_date']['type'];
diff --git a/civicrm/CRM/Report/Form/Contribute/RecurSummary.php b/civicrm/CRM/Report/Form/Contribute/RecurSummary.php
index 677890e144..9599ddb5d1 100644
--- a/civicrm/CRM/Report/Form/Contribute/RecurSummary.php
+++ b/civicrm/CRM/Report/Form/Contribute/RecurSummary.php
@@ -166,8 +166,8 @@ class CRM_Report_Form_Contribute_RecurSummary extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
             }
           }
         }
@@ -222,9 +222,9 @@ class CRM_Report_Form_Contribute_RecurSummary extends CRM_Report_Form {
 
     $entryFound = FALSE;
 
-    $startDateFrom = CRM_Utils_Array::value("start_date_to", $this->_params);
-    $startDateTo = CRM_Utils_Array::value("start_date_from", $this->_params);
-    $startDateRelative = CRM_Utils_Array::value("start_date_relative", $this->_params);
+    $startDateFrom = $this->_params["start_date_to"] ?? NULL;
+    $startDateTo = $this->_params["start_date_from"] ?? NULL;
+    $startDateRelative = $this->_params["start_date_relative"] ?? NULL;
 
     $startedDateSql = $this->dateClause('start_date', $startDateRelative, $startDateFrom, $startDateTo);
     $startedDateSql = $startedDateSql ? $startedDateSql : " ( 1 ) ";
@@ -236,7 +236,7 @@ class CRM_Report_Form_Contribute_RecurSummary extends CRM_Report_Form {
 
     foreach ($rows as $rowNum => $row) {
 
-      $paymentInstrumentId = CRM_Utils_Array::value('civicrm_contribution_recur_payment_instrument_id', $row);
+      $paymentInstrumentId = $row['civicrm_contribution_recur_payment_instrument_id'] ?? NULL;
 
       $rows[$rowNum]['civicrm_contribution_recur_start_date'] = 0;
       $rows[$rowNum]['civicrm_contribution_recur_cancel_date'] = 0;
diff --git a/civicrm/CRM/Report/Form/Contribute/Repeat.php b/civicrm/CRM/Report/Form/Contribute/Repeat.php
index 4062c0090e..7b66f28d6d 100644
--- a/civicrm/CRM/Report/Form/Contribute/Repeat.php
+++ b/civicrm/CRM/Report/Form/Contribute/Repeat.php
@@ -263,17 +263,17 @@ class CRM_Report_Form_Contribute_Repeat extends CRM_Report_Form {
               $select[] = $field['clause'];
 
               // FIXME: dirty hack for setting columnHeaders
-              $this->_columnHeaders["{$field['alias']}_{$field['name']}_sum"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$field['alias']}_{$field['name']}_sum"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$field['alias']}_{$field['name']}_sum"]['title'] = $field['title'];
-              $this->_columnHeaders["{$field['alias']}_{$field['name']}_count"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$field['alias']}_{$field['name']}_count"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$field['alias']}_{$field['name']}_count"]['title'] = $field['title'];
               continue;
             }
 
             // only include statistics columns if set
             $select[] = "{$field['dbAlias']} as {$field['alias']}_{$field['name']}";
-            $this->_columnHeaders["{$field['alias']}_{$field['name']}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$field['alias']}_{$field['name']}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$field['alias']}_{$field['name']}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$field['alias']}_{$field['name']}"]['title'] = $field['title'] ?? NULL;
             if (!empty($field['no_display'])) {
               $this->_columnHeaders["{$field['alias']}_{$field['name']}"]['no_display'] = TRUE;
             }
@@ -386,14 +386,14 @@ LEFT JOIN $this->tempTableRepeat2 {$this->_aliases['civicrm_contribution']}2
     foreach ($this->_columns['civicrm_contribution']['filters'] as $fieldName => $field) {
       $clause = NULL;
       if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-        $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-        $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-        $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+        $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+        $from = $this->_params["{$fieldName}_from"] ?? NULL;
+        $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
         $clause = $this->dateClause($field['dbAlias'], $relative, $from, $to, $field['type']);
       }
       else {
-        $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+        $op = $this->_params["{$fieldName}_op"] ?? NULL;
         if ($op) {
           $clause = $this->whereClause($field,
             $op,
@@ -450,7 +450,7 @@ LEFT JOIN $this->tempTableRepeat2 {$this->_aliases['civicrm_contribution']}2
       ) {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
-          $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+          $op = $this->_params["{$fieldName}_op"] ?? NULL;
           if ($op) {
             $clause = $this->whereClause($field,
               $op,
diff --git a/civicrm/CRM/Report/Form/Contribute/SoftCredit.php b/civicrm/CRM/Report/Form/Contribute/SoftCredit.php
index b504376890..c4c2d37148 100644
--- a/civicrm/CRM/Report/Form/Contribute/SoftCredit.php
+++ b/civicrm/CRM/Report/Form/Contribute/SoftCredit.php
@@ -369,7 +369,7 @@ class CRM_Report_Form_Contribute_SoftCredit extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
             }
           }
diff --git a/civicrm/CRM/Report/Form/Contribute/Summary.php b/civicrm/CRM/Report/Form/Contribute/Summary.php
index 5a4de70434..091b4d5a91 100644
--- a/civicrm/CRM/Report/Form/Contribute/Summary.php
+++ b/civicrm/CRM/Report/Form/Contribute/Summary.php
@@ -423,8 +423,8 @@ class CRM_Report_Form_Contribute_Summary extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
             }
           }
         }
@@ -580,7 +580,7 @@ class CRM_Report_Form_Contribute_Summary extends CRM_Report_Form {
   public function statistics(&$rows) {
     $statistics = parent::statistics($rows);
 
-    $softCredit = CRM_Utils_Array::value('soft_amount', $this->_params['fields']);
+    $softCredit = $this->_params['fields']['soft_amount'] ?? NULL;
     $onlySoftCredit = $softCredit && !CRM_Utils_Array::value('total_amount', $this->_params['fields']);
     if (!isset($this->_groupByArray['civicrm_contribution_currency'])) {
       $this->_groupByArray['civicrm_contribution_currency'] = 'currency';
@@ -597,20 +597,39 @@ class CRM_Report_Form_Contribute_Summary extends CRM_Report_Form {
     CRM_Utils_Hook::alterReportVar('sql', $this, $this);
 
     $contriQuery = "
-COUNT({$this->_aliases['civicrm_contribution']}.total_amount )        as civicrm_contribution_total_amount_count,
-SUM({$this->_aliases['civicrm_contribution']}.total_amount )          as civicrm_contribution_total_amount_sum,
-ROUND(AVG({$this->_aliases['civicrm_contribution']}.total_amount), 2) as civicrm_contribution_total_amount_avg,
-{$this->_aliases['civicrm_contribution']}.currency                    as currency
-{$this->_from} {$this->_where}";
+      COUNT({$this->_aliases['civicrm_contribution']}.total_amount )        as civicrm_contribution_total_amount_count,
+      SUM({$this->_aliases['civicrm_contribution']}.total_amount )          as civicrm_contribution_total_amount_sum,
+      ROUND(AVG({$this->_aliases['civicrm_contribution']}.total_amount), 2) as civicrm_contribution_total_amount_avg,
+      {$this->_aliases['civicrm_contribution']}.currency                    as currency
+      {$this->_from} {$this->_where}
+    ";
 
     if ($softCredit) {
-      $select = "
-COUNT({$this->_aliases['civicrm_contribution_soft']}.amount )        as civicrm_contribution_soft_soft_amount_count,
-SUM({$this->_aliases['civicrm_contribution_soft']}.amount )          as civicrm_contribution_soft_soft_amount_sum,
-ROUND(AVG({$this->_aliases['civicrm_contribution_soft']}.amount), 2) as civicrm_contribution_soft_soft_amount_avg";
-      $contriQuery = "{$select}, {$contriQuery}";
-      $softSQL = "SELECT {$select}, {$this->_aliases['civicrm_contribution']}.currency as currency
-      {$this->_from} {$this->_where} {$group} {$this->_having}";
+      $selectOnlySoftCredit = "
+        COUNT({$this->_aliases['civicrm_contribution_soft']}.amount )        as civicrm_contribution_soft_soft_amount_count,
+        SUM({$this->_aliases['civicrm_contribution_soft']}.amount )          as civicrm_contribution_soft_soft_amount_sum,
+        ROUND(AVG({$this->_aliases['civicrm_contribution_soft']}.amount), 2) as civicrm_contribution_soft_soft_amount_avg,
+      ";
+
+      $selectWithSoftCredit = "
+        COUNT({$this->_aliases['civicrm_contribution_soft']}.amount )        as civicrm_contribution_soft_soft_amount_count,
+        SUM({$this->_aliases['civicrm_contribution_soft']}.amount )          as civicrm_contribution_soft_soft_amount_sum,
+        ROUND(AVG({$this->_aliases['civicrm_contribution_soft']}.amount), 2) as civicrm_contribution_soft_soft_amount_avg,
+        COUNT({$this->_aliases['civicrm_contribution']}.total_amount )        as civicrm_contribution_total_amount_count,
+        SUM({$this->_aliases['civicrm_contribution']}.total_amount )          as civicrm_contribution_total_amount_sum,
+        ROUND(AVG({$this->_aliases['civicrm_contribution']}.total_amount), 2) as civicrm_contribution_total_amount_avg,
+      ";
+
+      if ($softCredit && $onlySoftCredit) {
+        $contriQuery = "{$selectOnlySoftCredit} {$contriQuery}";
+        $softSQL = "SELECT {$selectOnlySoftCredit} {$this->_aliases['civicrm_contribution']}.currency as currency
+        {$this->_from} {$this->_where} {$group} {$this->_having}";
+      }
+      elseif ($softCredit && !$onlySoftCredit) {
+        $contriQuery = "{$selectOnlySoftCredit} {$contriQuery}";
+        $softSQL = "SELECT {$selectWithSoftCredit} {$this->_aliases['civicrm_contribution']}.currency as currency
+        {$this->_from} {$this->_where} {$group} {$this->_having}";
+      }
     }
 
     $contriSQL = "SELECT {$contriQuery} {$group} {$this->_having}";
@@ -741,14 +760,6 @@ ROUND(AVG({$this->_aliases['civicrm_contribution_soft']}.amount), 2) as civicrm_
     return $statistics;
   }
 
-  /**
-   * Post process function.
-   */
-  public function postProcess() {
-    $this->buildACLClause($this->_aliases['civicrm_contact']);
-    parent::postProcess();
-  }
-
   /**
    * Build chart.
    *
@@ -760,8 +771,8 @@ ROUND(AVG({$this->_aliases['civicrm_contribution_soft']}.amount), 2) as civicrm_
     if (!empty($this->_params['charts'])) {
       if (!empty($this->_params['group_bys']['receive_date'])) {
 
-        $contrib = !empty($this->_params['fields']['total_amount']) ? TRUE : FALSE;
-        $softContrib = !empty($this->_params['fields']['soft_amount']) ? TRUE : FALSE;
+        $contrib = !empty($this->_params['fields']['total_amount']);
+        $softContrib = !empty($this->_params['fields']['soft_amount']);
 
         foreach ($rows as $key => $row) {
           if ($row['civicrm_contribution_receive_date_subtotal']) {
@@ -817,7 +828,7 @@ ROUND(AVG({$this->_aliases['civicrm_contribution_soft']}.amount), 2) as civicrm_
     $contributionPages = CRM_Contribute_PseudoConstant::contributionPage();
     //CRM-16338 if both soft-credit and contribution are enabled then process the contribution's
     //total amount's average, count and sum separately and add it to the respective result list
-    $softCredit = (!empty($this->_params['fields']['soft_amount']) && !empty($this->_params['fields']['total_amount'])) ? TRUE : FALSE;
+    $softCredit = (!empty($this->_params['fields']['soft_amount']) && !empty($this->_params['fields']['total_amount']));
     if ($softCredit) {
       $this->from('contribution');
       $this->customDataFrom();
diff --git a/civicrm/CRM/Report/Form/Contribute/Sybunt.php b/civicrm/CRM/Report/Form/Contribute/Sybunt.php
index 37c1385be4..ec142d1a4a 100644
--- a/civicrm/CRM/Report/Form/Contribute/Sybunt.php
+++ b/civicrm/CRM/Report/Form/Contribute/Sybunt.php
@@ -294,7 +294,7 @@ class CRM_Report_Form_Contribute_Sybunt extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
             }
             if (!empty($field['no_display'])) {
@@ -341,16 +341,16 @@ class CRM_Report_Form_Contribute_Sybunt extends CRM_Report_Form {
           }
           elseif (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE
           ) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Contribute/TopDonor.php b/civicrm/CRM/Report/Form/Contribute/TopDonor.php
index a73a3e42e8..a3329a928f 100644
--- a/civicrm/CRM/Report/Form/Contribute/TopDonor.php
+++ b/civicrm/CRM/Report/Form/Contribute/TopDonor.php
@@ -204,8 +204,8 @@ class CRM_Report_Form_Contribute_TopDonor extends CRM_Report_Form {
   public static function formRule($fields, $files, $self) {
     $errors = [];
 
-    $op = CRM_Utils_Array::value('total_range_op', $fields);
-    $val = CRM_Utils_Array::value('total_range_value', $fields);
+    $op = $fields['total_range_op'] ?? NULL;
+    $val = $fields['total_range_value'] ?? NULL;
 
     if (!in_array($op, [
       'eq',
@@ -244,16 +244,16 @@ class CRM_Report_Form_Contribute_TopDonor extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
@@ -266,7 +266,7 @@ class CRM_Report_Form_Contribute_TopDonor extends CRM_Report_Form {
 
           if (!empty($clause)) {
             if ($fieldName == 'total_range') {
-              $value = CRM_Utils_Array::value("total_range_value", $this->_params);
+              $value = $this->_params["total_range_value"] ?? NULL;
               $this->_outerCluase = " WHERE (( @rows := @rows + 1) <= {$value}) ";
               $this->_groupLimit = " LIMIT {$value}";
             }
diff --git a/civicrm/CRM/Report/Form/Event/IncomeCountSummary.php b/civicrm/CRM/Report/Form/Event/IncomeCountSummary.php
index a6b154d5cb..fea8a0de4b 100644
--- a/civicrm/CRM/Report/Form/Event/IncomeCountSummary.php
+++ b/civicrm/CRM/Report/Form/Event/IncomeCountSummary.php
@@ -179,7 +179,7 @@ class CRM_Report_Form_Event_IncomeCountSummary extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
             }
           }
@@ -210,16 +210,16 @@ class CRM_Report_Form_Event_IncomeCountSummary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Event/ParticipantListCount.php b/civicrm/CRM/Report/Form/Event/ParticipantListCount.php
index f1ea17adec..31a0f70ab1 100644
--- a/civicrm/CRM/Report/Form/Event/ParticipantListCount.php
+++ b/civicrm/CRM/Report/Form/Event/ParticipantListCount.php
@@ -406,7 +406,7 @@ class CRM_Report_Form_Event_ParticipantListCount extends CRM_Report_Form {
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
             }
           }
diff --git a/civicrm/CRM/Report/Form/Event/ParticipantListing.php b/civicrm/CRM/Report/Form/Event/ParticipantListing.php
index 9b4c6f719d..50175c9aaf 100644
--- a/civicrm/CRM/Report/Form/Event/ParticipantListing.php
+++ b/civicrm/CRM/Report/Form/Event/ParticipantListing.php
@@ -446,16 +446,16 @@ ORDER BY  cv.label
             }
             $alias = "{$tableName}_{$fieldName}";
             $select[] = "{$field['dbAlias']} as $alias";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
             $this->_selectAliases[] = $alias;
           }
         }
       }
     }
     //add blank column at the end
-    $blankcols = CRM_Utils_Array::value('blank_column_end', $this->_params);
+    $blankcols = $this->_params['blank_column_end'] ?? NULL;
     if ($blankcols) {
       for ($i = 1; $i <= $blankcols; $i++) {
         $select[] = " '' as blankColumnEnd_{$i}";
@@ -537,19 +537,19 @@ ORDER BY  cv.label
           $clause = NULL;
 
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
 
             if ($fieldName == 'rid') {
-              $value = CRM_Utils_Array::value("{$fieldName}_value", $this->_params);
+              $value = $this->_params["{$fieldName}_value"] ?? NULL;
               if (!empty($value)) {
                 $operator = '';
                 if ($op == 'notin') {
@@ -704,9 +704,9 @@ ORDER BY  cv.label
       }
 
       // Convert display name to link
-      $displayName = CRM_Utils_Array::value('civicrm_contact_sort_name_linked', $row);
-      $cid = CRM_Utils_Array::value('civicrm_contact_id', $row);
-      $id = CRM_Utils_Array::value('civicrm_participant_participant_record', $row);
+      $displayName = $row['civicrm_contact_sort_name_linked'] ?? NULL;
+      $cid = $row['civicrm_contact_id'] ?? NULL;
+      $id = $row['civicrm_participant_participant_record'] ?? NULL;
 
       if ($displayName && $cid && $id) {
         $url = CRM_Report_Utils_Report::getNextUrl('contact/detail',
diff --git a/civicrm/CRM/Report/Form/Event/Summary.php b/civicrm/CRM/Report/Form/Event/Summary.php
index f2dd872e51..11af2ed73a 100644
--- a/civicrm/CRM/Report/Form/Event/Summary.php
+++ b/civicrm/CRM/Report/Form/Event/Summary.php
@@ -125,16 +125,16 @@ class CRM_Report_Form_Event_Summary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
@@ -239,8 +239,8 @@ class CRM_Report_Form_Event_Summary extends CRM_Report_Form {
             !empty($this->_params['fields'][$fieldName])
           ) {
 
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
@@ -328,7 +328,7 @@ class CRM_Report_Form_Event_Summary extends CRM_Report_Form {
     $countEvent = NULL;
     if (!empty($this->_params['charts'])) {
       foreach ($rows as $key => $value) {
-        $graphRows['totalAmount'][] = $graphRows['value'][] = CRM_Utils_Array::value('totalAmount', $rows[$key]);
+        $graphRows['totalAmount'][] = $graphRows['value'][] = $rows[$key]['totalAmount'] ?? NULL;
         $graphRows[$this->_interval][] = substr($rows[$key]['civicrm_event_title'], 0, 12) . "..(" .
           $rows[$key]['civicrm_event_id'] . ") ";
       }
diff --git a/civicrm/CRM/Report/Form/Grant/Statistics.php b/civicrm/CRM/Report/Form/Grant/Statistics.php
index da70f8df1f..b25f40ca88 100644
--- a/civicrm/CRM/Report/Form/Grant/Statistics.php
+++ b/civicrm/CRM/Report/Form/Grant/Statistics.php
@@ -200,8 +200,8 @@ class CRM_Report_Form_Grant_Statistics extends CRM_Report_Form {
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
 
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
           }
         }
       }
@@ -239,16 +239,16 @@ WHERE {$this->_aliases['civicrm_grant']}.amount_total IS NOT NULL
 
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if (($fieldName == 'grant_report_received') &&
               (CRM_Utils_Array::value("{$fieldName}_value", $this->_params) ===
                 0)
@@ -380,7 +380,7 @@ SELECT COUNT({$this->_aliases['civicrm_grant']}.id) as count ,
       }
 
       if (!empty($values['civicrm_grant_grant_type_id'])) {
-        $grantType = CRM_Utils_Array::value($values['civicrm_grant_grant_type_id'], $grantTypes);
+        $grantType = $grantTypes[$values['civicrm_grant_grant_type_id']] ?? NULL;
         $grantStatistics['civicrm_grant_grant_type_id']['title'] = ts('By Grant Type');
         self::getStatistics($grantStatistics['civicrm_grant_grant_type_id'], $grantType, $values,
           $awardedGrants, $awardedGrantsAmount
@@ -388,7 +388,7 @@ SELECT COUNT({$this->_aliases['civicrm_grant']}.id) as count ,
       }
 
       if (array_key_exists('civicrm_worldregion_name', $values)) {
-        $region = CRM_Utils_Array::value('civicrm_worldregion_name', $values);
+        $region = $values['civicrm_worldregion_name'] ?? NULL;
         $region = ($region) ? $region : 'Unassigned';
         $grantStatistics['civicrm_worldregion_name']['title'] = ts('By Region');
         self::getStatistics($grantStatistics['civicrm_worldregion_name'], $region, $values,
@@ -397,7 +397,7 @@ SELECT COUNT({$this->_aliases['civicrm_grant']}.id) as count ,
       }
 
       if (array_key_exists('civicrm_address_country_id', $values)) {
-        $country = CRM_Utils_Array::value($values['civicrm_address_country_id'], $countries);
+        $country = $countries[$values['civicrm_address_country_id']] ?? NULL;
         $country = ($country) ? $country : 'Unassigned';
         $grantStatistics['civicrm_address_country_id']['title'] = ts('By Country');
         self::getStatistics($grantStatistics['civicrm_address_country_id'], $country, $values,
@@ -414,7 +414,7 @@ SELECT COUNT({$this->_aliases['civicrm_grant']}.id) as count ,
       }
 
       if (array_key_exists('civicrm_contact_gender_id', $values)) {
-        $genderLabel = CRM_Utils_Array::value($values['civicrm_contact_gender_id'], $gender);
+        $genderLabel = $gender[$values['civicrm_contact_gender_id']] ?? NULL;
         $genderLabel = ($genderLabel) ? $genderLabel : 'Unassigned';
         $grantStatistics['civicrm_contact_gender_id']['title'] = ts('By Gender');
         self::getStatistics($grantStatistics['civicrm_contact_gender_id'], $genderLabel, $values,
@@ -424,14 +424,13 @@ SELECT COUNT({$this->_aliases['civicrm_grant']}.id) as count ,
 
       foreach ($values as $customField => $customValue) {
         if (strstr($customField, 'civicrm_value_')) {
-          $customFieldTitle = CRM_Utils_Array::value('title', $this->_columnHeaders[$customField]);
+          $customFieldTitle = $this->_columnHeaders[$customField]['title'] ?? NULL;
           $customGroupTitle = explode('_custom', strstr($customField, 'civicrm_value_'));
           $customGroupTitle = $this->_columns[$customGroupTitle[0]]['group_title'];
           $grantStatistics[$customGroupTitle]['title'] = ts('By %1', [1 => $customGroupTitle]);
 
-          $customData = ($customValue) ? FALSE : TRUE;
           self::getStatistics($grantStatistics[$customGroupTitle], $customFieldTitle, $values,
-            $awardedGrants, $awardedGrantsAmount, $customData
+            $awardedGrants, $awardedGrantsAmount, !$customValue
           );
         }
       }
diff --git a/civicrm/CRM/Report/Form/Instance.php b/civicrm/CRM/Report/Form/Instance.php
index 4ca1b81ad2..8aa9d4674c 100644
--- a/civicrm/CRM/Report/Form/Instance.php
+++ b/civicrm/CRM/Report/Form/Instance.php
@@ -239,7 +239,7 @@ class CRM_Report_Form_Instance {
 
     if ($instanceID) {
       // this is already retrieved via Form.php
-      $defaults['description'] = CRM_Utils_Array::value('description', $defaults);
+      $defaults['description'] = $defaults['description'] ?? NULL;
       if (!empty($defaults['header'])) {
         $defaults['report_header'] = $defaults['header'];
       }
@@ -258,7 +258,7 @@ class CRM_Report_Form_Instance {
         $params = ['id' => $defaults['navigation_id']];
         CRM_Core_BAO_Navigation::retrieve($params, $navigationDefaults);
         $defaults['is_navigation'] = 1;
-        $defaults['parent_id'] = CRM_Utils_Array::value('parent_id', $navigationDefaults);
+        $defaults['parent_id'] = $navigationDefaults['parent_id'] ?? NULL;
         if (!empty($navigationDefaults['is_active'])) {
           $form->assign('is_navigation', TRUE);
         }
diff --git a/civicrm/CRM/Report/Form/Mailing/Bounce.php b/civicrm/CRM/Report/Form/Mailing/Bounce.php
index 5a16a9d90f..cfb798c179 100644
--- a/civicrm/CRM/Report/Form/Mailing/Bounce.php
+++ b/civicrm/CRM/Report/Form/Mailing/Bounce.php
@@ -271,9 +271,9 @@ class CRM_Report_Form_Mailing_Bounce extends CRM_Report_Form {
             }
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
@@ -337,14 +337,14 @@ class CRM_Report_Form_Mailing_Bounce extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($this->_aliases[$tableName] . '.' . $field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
 
             if ($op) {
               $clause = $this->whereClause($field,
diff --git a/civicrm/CRM/Report/Form/Mailing/Clicks.php b/civicrm/CRM/Report/Form/Mailing/Clicks.php
index e8cf3258f5..bc96f7f9e3 100644
--- a/civicrm/CRM/Report/Form/Mailing/Clicks.php
+++ b/civicrm/CRM/Report/Form/Mailing/Clicks.php
@@ -229,9 +229,9 @@ class CRM_Report_Form_Mailing_Clicks extends CRM_Report_Form {
             }
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
diff --git a/civicrm/CRM/Report/Form/Mailing/Detail.php b/civicrm/CRM/Report/Form/Mailing/Detail.php
index 55b97ffef4..5eab237061 100644
--- a/civicrm/CRM/Report/Form/Mailing/Detail.php
+++ b/civicrm/CRM/Report/Form/Mailing/Detail.php
@@ -279,17 +279,17 @@ class CRM_Report_Form_Mailing_Detail extends CRM_Report_Form {
               'reply_id',
             ])) {
               $select[] = "IF({$field['dbAlias']} IS NULL, 'No', 'Yes') as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
               unset($this->_columns[$tableName]['fields'][$fieldName]);
               $columns[$tableName][$fieldName] = $field;
             }
             elseif ($fieldName == 'delivery_id') {
               $select[] = "IF(mailing_event_bounce_civireport.id IS NOT NULL, 'Bounced', IF(mailing_event_delivered_civireport.id IS NOT NULL, 'Successful', 'Unknown')) as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
               unset($this->_columns[$tableName]['fields'][$fieldName]);
               $columns[$tableName][$fieldName] = $field;
             }
diff --git a/civicrm/CRM/Report/Form/Mailing/Opened.php b/civicrm/CRM/Report/Form/Mailing/Opened.php
index 3bbba7bcd8..5db163b7eb 100644
--- a/civicrm/CRM/Report/Form/Mailing/Opened.php
+++ b/civicrm/CRM/Report/Form/Mailing/Opened.php
@@ -218,9 +218,9 @@ class CRM_Report_Form_Mailing_Opened extends CRM_Report_Form {
             }
 
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = CRM_Utils_Array::value('no_display', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['no_display'] = $field['no_display'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
diff --git a/civicrm/CRM/Report/Form/Mailing/Summary.php b/civicrm/CRM/Report/Form/Mailing/Summary.php
index 7d9fdc6215..4289f9020b 100644
--- a/civicrm/CRM/Report/Form/Mailing/Summary.php
+++ b/civicrm/CRM/Report/Form/Mailing/Summary.php
@@ -356,7 +356,7 @@ class CRM_Report_Form_Mailing_Summary extends CRM_Report_Form {
                 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
               }
             }
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
           }
         }
@@ -410,14 +410,14 @@ class CRM_Report_Form_Mailing_Summary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($this->_aliases[$tableName] . '.' . $field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
 
             if ($op) {
               if ($fieldName == 'relationship_type_id') {
diff --git a/civicrm/CRM/Report/Form/Member/ContributionDetail.php b/civicrm/CRM/Report/Form/Member/ContributionDetail.php
index 6b4ae72b4f..ae05cbc939 100644
--- a/civicrm/CRM/Report/Form/Member/ContributionDetail.php
+++ b/civicrm/CRM/Report/Form/Member/ContributionDetail.php
@@ -72,10 +72,26 @@ class CRM_Report_Form_Member_ContributionDetail extends CRM_Report_Form {
             'title' => ts('Contact Subtype'),
             'no_repeat' => TRUE,
           ],
+          'do_not_phone' => [
+            'title' => ts('Do Not Phone'),
+            'no_repeat' => TRUE,
+          ],
           'do_not_email' => [
             'title' => ts('Do Not Email'),
             'no_repeat' => TRUE,
           ],
+          'do_not_mail' => [
+            'title' => ts('Do Not Mail'),
+            'no_repeat' => TRUE,
+          ],
+          'do_not_sms' => [
+            'title' => ts('Do Not SMS'),
+            'no_repeat' => TRUE,
+          ],
+          'do_not_trade' => [
+            'title' => ts('Do Not Trade'),
+            'no_repeat' => TRUE,
+          ],
           'is_opt_out' => [
             'title' => ts('No Bulk Email(Is Opt Out)'),
             'no_repeat' => TRUE,
@@ -406,15 +422,15 @@ class CRM_Report_Form_Member_ContributionDetail extends CRM_Report_Form {
             elseif ($fieldName == 'first_donation_date' ||
               $fieldName == 'first_donation_amount'
             ) {
-              $baseField = CRM_Utils_Array::value('base_field', $field);
+              $baseField = $field['base_field'] ?? NULL;
               $select[] = "{$this->_aliases['civicrm_contribution']}.{$baseField} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             }
           }
         }
@@ -640,8 +656,8 @@ class CRM_Report_Form_Member_ContributionDetail extends CRM_Report_Form {
         if (array_key_exists('fields', $table)) {
           foreach ($table['fields'] as $fieldName => $field) {
             if (!empty($field['csv_display']) && !empty($field['no_display'])) {
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             }
           }
         }
@@ -716,7 +732,7 @@ class CRM_Report_Form_Member_ContributionDetail extends CRM_Report_Form {
       }
 
       if (!empty($row['civicrm_batch_batch_id'])) {
-        $rows[$rowNum]['civicrm_batch_batch_id'] = CRM_Utils_Array::value($row['civicrm_batch_batch_id'], $batches);
+        $rows[$rowNum]['civicrm_batch_batch_id'] = $batches[$row['civicrm_batch_batch_id']] ?? NULL;
         $entryFound = TRUE;
       }
 
diff --git a/civicrm/CRM/Report/Form/Member/Lapse.php b/civicrm/CRM/Report/Form/Member/Lapse.php
index 5f1c54e5c6..acdb9a16b0 100644
--- a/civicrm/CRM/Report/Form/Member/Lapse.php
+++ b/civicrm/CRM/Report/Form/Member/Lapse.php
@@ -173,7 +173,7 @@ class CRM_Report_Form_Member_Lapse extends CRM_Report_Form {
             !empty($this->_params['fields'][$fieldName])
           ) {
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
             $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
           }
         }
@@ -223,16 +223,16 @@ class CRM_Report_Form_Member_Lapse extends CRM_Report_Form {
           $clause = NULL;
 
           if ($field['operatorType'] & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Member/Summary.php b/civicrm/CRM/Report/Form/Member/Summary.php
index 936b68493c..1bd21077b7 100644
--- a/civicrm/CRM/Report/Form/Member/Summary.php
+++ b/civicrm/CRM/Report/Form/Member/Summary.php
@@ -272,12 +272,12 @@ class CRM_Report_Form_Member_Summary extends CRM_Report_Form {
                 $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
               }
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = CRM_Utils_Array::value('operatorType', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = $field['operatorType'] ?? NULL;
             }
             else {
               $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
               $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'];
-              $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = CRM_Utils_Array::value('operatorType', $field);
+              $this->_columnHeaders["{$tableName}_{$fieldName}"]['operatorType'] = $field['operatorType'] ?? NULL;
             }
           }
         }
@@ -446,8 +446,8 @@ GROUP BY    {$this->_aliases['civicrm_contribution']}.currency
     $graphRows = [];
     $count = 0;
     $membershipTypeValues = CRM_Member_PseudoConstant::membershipType();
-    $isMembershipType = CRM_Utils_Array::value('membership_type_id', $this->_params['group_bys']);
-    $isJoiningDate = CRM_Utils_Array::value('join_date', $this->_params['group_bys']);
+    $isMembershipType = $this->_params['group_bys']['membership_type_id'] ?? NULL;
+    $isJoiningDate = $this->_params['group_bys']['join_date'] ?? NULL;
     if (!empty($this->_params['charts'])) {
       foreach ($rows as $key => $row) {
         if (!($row['civicrm_membership_join_date_subtotal'] &&
@@ -457,8 +457,8 @@ GROUP BY    {$this->_aliases['civicrm_contribution']}.currency
           continue;
         }
         if ($isMembershipType) {
-          $join_date = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
-          $displayInterval = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
+          $join_date = $row['civicrm_membership_join_date_start'] ?? NULL;
+          $displayInterval = $row['civicrm_membership_join_date_interval'] ?? NULL;
           if ($join_date) {
             list($year, $month) = explode('-', $join_date);
           }
@@ -493,8 +493,8 @@ GROUP BY    {$this->_aliases['civicrm_contribution']}.currency
           $display[$membershipType] = $row['civicrm_contribution_total_amount_sum'];
         }
         else {
-          $graphRows['receive_date'][] = CRM_Utils_Array::value('civicrm_membership_join_date_start', $row);
-          $graphRows[$this->_interval][] = CRM_Utils_Array::value('civicrm_membership_join_date_interval', $row);
+          $graphRows['receive_date'][] = $row['civicrm_membership_join_date_start'] ?? NULL;
+          $graphRows[$this->_interval][] = $row['civicrm_membership_join_date_interval'] ?? NULL;
           $graphRows['value'][] = $row['civicrm_contribution_total_amount_sum'];
           $count++;
         }
diff --git a/civicrm/CRM/Report/Form/Membership/Summary.php b/civicrm/CRM/Report/Form/Membership/Summary.php
index 25a5417448..ddceca3387 100644
--- a/civicrm/CRM/Report/Form/Membership/Summary.php
+++ b/civicrm/CRM/Report/Form/Membership/Summary.php
@@ -182,16 +182,16 @@ LEFT  JOIN civicrm_contribution  {$this->_aliases['civicrm_contribution']}
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if ($field['type'] & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Pledge/Detail.php b/civicrm/CRM/Report/Form/Pledge/Detail.php
index cb015c8123..d8e66c78e5 100644
--- a/civicrm/CRM/Report/Form/Pledge/Detail.php
+++ b/civicrm/CRM/Report/Form/Pledge/Detail.php
@@ -331,16 +331,16 @@ class CRM_Report_Form_Pledge_Detail extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Pledge/Pbnp.php b/civicrm/CRM/Report/Form/Pledge/Pbnp.php
index 66eb610655..e9b97fbf07 100644
--- a/civicrm/CRM/Report/Form/Pledge/Pbnp.php
+++ b/civicrm/CRM/Report/Form/Pledge/Pbnp.php
@@ -181,8 +181,8 @@ class CRM_Report_Form_Pledge_Pbnp extends CRM_Report_Form {
             !empty($this->_params['fields'][$fieldName])
           ) {
             $select[] = "{$field['dbAlias']} as {$tableName}_{$fieldName}";
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = CRM_Utils_Array::value('type', $field);
-            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = CRM_Utils_Array::value('title', $field);
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['type'] = $field['type'] ?? NULL;
+            $this->_columnHeaders["{$tableName}_{$fieldName}"]['title'] = $field['title'] ?? NULL;
           }
         }
       }
diff --git a/civicrm/CRM/Report/Form/Pledge/Summary.php b/civicrm/CRM/Report/Form/Pledge/Summary.php
index 10ae20e550..0adf1b860c 100644
--- a/civicrm/CRM/Report/Form/Pledge/Summary.php
+++ b/civicrm/CRM/Report/Form/Pledge/Summary.php
@@ -309,16 +309,16 @@ class CRM_Report_Form_Pledge_Summary extends CRM_Report_Form {
         foreach ($table['filters'] as $fieldName => $field) {
           $clause = NULL;
           if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             if ($relative || $from || $to) {
               $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
             }
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Form/Walklist/Walklist.php b/civicrm/CRM/Report/Form/Walklist/Walklist.php
index 152799859e..14b40773b3 100644
--- a/civicrm/CRM/Report/Form/Walklist/Walklist.php
+++ b/civicrm/CRM/Report/Form/Walklist/Walklist.php
@@ -119,14 +119,14 @@ FROM       civicrm_contact {$this->_aliases['civicrm_contact']} {$this->_aclFrom
           $clause = NULL;
 
           if ($field['type'] & CRM_Utils_Type::T_DATE) {
-            $relative = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params);
-            $from = CRM_Utils_Array::value("{$fieldName}_from", $this->_params);
-            $to = CRM_Utils_Array::value("{$fieldName}_to", $this->_params);
+            $relative = $this->_params["{$fieldName}_relative"] ?? NULL;
+            $from = $this->_params["{$fieldName}_from"] ?? NULL;
+            $to = $this->_params["{$fieldName}_to"] ?? NULL;
 
             $clause = $this->dateClause($field['name'], $relative, $from, $to, $field['type']);
           }
           else {
-            $op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
+            $op = $this->_params["{$fieldName}_op"] ?? NULL;
             if ($op) {
               $clause = $this->whereClause($field,
                 $op,
diff --git a/civicrm/CRM/Report/Utils/Get.php b/civicrm/CRM/Report/Utils/Get.php
index e0498dbab7..59cfbf7c4e 100644
--- a/civicrm/CRM/Report/Utils/Get.php
+++ b/civicrm/CRM/Report/Utils/Get.php
@@ -25,7 +25,7 @@ class CRM_Report_Utils_Get {
    * @return mixed|null
    */
   public static function getTypedValue($name, $type) {
-    $value = CRM_Utils_Array::value($name, $_GET);
+    $value = $_GET[$name] ?? NULL;
     if ($value === NULL) {
       return NULL;
     }
@@ -188,7 +188,7 @@ class CRM_Report_Utils_Get {
    * @param $defaults
    */
   public static function processChart(&$defaults) {
-    $chartType = CRM_Utils_Array::value("charts", $_GET);
+    $chartType = $_GET["charts"] ?? NULL;
     if (in_array($chartType, [
       'barChart',
       'pieChart',
diff --git a/civicrm/CRM/Report/Utils/Report.php b/civicrm/CRM/Report/Utils/Report.php
index 276ef7fe6b..1cc6cc7d18 100644
--- a/civicrm/CRM/Report/Utils/Report.php
+++ b/civicrm/CRM/Report/Utils/Report.php
@@ -99,7 +99,7 @@ WHERE  TRIM(BOTH '/' FROM CONCAT(report_id, '/', name)) = %1";
       $params = [1 => [$path, 'String']];
       $valId[$path] = CRM_Core_DAO::singleValueQuery($sql, $params);
     }
-    return CRM_Utils_Array::value($path, $valId);
+    return $valId[$path] ?? NULL;
   }
 
   /**
@@ -188,9 +188,9 @@ WHERE  inst.report_id = %1";
     $params['from'] = '"' . $domainEmailName . '" <' . $domainEmailAddress . '>';
     //$domainEmailName;
     $params['toName'] = "";
-    $params['toEmail'] = CRM_Utils_Array::value('email_to', $instanceInfo);
-    $params['cc'] = CRM_Utils_Array::value('email_cc', $instanceInfo);
-    $params['subject'] = CRM_Utils_Array::value('email_subject', $instanceInfo);
+    $params['toEmail'] = $instanceInfo['email_to'] ?? NULL;
+    $params['cc'] = $instanceInfo['email_cc'] ?? NULL;
+    $params['subject'] = $instanceInfo['email_subject'] ?? NULL;
     if (empty($instanceInfo['attachments'])) {
       $instanceInfo['attachments'] = [];
     }
@@ -251,7 +251,7 @@ WHERE  inst.report_id = %1";
     $value = NULL;
     foreach ($rows as $row) {
       foreach ($columnHeaders as $k => $v) {
-        $value = CRM_Utils_Array::value($v, $row);
+        $value = $row[$v] ?? NULL;
         if (isset($value)) {
           // Remove HTML, unencode entities, and escape quotation marks.
           $value = str_replace('"', '""', html_entity_decode(strip_tags($value)));
@@ -395,7 +395,7 @@ WHERE  inst.report_id = %1";
    * @return array
    */
   public static function processReport($params) {
-    $instanceId = CRM_Utils_Array::value('instanceId', $params);
+    $instanceId = $params['instanceId'] ?? NULL;
 
     // hack for now, CRM-8358
     $_REQUEST['instanceId'] = $instanceId;
@@ -502,7 +502,7 @@ WHERE  inst.report_id = %1";
             // (e.g., values for 'nll' and 'nnll' ops are blank),
             // so store them temporarily and examine below.
             $string_values[$basename] = $field_value;
-            $op_values[$basename] = CRM_Utils_Array::value("{$basename}_op", $params);
+            $op_values[$basename] = $params["{$basename}_op"] ?? NULL;
           }
           elseif ($suffix == '_op') {
             // These filters can have an effect even without a value
diff --git a/civicrm/CRM/SMS/BAO/Provider.php b/civicrm/CRM/SMS/BAO/Provider.php
index 4e046f7433..b2c2e45e22 100644
--- a/civicrm/CRM/SMS/BAO/Provider.php
+++ b/civicrm/CRM/SMS/BAO/Provider.php
@@ -78,7 +78,7 @@ class CRM_SMS_BAO_Provider extends CRM_SMS_DAO_Provider {
    * @return array saved values
    */
   public static function create(&$params) {
-    $id = CRM_Utils_Array::value('id', $params);
+    $id = $params['id'] ?? NULL;
 
     if ($id) {
       CRM_Utils_Hook::pre('edit', 'SmsProvider', $id, $params);
diff --git a/civicrm/CRM/SMS/Form/Group.php b/civicrm/CRM/SMS/Form/Group.php
index 7aae52fb1b..4a53b78852 100644
--- a/civicrm/CRM/SMS/Form/Group.php
+++ b/civicrm/CRM/SMS/Form/Group.php
@@ -71,7 +71,7 @@ class CRM_SMS_Form_Group extends CRM_Contact_Form_Task {
       }
 
       $defaults['includeGroups'] = $mailingGroups['civicrm_group']['Include'];
-      $defaults['excludeGroups'] = CRM_Utils_Array::value('Exclude', $mailingGroups['civicrm_group']);
+      $defaults['excludeGroups'] = $mailingGroups['civicrm_group']['Exclude'] ?? NULL;
 
       $defaults['includeMailings'] = CRM_Utils_Array::value('Include', CRM_Utils_Array::value('civicrm_mailing', $mailingGroups));
       $defaults['excludeMailings'] = CRM_Utils_Array::value('Exclude', CRM_Utils_Array::value('civicrm_mailing', $mailingGroups));
diff --git a/civicrm/CRM/SMS/Form/Upload.php b/civicrm/CRM/SMS/Form/Upload.php
index 922b281225..e9d2efb311 100644
--- a/civicrm/CRM/SMS/Form/Upload.php
+++ b/civicrm/CRM/SMS/Form/Upload.php
@@ -227,7 +227,7 @@ class CRM_SMS_Form_Upload extends CRM_Core_Form {
         $params['msg_template_id'] = $msgTemplate->id;
       }
       else {
-        $params['msg_template_id'] = CRM_Utils_Array::value('SMStemplate', $formValues);
+        $params['msg_template_id'] = $formValues['SMStemplate'] ?? NULL;
       }
       $this->set('template', $params['msg_template_id']);
     }
@@ -299,7 +299,7 @@ class CRM_SMS_Form_Upload extends CRM_Core_Form {
       }
       else {
         if (!empty($params['text_message'])) {
-          $messageCheck = CRM_Utils_Array::value('text_message', $params);
+          $messageCheck = $params['text_message'] ?? NULL;
           if ($messageCheck && (strlen($messageCheck) > CRM_SMS_Provider::MAX_SMS_CHAR)) {
             $errors['text_message'] = ts("You can configure the SMS message body up to %1 characters", [1 => CRM_SMS_Provider::MAX_SMS_CHAR]);
           }
diff --git a/civicrm/CRM/SMS/Provider.php b/civicrm/CRM/SMS/Provider.php
index 18976e1848..387092876d 100644
--- a/civicrm/CRM/SMS/Provider.php
+++ b/civicrm/CRM/SMS/Provider.php
@@ -35,9 +35,9 @@ abstract class CRM_SMS_Provider {
    * @throws CRM_Core_Exception
    */
   public static function &singleton($providerParams = array(), $force = FALSE) {
-    $mailingID = CRM_Utils_Array::value('mailing_id', $providerParams);
-    $providerID = CRM_Utils_Array::value('provider_id', $providerParams);
-    $providerName = CRM_Utils_Array::value('provider', $providerParams);
+    $mailingID = $providerParams['mailing_id'] ?? NULL;
+    $providerID = $providerParams['provider_id'] ?? NULL;
+    $providerName = $providerParams['provider'] ?? NULL;
 
     if (!$providerID && $mailingID) {
       $providerID = CRM_Core_DAO::getFieldValue('CRM_Mailing_DAO_Mailing', $mailingID, 'sms_provider_id', 'id');
@@ -141,7 +141,7 @@ INNER JOIN civicrm_mailing_job mj ON mj.mailing_id = m.id AND mj.id = %1";
     }
 
     if (!$sourceContactID) {
-      $sourceContactID = CRM_Utils_Array::value('Contact', $headers);
+      $sourceContactID = $headers['Contact'] ?? NULL;
     }
     if (!$sourceContactID) {
       return FALSE;
diff --git a/civicrm/CRM/UF/Form/Field.php b/civicrm/CRM/UF/Form/Field.php
index 5e7247049c..4476ef7303 100644
--- a/civicrm/CRM/UF/Form/Field.php
+++ b/civicrm/CRM/UF/Form/Field.php
@@ -140,7 +140,7 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
         continue;
       }
       $this->_selectFields[$name] = $field['title'];
-      $this->_hasLocationTypes[$name] = CRM_Utils_Array::value('hasLocationType', $field);
+      $this->_hasLocationTypes[$name] = $field['hasLocationType'] ?? NULL;
     }
 
     // lets add group, tag and current_employer to this list
@@ -187,7 +187,7 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
       CRM_Core_BAO_UFField::retrieve($params, $defaults);
 
       // set it to null if so (avoids crappy E_NOTICE errors below
-      $defaults['location_type_id'] = CRM_Utils_Array::value('location_type_id', $defaults);
+      $defaults['location_type_id'] = $defaults['location_type_id'] ?? NULL;
 
       //CRM-20861 - Include custom fields defined for address to set its default location type to 0.
       $specialFields = array_merge(CRM_Core_BAO_UFGroup::getLocationFields(), $addressCustomFields);
@@ -245,8 +245,8 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
         else {
           $this->_mapperFields[$key][$key1] = $value1['title'];
         }
-        $hasLocationTypes[$key][$key1] = CRM_Utils_Array::value('hasLocationType', $value1);
-        $hasWebsiteTypes[$key][$key1] = CRM_Utils_Array::value('hasWebsiteType', $value1);
+        $hasLocationTypes[$key][$key1] = $value1['hasLocationType'] ?? NULL;
+        $hasWebsiteTypes[$key][$key1] = $value1['hasWebsiteType'] ?? NULL;
         // hide the 'is searchable' field for 'File' custom data
         if (isset($value1['data_type']) &&
           isset($value1['html_type']) &&
@@ -700,7 +700,7 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
     if (array_key_exists($profileFieldName, $checkPrimary)) {
       $whereCheck = $checkPrimary[$profileFieldName];
     }
-    $potentialLocationType = CRM_Utils_Array::value(2, $fields['field_name']);
+    $potentialLocationType = $fields['field_name'][2] ?? NULL;
 
     if ($whereCheck && $potentialLocationType == 0) {
       $primaryOfSameTypeFound = '';
@@ -761,7 +761,7 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
     }
 
     $isCustomField = FALSE;
-    $profileFieldName = CRM_Utils_Array::value(1, $fields['field_name']);
+    $profileFieldName = $fields['field_name'][1] ?? NULL;
     if ($profileFieldName) {
       //get custom field id
       $customFieldId = explode('_', $profileFieldName);
diff --git a/civicrm/CRM/UF/Form/Group.php b/civicrm/CRM/UF/Form/Group.php
index 90f7528c49..a9fef4dc8f 100644
--- a/civicrm/CRM/UF/Form/Group.php
+++ b/civicrm/CRM/UF/Form/Group.php
@@ -264,14 +264,14 @@ class CRM_UF_Form_Group extends CRM_Core_Form {
 
       $params = ['id' => $this->_id];
       CRM_Core_BAO_UFGroup::retrieve($params, $defaults);
-      $defaults['group'] = CRM_Utils_Array::value('limit_listings_group_id', $defaults);
-      $defaults['add_contact_to_group'] = CRM_Utils_Array::value('add_to_group_id', $defaults);
+      $defaults['group'] = $defaults['limit_listings_group_id'] ?? NULL;
+      $defaults['add_contact_to_group'] = $defaults['add_to_group_id'] ?? NULL;
       //get the uf join records for current uf group
       $ufJoinRecords = CRM_Core_BAO_UFGroup::getUFJoinRecord($this->_id);
       foreach ($ufJoinRecords as $key => $value) {
         $checked[$value] = 1;
       }
-      $defaults['uf_group_type'] = isset($checked) ? $checked : "";
+      $defaults['uf_group_type'] = $checked ?? "";
 
       $showAdvanced = 0;
       $advFields = [
diff --git a/civicrm/CRM/UF/Page/Group.php b/civicrm/CRM/UF/Page/Group.php
index 6e74e8d79b..764e5355e8 100644
--- a/civicrm/CRM/UF/Page/Group.php
+++ b/civicrm/CRM/UF/Page/Group.php
@@ -464,7 +464,7 @@ class CRM_UF_Page_Group extends CRM_Core_Page {
 
         foreach ($valueParts as $val) {
           if (CRM_Utils_Rule::integer($val)) {
-            $groupTypeValues[$val] = CRM_Utils_Array::value($val, $valueLabels);
+            $groupTypeValues[$val] = $valueLabels[$val] ?? NULL;
           }
         }
 
diff --git a/civicrm/CRM/UF/Page/ProfileEditor.php b/civicrm/CRM/UF/Page/ProfileEditor.php
index bbd6c1f49b..0d2b09e9b0 100644
--- a/civicrm/CRM/UF/Page/ProfileEditor.php
+++ b/civicrm/CRM/UF/Page/ProfileEditor.php
@@ -295,11 +295,11 @@ class CRM_UF_Page_ProfileEditor extends CRM_Core_Page {
       $sectionName = 'cg_' . $customGroup->id;
       $section = [
         'title' => ts('%1: %2', [1 => $title, 2 => $customGroup->title]),
-        'is_addable' => $customGroup->is_reserved ? FALSE : TRUE,
+        'is_addable' => !$customGroup->is_reserved,
         'custom_group_id' => $customGroup->id,
         'extends_entity_column_id' => $customGroup->extends_entity_column_id,
         'extends_entity_column_value' => CRM_Utils_Array::explodePadded($customGroup->extends_entity_column_value),
-        'is_reserved' => $customGroup->is_reserved ? TRUE : FALSE,
+        'is_reserved' => (bool) $customGroup->is_reserved,
       ];
       $result['sections'][$sectionName] = $section;
     }
diff --git a/civicrm/CRM/Upgrade/Form.php b/civicrm/CRM/Upgrade/Form.php
index ab3de5688f..72ceb75005 100644
--- a/civicrm/CRM/Upgrade/Form.php
+++ b/civicrm/CRM/Upgrade/Form.php
@@ -31,15 +31,6 @@ class CRM_Upgrade_Form extends CRM_Core_Form {
    */
   const MINIMUM_UPGRADABLE_VERSION = '4.2.9';
 
-  /**
-   * Minimum php version required to run (equal to or lower than the minimum install version)
-   *
-   * As of Civi 5.16, using PHP 5.x will lead to a hard crash during bootstrap.
-   *
-   * Tip: Keep in sync with composer.json ("config => platform => php")
-   */
-  const MINIMUM_PHP_VERSION = '7.0.0';
-
   /**
    * @var \CRM_Core_Config
    */
@@ -310,7 +301,7 @@ SET    version = '$version'
       $version, 'id',
       'version'
     );
-    return $domainID ? TRUE : FALSE;
+    return (bool) $domainID;
   }
 
   /**
@@ -457,10 +448,10 @@ SET    version = '$version'
       );
     }
 
-    if (version_compare(phpversion(), self::MINIMUM_PHP_VERSION) < 0) {
+    if (version_compare(phpversion(), CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER) < 0) {
       $error = ts('CiviCRM %3 requires PHP version %1 (or newer), but the current system uses %2 ',
         [
-          1 => self::MINIMUM_PHP_VERSION,
+          1 => CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER,
           2 => phpversion(),
           3 => $latestVer,
         ]);
diff --git a/civicrm/CRM/Upgrade/Incremental/General.php b/civicrm/CRM/Upgrade/Incremental/General.php
index 8f5c045f61..013bd70b73 100644
--- a/civicrm/CRM/Upgrade/Incremental/General.php
+++ b/civicrm/CRM/Upgrade/Incremental/General.php
@@ -24,20 +24,25 @@ class CRM_Upgrade_Incremental_General {
 
   /**
    * The recommended PHP version.
+   *
+   * The point release will be dropped in recommendations unless it's .1 or
+   * higher.
    */
-  const RECOMMENDED_PHP_VER = '7.3';
+  const RECOMMENDED_PHP_VER = '7.3.0';
 
   /**
-   * The previous recommended PHP version.
+   * The minimum recommended PHP version.
+   *
+   * A site running an earlier version will be told to upgrade.
    */
-  const MIN_RECOMMENDED_PHP_VER = '7.2';
+  const MIN_RECOMMENDED_PHP_VER = '7.2.0';
 
   /**
    * The minimum PHP version required to install Civi.
    *
    * @see install/index.php
    */
-  const MIN_INSTALL_PHP_VER = '7.0';
+  const MIN_INSTALL_PHP_VER = '7.1.0';
 
   /**
    * Compute any messages which should be displayed before upgrade.
@@ -54,7 +59,7 @@ class CRM_Upgrade_Incremental_General {
       $preUpgradeMessage .= ts('You may proceed with the upgrade and CiviCRM %1 will continue working normally, but future releases will require PHP %2 or above. We recommend PHP version %3.', [
         1 => $latestVer,
         2 => self::MIN_RECOMMENDED_PHP_VER,
-        3 => self::RECOMMENDED_PHP_VER,
+        3 => preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', self::RECOMMENDED_PHP_VER),
       ]);
       $preUpgradeMessage .= '</p>';
     }
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFive.php b/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFive.php
new file mode 100644
index 0000000000..e7f269ed06
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFive.php
@@ -0,0 +1,138 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Upgrade logic for FiveTwentyFive */
+class CRM_Upgrade_Incremental_php_FiveTwentyFive extends CRM_Upgrade_Incremental_Base {
+
+  /**
+   * Compute any messages which should be displayed beforeupgrade.
+   *
+   * Note: This function is called iteratively for each upcoming
+   * revision to the database.
+   *
+   * @param string $preUpgradeMessage
+   * @param string $rev
+   *   a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'.
+   * @param null $currentVer
+   */
+  public function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
+    // Example: Generate a pre-upgrade message.
+    // if ($rev == '5.12.34') {
+    //   $preUpgradeMessage .= '<p>' . ts('A new permission, "%1", has been added. This permission is now used to control access to the Manage Tags screen.', array(1 => ts('manage tags'))) . '</p>';
+    // }
+  }
+
+  /**
+   * Compute any messages which should be displayed after upgrade.
+   *
+   * @param string $postUpgradeMessage
+   *   alterable.
+   * @param string $rev
+   *   an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs.
+   */
+  public function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
+    // Example: Generate a post-upgrade message.
+    // if ($rev == '5.12.34') {
+    //   $postUpgradeMessage .= '<br /><br />' . ts("By default, CiviCRM now disables the ability to import directly from SQL. To use this feature, you must explicitly grant permission 'import SQL datasource'.");
+    // }
+  }
+
+  /*
+   * Important! All upgrade functions MUST add a 'runSql' task.
+   * Uncomment and use the following template for a new upgrade version
+   * (change the x in the function name):
+   */
+
+  //  /**
+  //   * Upgrade function.
+  //   *
+  //   * @param string $rev
+  //   */
+  //  public function upgrade_5_0_x($rev) {
+  //    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+  //    $this->addTask('Do the foo change', 'taskFoo', ...);
+  //    // Additional tasks here...
+  //    // Note: do not use ts() in the addTask description because it adds unnecessary strings to transifex.
+  //    // The above is an exception because 'Upgrade DB to %1: SQL' is generic & reusable.
+  //  }
+
+  // public static function taskFoo(CRM_Queue_TaskContext $ctx, ...) {
+  //   return TRUE;
+  // }
+
+  /**
+   * Upgrade function.
+   *
+   * @param string $rev
+   */
+  public function upgrade_5_25_alpha1($rev) {
+    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+    $this->addTask('Convert Report Form dates from jcalander to datepicker', 'convertReportsJcalendarToDatePicker');
+  }
+
+  public function upgrade_5_25_beta3($rev) {
+    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+    $this->addTask('Convert CiviContribute settings', 'updateContributeSettings');
+  }
+
+  /**
+   * Convert date fields stored in civicrm_report_instance to that format for datepicker
+   */
+  public static function convertReportsJcalendarToDatePicker() {
+    $date_fields = [];
+    $reports = CRM_Core_DAO::executeQuery("SELECT id FROM civicrm_report_instance WHERE form_values like '%relative%'");
+    while ($reports->fetch()) {
+      $report = civicrm_api3('ReportInstance', 'getsingle', ['id' => $reports->id]);
+      $reportFormValues = unserialize($report['form_values']);
+      foreach ($reportFormValues as $index => $value) {
+        if (strpos($index, '_relative') !== FALSE) {
+          $date_fields[] = str_replace('_relative', '', $index);
+        }
+      }
+      foreach ($date_fields as $date_field) {
+        foreach ($reportFormValues as $index => $value) {
+          if ($index === $date_field . '_to' || $index === $date_field . '_from') {
+            $isEndOfDay = strpos($index, '_to') !== FALSE ? TRUE : FALSE;
+            // If We have stored in the database hours minutes seconds use them
+            if (!empty($reportFormValues[$index . '_time'])) {
+              $time = $reportFormValues[$index . '_time'];
+            }
+            else {
+              $time = NULL;
+            }
+            $dateValue = $value;
+            if (date('Y-m-d', strtotime($dateValue)) !== $dateValue
+              && date('Y-m-d H:i:s', strtotime($dateValue)) !== $dateValue
+              && !empty($dateValue)
+            ) {
+              $dateValue = date('Y-m-d H:i:s', strtotime(CRM_Utils_Date::processDate($value, $time)));
+              if ($isEndOfDay) {
+                $dateValue = str_replace('00:00:00', '23:59:59', $dateValue);
+              }
+            }
+            $reportFormValues[$index] = $dateValue;
+            // Now remove the time keys as no longer needed.
+            if (!empty($reportFormValues[$index . '_time'])) {
+              unset($reportFormValues[$index . '_time']);
+            }
+          }
+        }
+        if (serialize($reportFormValues) !== $report['form_values']) {
+          civicrm_api3('ReportInstance', 'create', ['id' => $report['id'], 'form_values' => serialize($reportFormValues)]);
+        }
+        $date_fields = [];
+      }
+    }
+    return TRUE;
+  }
+
+}
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFour.php b/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFour.php
index ce1f41d4b9..e43e22d2dd 100644
--- a/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFour.php
+++ b/civicrm/CRM/Upgrade/Incremental/php/FiveTwentyFour.php
@@ -63,11 +63,6 @@ class CRM_Upgrade_Incremental_php_FiveTwentyFour extends CRM_Upgrade_Incremental
     );
   }
 
-  public function upgrade_5_24_6($rev) {
-    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
-    $this->addTask('Convert CiviContribute settings', 'updateContributeSettings');
-  }
-
   /**
    * Install sequentialCreditNotes extension.
    *
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FourFive.php b/civicrm/CRM/Upgrade/Incremental/php/FourFive.php
index 4925552c20..d905ea536b 100644
--- a/civicrm/CRM/Upgrade/Incremental/php/FourFive.php
+++ b/civicrm/CRM/Upgrade/Incremental/php/FourFive.php
@@ -331,7 +331,7 @@ DROP KEY `{$dao->CONSTRAINT_NAME}`";
             if (count($data_value) == 0 && $op == 'or') {
               $customOption = CRM_Core_BAO_CustomOption::getCustomOption($fieldID);
               foreach ($customOption as $option) {
-                $data_value[] = CRM_Utils_Array::value('value', $option);
+                $data_value[] = $option['value'] ?? NULL;
               }
             }
 
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FourFour.php b/civicrm/CRM/Upgrade/Incremental/php/FourFour.php
index 055ab62d8b..d4d83ee49d 100644
--- a/civicrm/CRM/Upgrade/Incremental/php/FourFour.php
+++ b/civicrm/CRM/Upgrade/Incremental/php/FourFour.php
@@ -719,7 +719,7 @@ CREATE TABLE IF NOT EXISTS `civicrm_word_replacement` (
           foreach ($localeCustomArray as $localCustomData) {
             // Traverse status array "enabled" "disabled"
             foreach ($localCustomData as $status => $matchTypes) {
-              $params["is_active"] = ($status == "enabled") ? TRUE : FALSE;
+              $params["is_active"] = $status == "enabled";
               // Traverse Match Type array "wildcardMatch" "exactMatch"
               foreach ($matchTypes as $matchType => $words) {
                 $params["match_type"] = $matchType;
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FourSeven.php b/civicrm/CRM/Upgrade/Incremental/php/FourSeven.php
index 30724c0508..28267eebac 100644
--- a/civicrm/CRM/Upgrade/Incremental/php/FourSeven.php
+++ b/civicrm/CRM/Upgrade/Incremental/php/FourSeven.php
@@ -621,7 +621,7 @@ class CRM_Upgrade_Incremental_php_FourSeven extends CRM_Upgrade_Incremental_Base
     foreach ($backend as $propertyName => $propertyValue) {
       if (isset($mappings[$propertyName][0]) && preg_match('/^setting/', $mappings[$propertyName][0])) {
         // $mapping format: $propertyName => Array(0 => $type, 1 => $setting|NULL).
-        $settingName = isset($mappings[$propertyName][1]) ? $mappings[$propertyName][1] : $propertyName;
+        $settingName = $mappings[$propertyName][1] ?? $propertyName;
         $settings[$settingName] = $propertyValue;
       }
     }
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.0.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.0.mysql.tpl
deleted file mode 100644
index 13413bfed1..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.0.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.0 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.1.mysql.tpl
deleted file mode 100644
index ac16755fe3..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.1.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.1 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.2.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.2.mysql.tpl
deleted file mode 100644
index b867afafe5..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.2.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.2 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.3.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.3.mysql.tpl
deleted file mode 100644
index 63e37fb983..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.3.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.3 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.4.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.4.mysql.tpl
deleted file mode 100644
index 735d848aac..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.4.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.4 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.5.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.5.mysql.tpl
deleted file mode 100644
index ec203cc5a2..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.5.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.5 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.24.6.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.24.6.mysql.tpl
deleted file mode 100644
index 0054af1dfb..0000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.24.6.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.24.6 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.25.0.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.25.0.mysql.tpl
new file mode 100644
index 0000000000..10ef3a0996
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.25.0.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.25.0 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.25.alpha1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.25.alpha1.mysql.tpl
new file mode 100644
index 0000000000..be9ec11c28
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.25.alpha1.mysql.tpl
@@ -0,0 +1,4 @@
+{* file to handle db changes in 5.25.alpha1 during upgrade *}
+
+-- dev/core#1569 Update data type for form values to LONGTEXT
+ALTER TABLE civicrm_report_instance MODIFY COLUMN form_values LONGTEXT COMMENT 'Submitted form values for this report';
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta1.mysql.tpl
new file mode 100644
index 0000000000..45c756a3cf
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta1.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.25.beta1 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta2.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta2.mysql.tpl
new file mode 100644
index 0000000000..096e95735d
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta2.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.25.beta2 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta3.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta3.mysql.tpl
new file mode 100644
index 0000000000..1d9fd478e2
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.25.beta3.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.25.beta3 during upgrade *}
diff --git a/civicrm/CRM/Utils/Address.php b/civicrm/CRM/Utils/Address.php
index 0358f34d14..90163f0117 100644
--- a/civicrm/CRM/Utils/Address.php
+++ b/civicrm/CRM/Utils/Address.php
@@ -59,7 +59,7 @@ class CRM_Utils_Address {
 
     $formatted = $format;
 
-    $fullPostalCode = CRM_Utils_Array::value('postal_code', $fields);
+    $fullPostalCode = $fields['postal_code'] ?? NULL;
     if (!empty($fields['postal_code_suffix'])) {
       $fullPostalCode .= "-$fields[postal_code_suffix]";
     }
@@ -101,54 +101,54 @@ class CRM_Utils_Address {
     if (!$microformat) {
       // replacements in case of Individual Name Format
       $replacements = [
-        'contact.display_name' => CRM_Utils_Array::value('display_name', $fields),
-        'contact.individual_prefix' => CRM_Utils_Array::value('individual_prefix', $fields),
-        'contact.formal_title' => CRM_Utils_Array::value('formal_title', $fields),
-        'contact.first_name' => CRM_Utils_Array::value('first_name', $fields),
-        'contact.middle_name' => CRM_Utils_Array::value('middle_name', $fields),
-        'contact.last_name' => CRM_Utils_Array::value('last_name', $fields),
-        'contact.individual_suffix' => CRM_Utils_Array::value('individual_suffix', $fields),
-        'contact.address_name' => CRM_Utils_Array::value('address_name', $fields),
-        'contact.street_address' => CRM_Utils_Array::value('street_address', $fields),
-        'contact.supplemental_address_1' => CRM_Utils_Array::value('supplemental_address_1', $fields),
-        'contact.supplemental_address_2' => CRM_Utils_Array::value('supplemental_address_2', $fields),
-        'contact.supplemental_address_3' => CRM_Utils_Array::value('supplemental_address_3', $fields),
-        'contact.city' => CRM_Utils_Array::value('city', $fields),
-        'contact.state_province_name' => CRM_Utils_Array::value('state_province_name', $fields),
-        'contact.county' => CRM_Utils_Array::value('county', $fields),
-        'contact.state_province' => CRM_Utils_Array::value('state_province', $fields),
+        'contact.display_name' => $fields['display_name'] ?? NULL,
+        'contact.individual_prefix' => $fields['individual_prefix'] ?? NULL,
+        'contact.formal_title' => $fields['formal_title'] ?? NULL,
+        'contact.first_name' => $fields['first_name'] ?? NULL,
+        'contact.middle_name' => $fields['middle_name'] ?? NULL,
+        'contact.last_name' => $fields['last_name'] ?? NULL,
+        'contact.individual_suffix' => $fields['individual_suffix'] ?? NULL,
+        'contact.address_name' => $fields['address_name'] ?? NULL,
+        'contact.street_address' => $fields['street_address'] ?? NULL,
+        'contact.supplemental_address_1' => $fields['supplemental_address_1'] ?? NULL,
+        'contact.supplemental_address_2' => $fields['supplemental_address_2'] ?? NULL,
+        'contact.supplemental_address_3' => $fields['supplemental_address_3'] ?? NULL,
+        'contact.city' => $fields['city'] ?? NULL,
+        'contact.state_province_name' => $fields['state_province_name'] ?? NULL,
+        'contact.county' => $fields['county'] ?? NULL,
+        'contact.state_province' => $fields['state_province'] ?? NULL,
         'contact.postal_code' => $fullPostalCode,
-        'contact.country' => CRM_Utils_Array::value('country', $fields),
-        'contact.world_region' => CRM_Utils_Array::value('world_region', $fields),
-        'contact.geo_code_1' => CRM_Utils_Array::value('geo_code_1', $fields),
-        'contact.geo_code_2' => CRM_Utils_Array::value('geo_code_2', $fields),
-        'contact.current_employer' => CRM_Utils_Array::value('current_employer', $fields),
-        'contact.nick_name' => CRM_Utils_Array::value('nick_name', $fields),
-        'contact.email' => CRM_Utils_Array::value('email', $fields),
-        'contact.im' => CRM_Utils_Array::value('im', $fields),
-        'contact.do_not_email' => CRM_Utils_Array::value('do_not_email', $fields),
-        'contact.do_not_phone' => CRM_Utils_Array::value('do_not_phone', $fields),
-        'contact.do_not_mail' => CRM_Utils_Array::value('do_not_mail', $fields),
-        'contact.do_not_sms' => CRM_Utils_Array::value('do_not_sms', $fields),
-        'contact.do_not_trade' => CRM_Utils_Array::value('do_not_trade', $fields),
-        'contact.job_title' => CRM_Utils_Array::value('job_title', $fields),
-        'contact.birth_date' => CRM_Utils_Array::value('birth_date', $fields),
-        'contact.gender' => CRM_Utils_Array::value('gender', $fields),
-        'contact.is_opt_out' => CRM_Utils_Array::value('is_opt_out', $fields),
-        'contact.preferred_mail_format' => CRM_Utils_Array::value('preferred_mail_format', $fields),
-        'contact.phone' => CRM_Utils_Array::value('phone', $fields),
-        'contact.home_URL' => CRM_Utils_Array::value('home_URL', $fields),
-        'contact.contact_source' => CRM_Utils_Array::value('contact_source', $fields),
-        'contact.external_identifier' => CRM_Utils_Array::value('external_identifier', $fields),
-        'contact.contact_id' => CRM_Utils_Array::value('id', $fields),
-        'contact.household_name' => CRM_Utils_Array::value('display_name', $fields),
-        'contact.organization_name' => CRM_Utils_Array::value('display_name', $fields),
-        'contact.legal_name' => CRM_Utils_Array::value('legal_name', $fields),
-        'contact.preferred_communication_method' => CRM_Utils_Array::value('preferred_communication_method', $fields),
-        'contact.communication_style' => CRM_Utils_Array::value('communication_style', $fields),
-        'contact.addressee' => CRM_Utils_Array::value('addressee_display', $fields),
-        'contact.email_greeting' => CRM_Utils_Array::value('email_greeting_display', $fields),
-        'contact.postal_greeting' => CRM_Utils_Array::value('postal_greeting_display', $fields),
+        'contact.country' => $fields['country'] ?? NULL,
+        'contact.world_region' => $fields['world_region'] ?? NULL,
+        'contact.geo_code_1' => $fields['geo_code_1'] ?? NULL,
+        'contact.geo_code_2' => $fields['geo_code_2'] ?? NULL,
+        'contact.current_employer' => $fields['current_employer'] ?? NULL,
+        'contact.nick_name' => $fields['nick_name'] ?? NULL,
+        'contact.email' => $fields['email'] ?? NULL,
+        'contact.im' => $fields['im'] ?? NULL,
+        'contact.do_not_email' => $fields['do_not_email'] ?? NULL,
+        'contact.do_not_phone' => $fields['do_not_phone'] ?? NULL,
+        'contact.do_not_mail' => $fields['do_not_mail'] ?? NULL,
+        'contact.do_not_sms' => $fields['do_not_sms'] ?? NULL,
+        'contact.do_not_trade' => $fields['do_not_trade'] ?? NULL,
+        'contact.job_title' => $fields['job_title'] ?? NULL,
+        'contact.birth_date' => $fields['birth_date'] ?? NULL,
+        'contact.gender' => $fields['gender'] ?? NULL,
+        'contact.is_opt_out' => $fields['is_opt_out'] ?? NULL,
+        'contact.preferred_mail_format' => $fields['preferred_mail_format'] ?? NULL,
+        'contact.phone' => $fields['phone'] ?? NULL,
+        'contact.home_URL' => $fields['home_URL'] ?? NULL,
+        'contact.contact_source' => $fields['contact_source'] ?? NULL,
+        'contact.external_identifier' => $fields['external_identifier'] ?? NULL,
+        'contact.contact_id' => $fields['id'] ?? NULL,
+        'contact.household_name' => $fields['display_name'] ?? NULL,
+        'contact.organization_name' => $fields['display_name'] ?? NULL,
+        'contact.legal_name' => $fields['legal_name'] ?? NULL,
+        'contact.preferred_communication_method' => $fields['preferred_communication_method'] ?? NULL,
+        'contact.communication_style' => $fields['communication_style'] ?? NULL,
+        'contact.addressee' => $fields['addressee_display'] ?? NULL,
+        'contact.email_greeting' => $fields['email_greeting_display'] ?? NULL,
+        'contact.postal_greeting' => $fields['postal_greeting_display'] ?? NULL,
       ];
     }
     else {
@@ -194,7 +194,7 @@ class CRM_Utils_Address {
     // also sub all token fields
     if ($tokenFields) {
       foreach ($tokenFields as $token) {
-        $replacements["{$token}"] = CRM_Utils_Array::value("{$token}", $fields);
+        $replacements["{$token}"] = $fields["{$token}"] ?? NULL;
       }
     }
 
@@ -320,7 +320,7 @@ class CRM_Utils_Address {
 
     $addressFields = [];
     foreach ($addressParts as $name => $field) {
-      $value = CRM_Utils_Array::value($field, $params);
+      $value = $params[$field] ?? NULL;
       $alternateName = 'billing_' . $name . '_id-' . $billingLocationTypeID;
       $alternate2 = 'billing_' . $name . '-' . $billingLocationTypeID;
       if (isset($params[$alternate2]) && !isset($params[$alternateName])) {
diff --git a/civicrm/CRM/Utils/Array.php b/civicrm/CRM/Utils/Array.php
index 1f1d1d6001..14563ccabe 100644
--- a/civicrm/CRM/Utils/Array.php
+++ b/civicrm/CRM/Utils/Array.php
@@ -21,12 +21,12 @@ class CRM_Utils_Array {
    * Returns $list[$key] if such element exists, or a default value otherwise.
    *
    * If $list is not actually an array at all, then the default value is
-   * returned.
+   * returned. We hope to deprecate this behaviour.
    *
    *
    * @param string $key
    *   Key value to look up in the array.
-   * @param array $list
+   * @param array|ArrayAccess $list
    *   Array from which to look up a value.
    * @param mixed $default
    *   (optional) Value to return $list[$key] does not exist.
@@ -38,6 +38,12 @@ class CRM_Utils_Array {
     if (is_array($list)) {
       return array_key_exists($key, $list) ? $list[$key] : $default;
     }
+    if ($list instanceof ArrayAccess) {
+      // ArrayAccess requires offsetExists is implemented for the equivalent to array_key_exists.
+      return $list->offsetExists($key) ? $list[$key] : $default;
+    }
+    // @todo - eliminate these from core & uncomment this line.
+    // CRM_Core_Error::deprecatedFunctionWarning('You have passed an invalid parameter for the "list"');
     return $default;
   }
 
@@ -563,10 +569,10 @@ class CRM_Utils_Array {
       $node = &$result;
       foreach ($keys as $key) {
         if (is_array($record)) {
-          $keyvalue = isset($record[$key]) ? $record[$key] : NULL;
+          $keyvalue = $record[$key] ?? NULL;
         }
         else {
-          $keyvalue = isset($record->{$key}) ? $record->{$key} : NULL;
+          $keyvalue = $record->{$key} ?? NULL;
         }
         if (isset($node[$keyvalue]) && !is_array($node[$keyvalue])) {
           $node[$keyvalue] = [];
@@ -909,7 +915,7 @@ class CRM_Utils_Array {
     foreach ($matrix as $pos => $oldRow) {
       $newRow = [];
       foreach ($columns as $column) {
-        $newRow[$column] = CRM_Utils_Array::value($column, $oldRow);
+        $newRow[$column] = $oldRow[$column] ?? NULL;
       }
       $newRows[$pos] = $newRow;
     }
diff --git a/civicrm/CRM/Utils/Cache.php b/civicrm/CRM/Utils/Cache.php
index 3ac1130ce9..6243a72bf3 100644
--- a/civicrm/CRM/Utils/Cache.php
+++ b/civicrm/CRM/Utils/Cache.php
@@ -190,7 +190,7 @@ class CRM_Utils_Cache {
           if (defined('CIVICRM_DSN') && CIVICRM_DSN) {
             return new CRM_Utils_Cache_SqlGroup([
               'group' => $params['name'],
-              'prefetch' => CRM_Utils_Array::value('prefetch', $params, FALSE),
+              'prefetch' => $params['prefetch'] ?? FALSE,
             ]);
           }
           break;
diff --git a/civicrm/CRM/Utils/Cache/Redis.php b/civicrm/CRM/Utils/Cache/Redis.php
index b5cb655e42..b9db031f07 100644
--- a/civicrm/CRM/Utils/Cache/Redis.php
+++ b/civicrm/CRM/Utils/Cache/Redis.php
@@ -60,8 +60,8 @@ class CRM_Utils_Cache_Redis implements CRM_Utils_Cache_Interface {
    * @return Redis
    */
   public static function connect($config) {
-    $host = isset($config['host']) ? $config['host'] : self::DEFAULT_HOST;
-    $port = isset($config['port']) ? $config['port'] : self::DEFAULT_PORT;
+    $host = $config['host'] ?? self::DEFAULT_HOST;
+    $port = $config['port'] ?? self::DEFAULT_PORT;
     // Ugh.
     $pass = CRM_Utils_Constant::value('CIVICRM_DB_CACHE_PASSWORD');
     $id = implode(':', ['connect', $host, $port /* $pass is constant */]);
diff --git a/civicrm/CRM/Utils/Cache/SqlGroup.php b/civicrm/CRM/Utils/Cache/SqlGroup.php
index 3aa8bb17c0..3f499aa930 100644
--- a/civicrm/CRM/Utils/Cache/SqlGroup.php
+++ b/civicrm/CRM/Utils/Cache/SqlGroup.php
@@ -211,8 +211,7 @@ class CRM_Utils_Cache_SqlGroup implements CRM_Utils_Cache_Interface {
   public function flush() {
     if ($this->group == CRM_Utils_Cache::cleanKey('CiviCRM Search PrevNextCache') &&
       Civi::service('prevnext') instanceof CRM_Core_PrevNextCache_Sql) {
-      // Use the standard PrevNextCache cleanup function here not just delete from civicrm_cache
-      CRM_Core_BAO_PrevNextCache::cleanupCache();
+      Civi::service('prevnext')->cleanup();
     }
     else {
       CRM_Core_DAO::executeQuery("DELETE FROM {$this->table} WHERE {$this->where()}");
diff --git a/civicrm/CRM/Utils/Chart.php b/civicrm/CRM/Utils/Chart.php
index 88a075085e..9a5b90a71c 100644
--- a/civicrm/CRM/Utils/Chart.php
+++ b/civicrm/CRM/Utils/Chart.php
@@ -200,19 +200,19 @@ class CRM_Utils_Chart {
         'legend' => "$legend " . CRM_Utils_Array::value('legend', $rows, ts('Contribution')) . ' ' . ts('Summary'),
         'values' => $graph[0],
         'multiValues' => $graph,
-        'barKeys' => CRM_Utils_Array::value('barKeys', $rows, []),
+        'barKeys' => $rows['barKeys'] ?? [],
       ];
     }
 
     // rotate the x labels.
-    $chartData['xLabelAngle'] = CRM_Utils_Array::value('xLabelAngle', $rows, 0);
+    $chartData['xLabelAngle'] = $rows['xLabelAngle'] ?? 0;
     if (!empty($rows['tip'])) {
       $chartData['tip'] = $rows['tip'];
     }
 
     // legend
-    $chartData['xname'] = CRM_Utils_Array::value('xname', $rows);
-    $chartData['yname'] = CRM_Utils_Array::value('yname', $rows);
+    $chartData['xname'] = $rows['xname'] ?? NULL;
+    $chartData['yname'] = $rows['yname'] ?? NULL;
 
     // carry some chart params if pass.
     foreach ([
diff --git a/civicrm/CRM/Utils/Check/Component/Env.php b/civicrm/CRM/Utils/Check/Component/Env.php
index b6ebd4e7d6..185ed5f9c2 100644
--- a/civicrm/CRM/Utils/Check/Component/Env.php
+++ b/civicrm/CRM/Utils/Check/Component/Env.php
@@ -29,7 +29,7 @@ class CRM_Utils_Check_Component_Env extends CRM_Utils_Check_Component {
         ts('This system uses PHP version %1 which meets or exceeds the recommendation of %2.',
           [
             1 => $phpVersion,
-            2 => CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER,
+            2 => preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER),
           ]),
           ts('PHP Up-to-Date'),
           \Psr\Log\LogLevel::INFO,
@@ -56,7 +56,7 @@ class CRM_Utils_Check_Component_Env extends CRM_Utils_Check_Component {
           [
             1 => $phpVersion,
             2 => CRM_Upgrade_Incremental_General::MIN_RECOMMENDED_PHP_VER,
-            3 => CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER,
+            3 => preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER),
           ]),
           ts('PHP Out-of-Date'),
           \Psr\Log\LogLevel::WARNING,
@@ -66,11 +66,11 @@ class CRM_Utils_Check_Component_Env extends CRM_Utils_Check_Component {
     else {
       $messages[] = new CRM_Utils_Check_Message(
         __FUNCTION__,
-        ts('This system uses PHP version %1. To ensure the continued operation of CiviCRM, upgrade your server now. At least PHP version %2 is recommended; the preferrred version is %3.',
+        ts('This system uses PHP version %1. To ensure the continued operation of CiviCRM, upgrade your server now. At least PHP version %2 is recommended; the preferred version is %3.',
           [
             1 => $phpVersion,
             2 => CRM_Upgrade_Incremental_General::MIN_RECOMMENDED_PHP_VER,
-            3 => CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER,
+            3 => preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER),
           ]),
           ts('PHP Out-of-Date'),
           \Psr\Log\LogLevel::ERROR,
@@ -595,13 +595,13 @@ class CRM_Utils_Check_Component_Env extends CRM_Utils_Check_Component {
       $row = CRM_Admin_Page_Extensions::createExtendedInfo($obj);
       switch ($row['status']) {
         case CRM_Extension_Manager::STATUS_INSTALLED_MISSING:
-          $errors[] = ts('%1 extension (%2) is installed but missing files.', [1 => CRM_Utils_Array::value('label', $row), 2 => $key]);
+          $errors[] = ts('%1 extension (%2) is installed but missing files.', [1 => $row['label'] ?? NULL, 2 => $key]);
           break;
 
         case CRM_Extension_Manager::STATUS_INSTALLED:
           if (!empty($remotes[$key]) && version_compare($row['version'], $remotes[$key]->version, '<')) {
             $updates[] = ts('%1 (%2) version %3 is installed. <a %4>Upgrade to version %5</a>.', [
-              1 => CRM_Utils_Array::value('label', $row),
+              1 => $row['label'] ?? NULL,
               2 => $key,
               3 => $row['version'],
               4 => 'href="' . CRM_Utils_System::url('civicrm/admin/extensions', "action=update&id=$key&key=$key") . '"',
diff --git a/civicrm/CRM/Utils/Check/Component/Security.php b/civicrm/CRM/Utils/Check/Component/Security.php
index 2c79192a25..3a17c834fd 100644
--- a/civicrm/CRM/Utils/Check/Component/Security.php
+++ b/civicrm/CRM/Utils/Check/Component/Security.php
@@ -223,16 +223,6 @@ class CRM_Utils_Check_Component_Security extends CRM_Utils_Check_Component {
         "{$civicrm_root}/packages/html2text/class.html2text.inc",
         \Psr\Log\LogLevel::CRITICAL,
       ],
-      [
-        // MOSS CIV-01-002: The "demo.html" is problematic. Other unnecessary files should be deleted as a precaution. Consider deleting the folder and re-running 'composer install'.
-        Civi::paths()->getPath('[civicrm.bower]/google-code-prettify/styles/demo.html'),
-        \Psr\Log\LogLevel::CRITICAL,
-      ],
-      [
-        // MOSS CIV-01-002: Certain QUnit addons are problematic. Other unnecessary files should be deleted as a precaution. Consider deleting the folder and re-running 'composer install'.
-        Civi::paths()->getPath('[civicrm.bower]/qunit/addons'),
-        \Psr\Log\LogLevel::CRITICAL,
-      ],
     ];
     foreach ($files as $file) {
       if (file_exists($file[0])) {
diff --git a/civicrm/CRM/Utils/Date.php b/civicrm/CRM/Utils/Date.php
index 5accb77e7a..9e4eac33ed 100644
--- a/civicrm/CRM/Utils/Date.php
+++ b/civicrm/CRM/Utils/Date.php
@@ -395,8 +395,8 @@ class CRM_Utils_Date {
       }
 
       $date = [
-        '%b' => CRM_Utils_Array::value($month, $abbrMonths),
-        '%B' => CRM_Utils_Array::value($month, $fullMonths),
+        '%b' => $abbrMonths[$month] ?? NULL,
+        '%B' => $fullMonths[$month] ?? NULL,
         '%d' => $day > 9 ? $day : '0' . $day,
         '%e' => $day > 9 ? $day : ' ' . $day,
         '%E' => $day,
@@ -771,7 +771,7 @@ class CRM_Utils_Date {
       $now = self::isoToMysql($now);
     }
 
-    return (strtotime($mysqlDate) >= strtotime($now)) ? FALSE : TRUE;
+    return !(strtotime($mysqlDate) >= strtotime($now));
   }
 
   /**
@@ -950,12 +950,12 @@ class CRM_Utils_Date {
    */
   public static function intervalAdd($unit, $interval, $date, $dontCareTime = FALSE) {
     if (is_array($date)) {
-      $hour = CRM_Utils_Array::value('H', $date);
-      $minute = CRM_Utils_Array::value('i', $date);
-      $second = CRM_Utils_Array::value('s', $date);
-      $month = CRM_Utils_Array::value('M', $date);
-      $day = CRM_Utils_Array::value('d', $date);
-      $year = CRM_Utils_Array::value('Y', $date);
+      $hour = $date['H'] ?? NULL;
+      $minute = $date['i'] ?? NULL;
+      $second = $date['s'] ?? NULL;
+      $month = $date['M'] ?? NULL;
+      $day = $date['d'] ?? NULL;
+      $year = $date['Y'] ?? NULL;
     }
     else {
       extract(date_parse($date));
@@ -1093,7 +1093,7 @@ class CRM_Utils_Date {
     $from['H'] = $from['i'] = $from['s'] = 0;
     $relativeTermParts = explode('_', $relativeTerm);
     $relativeTermPrefix = $relativeTermParts[0];
-    $relativeTermSuffix = isset($relativeTermParts[1]) ? $relativeTermParts[1] : '';
+    $relativeTermSuffix = $relativeTermParts[1] ?? '';
 
     switch ($unit) {
       case 'year':
diff --git a/civicrm/CRM/Utils/DeprecatedUtils.php b/civicrm/CRM/Utils/DeprecatedUtils.php
index fc19eaf7fd..b6da19bb68 100644
--- a/civicrm/CRM/Utils/DeprecatedUtils.php
+++ b/civicrm/CRM/Utils/DeprecatedUtils.php
@@ -157,8 +157,8 @@ function _civicrm_api3_deprecated_activity_formatted_param(&$params, &$values, $
       elseif ($type == 'Select' || $type == 'Radio') {
         $customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldID, TRUE);
         foreach ($customOption as $customFldID => $customValue) {
-          $val = CRM_Utils_Array::value('value', $customValue);
-          $label = CRM_Utils_Array::value('label', $customValue);
+          $val = $customValue['value'] ?? NULL;
+          $label = $customValue['label'] ?? NULL;
           $label = strtolower($label);
           $value = strtolower(trim($value));
           if (($value == $label) || ($value == strtolower($val))) {
@@ -255,7 +255,7 @@ function _civicrm_api3_deprecated_add_formatted_param(&$values, &$params) {
   if (isset($values['email_greeting'])) {
     if (!empty($params['email_greeting_id'])) {
       $emailGreetingFilter = [
-        'contact_type' => CRM_Utils_Array::value('contact_type', $params),
+        'contact_type' => $params['contact_type'] ?? NULL,
         'greeting_type' => 'email_greeting',
       ];
       $emailGreetings = CRM_Core_PseudoConstant::greeting($emailGreetingFilter);
@@ -271,7 +271,7 @@ function _civicrm_api3_deprecated_add_formatted_param(&$values, &$params) {
   if (isset($values['postal_greeting'])) {
     if (!empty($params['postal_greeting_id'])) {
       $postalGreetingFilter = [
-        'contact_type' => CRM_Utils_Array::value('contact_type', $params),
+        'contact_type' => $params['contact_type'] ?? NULL,
         'greeting_type' => 'postal_greeting',
       ];
       $postalGreetings = CRM_Core_PseudoConstant::greeting($postalGreetingFilter);
@@ -286,7 +286,7 @@ function _civicrm_api3_deprecated_add_formatted_param(&$values, &$params) {
   if (isset($values['addressee'])) {
     if (!empty($params['addressee_id'])) {
       $addresseeFilter = [
-        'contact_type' => CRM_Utils_Array::value('contact_type', $params),
+        'contact_type' => $params['contact_type'] ?? NULL,
         'greeting_type' => 'addressee',
       ];
       $addressee = CRM_Core_PseudoConstant::addressee($addresseeFilter);
@@ -434,7 +434,7 @@ function _civicrm_api3_deprecated_add_formatted_param(&$values, &$params) {
           // mark an entry in fields array since we want the value of custom field to be copied
           $fields['Address'][$key] = NULL;
 
-          $htmlType = CRM_Utils_Array::value('html_type', $customFields[$customFieldID]);
+          $htmlType = $customFields[$customFieldID]['html_type'] ?? NULL;
           switch ($htmlType) {
             case 'CheckBox':
             case 'Multi-Select':
@@ -548,8 +548,8 @@ function _civicrm_api3_deprecated_add_formatted_param(&$values, &$params) {
  *   <type>
  */
 function _civicrm_api3_deprecated_duplicate_formatted_contact($params) {
-  $id = CRM_Utils_Array::value('id', $params);
-  $externalId = CRM_Utils_Array::value('external_identifier', $params);
+  $id = $params['id'] ?? NULL;
+  $externalId = $params['external_identifier'] ?? NULL;
   if ($id || $externalId) {
     $contact = new CRM_Contact_DAO_Contact();
 
@@ -755,7 +755,7 @@ function _civicrm_api3_deprecated_contact_check_params(
     if (empty($params['contact_type'])) {
       return civicrm_api3_create_error("No Contact Type");
     }
-    $fields = CRM_Utils_Array::value($params['contact_type'], $required);
+    $fields = $required[$params['contact_type']] ?? NULL;
     if ($fields == NULL) {
       return civicrm_api3_create_error("Invalid Contact Type: {$params['contact_type']}");
     }
diff --git a/civicrm/CRM/Utils/File.php b/civicrm/CRM/Utils/File.php
index 98eb7f274a..b16bb28d8a 100644
--- a/civicrm/CRM/Utils/File.php
+++ b/civicrm/CRM/Utils/File.php
@@ -399,7 +399,7 @@ class CRM_Utils_File {
       }
     }
     // support lower and uppercase file extensions
-    return isset($extensions[strtolower($ext)]) ? TRUE : FALSE;
+    return (bool) isset($extensions[strtolower($ext)]);
   }
 
   /**
@@ -1066,7 +1066,7 @@ HTACCESS;
    */
   public static function isValidFileName($fileName = NULL) {
     if ($fileName) {
-      $check = $fileName !== basename($fileName) ? FALSE : TRUE;
+      $check = ($fileName === basename($fileName));
       if ($check) {
         if (substr($fileName, 0, 1) == '/' || substr($fileName, 0, 1) == '.' || substr($fileName, 0, 1) == DIRECTORY_SEPARATOR) {
           $check = FALSE;
@@ -1083,14 +1083,8 @@ HTACCESS;
    * @return array
    */
   public static function getAcceptableExtensionsForMimeType($mimeType = NULL) {
-    $mapping = \MimeType\Mapping::$types;
-    $extensions = [];
-    foreach ($mapping as $extension => $type) {
-      if ($mimeType == $type) {
-        $extensions[] = $extension;
-      }
-    }
-    return $extensions;
+    $mimeRepostory = new \MimeTyper\Repository\ExtendedRepository();
+    return $mimeRepostory->findExtensions($mimeType);
   }
 
   /**
diff --git a/civicrm/CRM/Utils/Geocode/Google.php b/civicrm/CRM/Utils/Geocode/Google.php
index f8db5f4e6b..1cb0c847ca 100644
--- a/civicrm/CRM/Utils/Geocode/Google.php
+++ b/civicrm/CRM/Utils/Geocode/Google.php
@@ -60,7 +60,7 @@ class CRM_Utils_Geocode_Google {
       $add .= ',+';
     }
 
-    $city = CRM_Utils_Array::value('city', $values);
+    $city = $values['city'] ?? NULL;
     if ($city) {
       $add .= '+' . urlencode(str_replace('', '+', $city));
       $add .= ',+';
diff --git a/civicrm/CRM/Utils/GlobalStack.php b/civicrm/CRM/Utils/GlobalStack.php
index 44fc1c6bdc..047de04c3c 100644
--- a/civicrm/CRM/Utils/GlobalStack.php
+++ b/civicrm/CRM/Utils/GlobalStack.php
@@ -76,11 +76,11 @@ class CRM_Utils_GlobalStack {
     foreach ($new as $globalKey => $values) {
       if (is_array($values)) {
         foreach ($values as $key => $value) {
-          $frame[$globalKey][$key] = CRM_Utils_Array::value($key, $GLOBALS[$globalKey]);
+          $frame[$globalKey][$key] = $GLOBALS[$globalKey][$key] ?? NULL;
         }
       }
       else {
-        $frame[$globalKey] = CRM_Utils_Array::value($globalKey, $GLOBALS);
+        $frame[$globalKey] = $GLOBALS[$globalKey] ?? NULL;
       }
     }
     return $frame;
diff --git a/civicrm/CRM/Utils/Hook.php b/civicrm/CRM/Utils/Hook.php
index b8c5a70b79..0e00954e98 100644
--- a/civicrm/CRM/Utils/Hook.php
+++ b/civicrm/CRM/Utils/Hook.php
@@ -392,6 +392,36 @@ abstract class CRM_Utils_Hook {
     return $event->getReturnValues();
   }
 
+  /**
+   * This hook is equivalent to post(), except that it is guaranteed to run
+   * outside of any SQL transaction. The objectRef is not modifiable.
+   *
+   * This hook is defined for two cases:
+   *
+   * 1. If the original action runs within a transaction, then the hook fires
+   *    after the transaction commits.
+   * 2. If the original action runs outside a transaction, then the data was
+   *    committed immediately, and we can run the hook immediately.
+   *
+   * @param string $op
+   *   The type of operation being performed.
+   * @param string $objectName
+   *   The name of the object.
+   * @param int $objectId
+   *   The unique identifier for the object.
+   * @param object $objectRef
+   *   The reference to the object if available.
+   *
+   * @return mixed
+   *   based on op. pre-hooks return a boolean or
+   *                           an error message which aborts the operation
+   */
+  public static function postCommit($op, $objectName, $objectId, $objectRef = NULL) {
+    $event = new \Civi\Core\Event\PostEvent($op, $objectName, $objectId, $objectRef);
+    \Civi::dispatcher()->dispatch('hook_civicrm_postCommit', $event);
+    return $event->getReturnValues();
+  }
+
   /**
    * This hook retrieves links from other modules and injects it into.
    * the view contact tabs
@@ -2114,32 +2144,6 @@ abstract class CRM_Utils_Hook {
       ->invoke(['mailer', 'driver', 'params'], $mailer, $driver, $params, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_alterMailer');
   }
 
-  /**
-   * Deprecated: Misnamed version of alterMailer(). Remove post-4.7.x.
-   * Modify or replace the Mailer object used for outgoing mail.
-   *
-   * @param object $mailer
-   *   The default mailer produced by normal configuration; a PEAR "Mail" class (like those returned by Mail::factory)
-   * @param string $driver
-   *   The type of the default mailer (eg "smtp", "sendmail", "mock", "CRM_Mailing_BAO_Spool")
-   * @param array $params
-   *   The default mailer config options
-   *
-   * @return mixed
-   * @see Mail::factory
-   * @deprecated
-   */
-  public static function alterMail(&$mailer, $driver, $params) {
-    // This has been deprecated on the premise it MIGHT be called externally for a long time.
-    // We don't have a clear policy on how much we support external extensions calling internal
-    // hooks (ie. in general we say 'don't call internal functions', but some hooks like pre hooks
-    // are expected to be called externally.
-    // It's really really unlikely anyone uses this - but let's add deprecations for a couple
-    // of releases first.
-    CRM_Core_Error::deprecatedFunctionWarning('CRM_Utils_Hook::alterMailer');
-    return CRM_Utils_Hook::alterMailer($mailer, $driver, $params);
-  }
-
   /**
    * This hook is called while building the core search query,
    * so hook implementers can provide their own query objects which alters/extends core search.
@@ -2645,4 +2649,22 @@ abstract class CRM_Utils_Hook {
     );
   }
 
+  /**
+   * This hook is called to alter Custom field value before its displayed.
+   *
+   * @param string $displayValue
+   * @param mixed $value
+   * @param int $entityId
+   * @param array $fieldInfo
+   *
+   * @return mixed
+   */
+  public static function alterCustomFieldDisplayValue(&$displayValue, $value, $entityId, $fieldInfo) {
+    return self::singleton()->invoke(
+      ['displayValue', 'value', 'entityId', 'fieldInfo'],
+      $displayValue, $value, $entityId, $fieldInfo, self::$_nullObject,
+      self::$_nullObject, 'civicrm_alterCustomFieldDisplayValue'
+    );
+  }
+
 }
diff --git a/civicrm/CRM/Utils/Mail.php b/civicrm/CRM/Utils/Mail.php
index 696ed860d2..2b6e5120a7 100644
--- a/civicrm/CRM/Utils/Mail.php
+++ b/civicrm/CRM/Utils/Mail.php
@@ -167,7 +167,7 @@ class CRM_Utils_Mail {
     $defaultReturnPath = CRM_Core_BAO_MailSettings::defaultReturnPath();
     $includeMessageId = CRM_Core_BAO_MailSettings::includeMessageId();
     $emailDomain = CRM_Core_BAO_MailSettings::defaultDomain();
-    $from = CRM_Utils_Array::value('from', $params);
+    $from = $params['from'] ?? NULL;
     if (!$defaultReturnPath) {
       $defaultReturnPath = self::pluckEmailFromHeader($from);
     }
@@ -180,9 +180,9 @@ class CRM_Utils_Mail {
       return FALSE;
     }
 
-    $textMessage = CRM_Utils_Array::value('text', $params);
-    $htmlMessage = CRM_Utils_Array::value('html', $params);
-    $attachments = CRM_Utils_Array::value('attachments', $params);
+    $textMessage = $params['text'] ?? NULL;
+    $htmlMessage = $params['html'] ?? NULL;
+    $attachments = $params['attachments'] ?? NULL;
 
     // CRM-6224
     if (trim(CRM_Utils_String::htmlToText($htmlMessage)) == '') {
@@ -203,13 +203,13 @@ class CRM_Utils_Mail {
 
     // On some servers mail() fails when 'Cc' or 'Bcc' headers are defined but empty.
     foreach (['Cc', 'Bcc'] as $optionalHeader) {
-      $headers[$optionalHeader] = CRM_Utils_Array::value(strtolower($optionalHeader), $params);
+      $headers[$optionalHeader] = $params[strtolower($optionalHeader)] ?? NULL;
       if (empty($headers[$optionalHeader])) {
         unset($headers[$optionalHeader]);
       }
     }
 
-    $headers['Subject'] = CRM_Utils_Array::value('subject', $params);
+    $headers['Subject'] = $params['subject'] ?? NULL;
     $headers['Content-Type'] = $htmlMessage ? 'multipart/mixed; charset=utf-8' : 'text/plain; charset=utf-8';
     $headers['Content-Disposition'] = 'inline';
     $headers['Content-Transfer-Encoding'] = '8bit';
@@ -286,10 +286,10 @@ class CRM_Utils_Mail {
       // get emails from headers, since these are
       // combination of name and email addresses.
       if (!empty($headers['Cc'])) {
-        $to[] = CRM_Utils_Array::value('Cc', $headers);
+        $to[] = $headers['Cc'] ?? NULL;
       }
       if (!empty($headers['Bcc'])) {
-        $to[] = CRM_Utils_Array::value('Bcc', $headers);
+        $to[] = $headers['Bcc'] ?? NULL;
         unset($headers['Bcc']);
       }
     }
diff --git a/civicrm/CRM/Utils/Migrate/Export.php b/civicrm/CRM/Utils/Migrate/Export.php
index 73469e553f..76a440e26a 100644
--- a/civicrm/CRM/Utils/Migrate/Export.php
+++ b/civicrm/CRM/Utils/Migrate/Export.php
@@ -386,8 +386,8 @@ class CRM_Utils_Migrate_Export {
    * @param null $sql
    */
   public function fetch($groupName, $daoName, $sql = NULL) {
-    $idNameFields = isset($this->_xml[$groupName]['idNameFields']) ? $this->_xml[$groupName]['idNameFields'] : NULL;
-    $mappedFields = isset($this->_xml[$groupName]['mappedFields']) ? $this->_xml[$groupName]['mappedFields'] : NULL;
+    $idNameFields = $this->_xml[$groupName]['idNameFields'] ?? NULL;
+    $mappedFields = $this->_xml[$groupName]['mappedFields'] ?? NULL;
 
     $dao = new $daoName();
     if ($sql) {
diff --git a/civicrm/CRM/Utils/Migrate/ExportJSON.php b/civicrm/CRM/Utils/Migrate/ExportJSON.php
index 72550171c6..a472aa44e6 100644
--- a/civicrm/CRM/Utils/Migrate/ExportJSON.php
+++ b/civicrm/CRM/Utils/Migrate/ExportJSON.php
@@ -523,7 +523,7 @@ WHERE ac.contact_id IN ( $ids )
         $_fieldsRetrieved[$daoName][$value['name']] = [
           'uniqueName' => $key,
           'type' => $value['type'],
-          'title' => CRM_Utils_Array::value('title', $value, NULL),
+          'title' => $value['title'] ?? NULL,
         ];
       }
     }
diff --git a/civicrm/CRM/Utils/PDF/Label.php b/civicrm/CRM/Utils/PDF/Label.php
index 3094335223..c0b5d02b97 100644
--- a/civicrm/CRM/Utils/PDF/Label.php
+++ b/civicrm/CRM/Utils/PDF/Label.php
@@ -190,7 +190,7 @@ class CRM_Utils_PDF_Label extends TCPDF {
       $metric = $this->format['metric'];
     }
     else {
-      $value = CRM_Utils_Array::value($name, $this->defaults);
+      $value = $this->defaults[$name] ?? NULL;
       $metric = $this->defaults['metric'];
     }
     if ($convert) {
diff --git a/civicrm/CRM/Utils/PDF/Utils.php b/civicrm/CRM/Utils/PDF/Utils.php
index 923452c10e..c5cf7003f1 100644
--- a/civicrm/CRM/Utils/PDF/Utils.php
+++ b/civicrm/CRM/Utils/PDF/Utils.php
@@ -112,6 +112,7 @@ class CRM_Utils_PDF_Utils {
   /**
    * Convert html to tcpdf.
    *
+   * @deprecated
    * @param $paper_size
    * @param $orientation
    * @param $margins
diff --git a/civicrm/CRM/Utils/Pager.php b/civicrm/CRM/Utils/Pager.php
index 26bb54c737..a5bc97b850 100644
--- a/civicrm/CRM/Utils/Pager.php
+++ b/civicrm/CRM/Utils/Pager.php
@@ -83,10 +83,10 @@ class CRM_Utils_Pager extends Pager_Sliding {
       'last' => $this->getLastPageLink(),
       'currentPage' => $this->getCurrentPageID(),
       'numPages' => $this->numPages(),
-      'csvString' => CRM_Utils_Array::value('csvString', $params),
-      'status' => CRM_Utils_Array::value('status', $params),
-      'buttonTop' => CRM_Utils_Array::value('buttonTop', $params),
-      'buttonBottom' => CRM_Utils_Array::value('buttonBottom', $params),
+      'csvString' => $params['csvString'] ?? NULL,
+      'status' => $params['status'] ?? NULL,
+      'buttonTop' => $params['buttonTop'] ?? NULL,
+      'buttonBottom' => $params['buttonBottom'] ?? NULL,
       'currentLocation' => $this->getCurrentLocation(),
     ];
 
@@ -240,7 +240,7 @@ class CRM_Utils_Pager extends Pager_Sliding {
    */
   public function getCurrentLocation() {
     $config = CRM_Core_Config::singleton();
-    $path = CRM_Utils_Array::value($config->userFrameworkURLVar, $_GET);
+    $path = $_GET[$config->userFrameworkURLVar] ?? NULL;
     return CRM_Utils_System::url($path, CRM_Utils_System::getLinksUrl(self::PAGE_ID, FALSE, TRUE), FALSE, NULL, FALSE) . $this->getCurrentPageID();
   }
 
diff --git a/civicrm/CRM/Utils/PagerAToZ.php b/civicrm/CRM/Utils/PagerAToZ.php
index 51a1d52508..c9e15a636a 100644
--- a/civicrm/CRM/Utils/PagerAToZ.php
+++ b/civicrm/CRM/Utils/PagerAToZ.php
@@ -132,7 +132,7 @@ class CRM_Utils_PagerAToZ {
 
     $qfKey = NULL;
     if (isset($query->_formValues)) {
-      $qfKey = CRM_Utils_Array::value('qfKey', $query->_formValues);
+      $qfKey = $query->_formValues['qfKey'] ?? NULL;
     }
     if (empty($qfKey)) {
       // CRM-20943 Can only pass variables by reference and also cannot use $this so using $empty setting to NULL which is default.
diff --git a/civicrm/CRM/Utils/REST.php b/civicrm/CRM/Utils/REST.php
index a20ea58d28..5b436c0f20 100644
--- a/civicrm/CRM/Utils/REST.php
+++ b/civicrm/CRM/Utils/REST.php
@@ -175,13 +175,13 @@ class CRM_Utils_REST {
     $requestParams = CRM_Utils_Request::exportValues();
 
     // Get the function name being called from the q parameter in the query string
-    $q = CRM_Utils_Array::value('q', $requestParams);
+    $q = $requestParams['q'] ?? NULL;
     // or for the rest interface, from fnName
-    $r = CRM_Utils_Array::value('fnName', $requestParams);
+    $r = $requestParams['fnName'] ?? NULL;
     if (!empty($r)) {
       $q = $r;
     }
-    $entity = CRM_Utils_Array::value('entity', $requestParams);
+    $entity = $requestParams['entity'] ?? NULL;
     if (empty($entity) && !empty($q)) {
       $args = explode('/', $q);
       // If the function isn't in the civicrm namespace, reject the request.
@@ -204,8 +204,8 @@ class CRM_Utils_REST {
       // or the api format (entity+action)
       $args = [];
       $args[0] = 'civicrm';
-      $args[1] = CRM_Utils_Array::value('entity', $requestParams);
-      $args[2] = CRM_Utils_Array::value('action', $requestParams);
+      $args[1] = $requestParams['entity'] ?? NULL;
+      $args[2] = $requestParams['action'] ?? NULL;
     }
 
     // Everyone should be required to provide the server key, so the whole
@@ -213,7 +213,7 @@ class CRM_Utils_REST {
     // first check for civicrm site key
     if (!CRM_Utils_System::authenticateKey(FALSE)) {
       $docLink = CRM_Utils_System::docURL2("Managing Scheduled Jobs", TRUE, NULL, NULL, NULL, "wiki");
-      $key = CRM_Utils_Array::value('key', $requestParams);
+      $key = $requestParams['key'] ?? NULL;
       if (empty($key)) {
         return self::error("FATAL: mandatory param 'key' missing. More info at: " . $docLink);
       }
@@ -516,10 +516,10 @@ class CRM_Utils_REST {
       CRM_Utils_JSON::output($error);
     }
 
-    $q = CRM_Utils_Array::value('fnName', $requestParams);
+    $q = $requestParams['fnName'] ?? NULL;
     if (!$q) {
-      $entity = CRM_Utils_Array::value('entity', $requestParams);
-      $action = CRM_Utils_Array::value('action', $requestParams);
+      $entity = $requestParams['entity'] ?? NULL;
+      $action = $requestParams['action'] ?? NULL;
       if (!$entity || !$action) {
         $err = [
           'error_message' => 'missing mandatory params "entity=" or "action="',
@@ -535,7 +535,7 @@ class CRM_Utils_REST {
     }
 
     // get the class name, since all ajax functions pass className
-    $className = CRM_Utils_Array::value('className', $requestParams);
+    $className = $requestParams['className'] ?? NULL;
 
     // If the function isn't in the civicrm namespace, reject the request.
     if (($args[0] != 'civicrm' && count($args) != 3) && !$className) {
@@ -578,7 +578,7 @@ class CRM_Utils_REST {
    */
   public function loadCMSBootstrap() {
     $requestParams = CRM_Utils_Request::exportValues();
-    $q = CRM_Utils_Array::value('q', $requestParams);
+    $q = $requestParams['q'] ?? NULL;
     $args = explode('/', $q);
 
     // Proceed with bootstrap for "?entity=X&action=Y"
diff --git a/civicrm/CRM/Utils/Recent.php b/civicrm/CRM/Utils/Recent.php
index f70c76c2e3..59818c0b01 100644
--- a/civicrm/CRM/Utils/Recent.php
+++ b/civicrm/CRM/Utils/Recent.php
@@ -119,11 +119,11 @@ class CRM_Utils_Recent {
         'type' => $type,
         'contact_id' => $contactId,
         'contactName' => $contactName,
-        'subtype' => CRM_Utils_Array::value('subtype', $others),
-        'isDeleted' => CRM_Utils_Array::value('isDeleted', $others, FALSE),
-        'image_url' => CRM_Utils_Array::value('imageUrl', $others),
-        'edit_url' => CRM_Utils_Array::value('editUrl', $others),
-        'delete_url' => CRM_Utils_Array::value('deleteUrl', $others),
+        'subtype' => $others['subtype'] ?? NULL,
+        'isDeleted' => $others['isDeleted'] ?? FALSE,
+        'image_url' => $others['imageUrl'] ?? NULL,
+        'edit_url' => $others['editUrl'] ?? NULL,
+        'delete_url' => $others['deleteUrl'] ?? NULL,
       ]
     );
 
diff --git a/civicrm/CRM/Utils/Request.php b/civicrm/CRM/Utils/Request.php
index 731e43ffaf..643646c2ed 100644
--- a/civicrm/CRM/Utils/Request.php
+++ b/civicrm/CRM/Utils/Request.php
@@ -222,7 +222,7 @@ class CRM_Utils_Request {
    *   The desired value.
    */
   public static function retrieveComponent($attributes) {
-    $url = CRM_Utils_Array::value('action', $attributes);
+    $url = $attributes['action'] ?? NULL;
     // Whilst the following is a fallible universal test for urlencoded URLs,
     // thankfully the "action" URL has a limited and predictable form and
     // therefore this comparison is sufficient for our purposes.
diff --git a/civicrm/CRM/Utils/Rule.php b/civicrm/CRM/Utils/Rule.php
index e7f890b3ef..46402eebdc 100644
--- a/civicrm/CRM/Utils/Rule.php
+++ b/civicrm/CRM/Utils/Rule.php
@@ -308,9 +308,9 @@ class CRM_Utils_Rule {
   public static function currentDate($date, $monthRequired = TRUE) {
     $config = CRM_Core_Config::singleton();
 
-    $d = CRM_Utils_Array::value('d', $date);
-    $m = CRM_Utils_Array::value('M', $date);
-    $y = CRM_Utils_Array::value('Y', $date);
+    $d = $date['d'] ?? NULL;
+    $m = $date['M'] ?? NULL;
+    $y = $date['Y'] ?? NULL;
 
     if (!$d && !$m && !$y) {
       return TRUE;
@@ -318,7 +318,7 @@ class CRM_Utils_Rule {
 
     // CRM-9017 CiviContribute/CiviMember form with expiration date format 'm Y'
     if (!$m && !empty($date['m'])) {
-      $m = CRM_Utils_Array::value('m', $date);
+      $m = $date['m'] ?? NULL;
     }
 
     $day = $mon = 1;
@@ -449,7 +449,7 @@ class CRM_Utils_Rule {
    */
   public static function positiveInteger($value) {
     if (is_int($value)) {
-      return ($value < 0) ? FALSE : TRUE;
+      return !($value < 0);
     }
 
     // CRM-13460
@@ -458,11 +458,7 @@ class CRM_Utils_Rule {
       return FALSE;
     }
 
-    if (preg_match('/^\d+$/', $value)) {
-      return TRUE;
-    }
-
-    return FALSE;
+    return (bool) preg_match('/^\d+$/', $value);
   }
 
   /**
@@ -492,7 +488,7 @@ class CRM_Utils_Rule {
       return FALSE;
     }
 
-    return preg_match('/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/', $value) ? TRUE : FALSE;
+    return (bool) preg_match('/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/', $value);
   }
 
   /**
@@ -513,7 +509,7 @@ class CRM_Utils_Rule {
    * @return bool
    */
   public static function alphanumeric($value) {
-    return preg_match('/^[a-zA-Z0-9_-]*$/', $value) ? TRUE : FALSE;
+    return (bool) preg_match('/^[a-zA-Z0-9_-]*$/', $value);
   }
 
   /**
@@ -523,7 +519,7 @@ class CRM_Utils_Rule {
    * @return bool
    */
   public static function numberOfDigit($value, $noOfDigit) {
-    return preg_match('/^\d{' . $noOfDigit . '}$/', $value) ? TRUE : FALSE;
+    return (bool) preg_match('/^\d{' . $noOfDigit . '}$/', $value);
   }
 
   /**
@@ -605,7 +601,7 @@ class CRM_Utils_Rule {
     // Allow values such as -0, 1.024555, -.1
     // We need to support multiple decimal places here, not just the number allowed by locale
     //  otherwise tax calculations break when you want the inclusive amount to be a round number (eg. £10 inc. VAT requires 8.333333333 here).
-    return preg_match('/(^-?\d+\.?\d*$)|(^-?\.\d+$)/', $value) ? TRUE : FALSE;
+    return (bool) preg_match('/(^-?\d+\.?\d*$)|(^-?\.\d+$)/', $value);
   }
 
   /**
@@ -889,13 +885,13 @@ class CRM_Utils_Rule {
   public static function qfDate($date) {
     $config = CRM_Core_Config::singleton();
 
-    $d = CRM_Utils_Array::value('d', $date);
-    $m = CRM_Utils_Array::value('M', $date);
-    $y = CRM_Utils_Array::value('Y', $date);
+    $d = $date['d'] ?? NULL;
+    $m = $date['M'] ?? NULL;
+    $y = $date['Y'] ?? NULL;
     if (isset($date['h']) ||
       isset($date['g'])
     ) {
-      $m = CRM_Utils_Array::value('M', $date);
+      $m = $date['M'] ?? NULL;
     }
 
     if (!$d && !$m && !$y) {
diff --git a/civicrm/CRM/Utils/SQL/Delete.php b/civicrm/CRM/Utils/SQL/Delete.php
index 472dab1cef..6bbc076691 100644
--- a/civicrm/CRM/Utils/SQL/Delete.php
+++ b/civicrm/CRM/Utils/SQL/Delete.php
@@ -89,7 +89,7 @@ class CRM_Utils_SQL_Delete extends CRM_Utils_SQL_BaseParamQuery {
    */
   public function __construct($from, $options = []) {
     $this->from = $from;
-    $this->mode = isset($options['mode']) ? $options['mode'] : self::INTERPOLATE_AUTO;
+    $this->mode = $options['mode'] ?? self::INTERPOLATE_AUTO;
   }
 
   /**
diff --git a/civicrm/CRM/Utils/SQL/Select.php b/civicrm/CRM/Utils/SQL/Select.php
index 1906dc3192..47707a316f 100644
--- a/civicrm/CRM/Utils/SQL/Select.php
+++ b/civicrm/CRM/Utils/SQL/Select.php
@@ -111,7 +111,7 @@ class CRM_Utils_SQL_Select extends CRM_Utils_SQL_BaseParamQuery {
    */
   public function __construct($from, $options = []) {
     $this->from = $from;
-    $this->mode = isset($options['mode']) ? $options['mode'] : self::INTERPOLATE_AUTO;
+    $this->mode = $options['mode'] ?? self::INTERPOLATE_AUTO;
   }
 
   /**
diff --git a/civicrm/CRM/Utils/Sort.php b/civicrm/CRM/Utils/Sort.php
index cef2fdcb71..a18e106118 100644
--- a/civicrm/CRM/Utils/Sort.php
+++ b/civicrm/CRM/Utils/Sort.php
@@ -106,7 +106,7 @@ class CRM_Utils_Sort {
     foreach ($vars as $weight => $value) {
       $this->_vars[$weight] = [
         'name' => CRM_Utils_Type::validate($value['sort'], 'MysqlColumnNameOrAlias'),
-        'direction' => CRM_Utils_Array::value('direction', $value),
+        'direction' => $value['direction'] ?? NULL,
         'title' => $value['name'],
       ];
     }
diff --git a/civicrm/CRM/Utils/String.php b/civicrm/CRM/Utils/String.php
index 1c878580af..4eb580dded 100644
--- a/civicrm/CRM/Utils/String.php
+++ b/civicrm/CRM/Utils/String.php
@@ -836,9 +836,9 @@ class CRM_Utils_String {
    */
   public static function simpleParseUrl($url) {
     $parts = parse_url($url);
-    $host = isset($parts['host']) ? $parts['host'] : '';
+    $host = $parts['host'] ?? '';
     $port = isset($parts['port']) ? ':' . $parts['port'] : '';
-    $path = isset($parts['path']) ? $parts['path'] : '';
+    $path = $parts['path'] ?? '';
     $query = isset($parts['query']) ? '?' . $parts['query'] : '';
     return [
       'host+port' => "$host$port",
@@ -971,4 +971,18 @@ class CRM_Utils_String {
     }
   }
 
+  /**
+   * Generic check as to whether any tokens are in the given string.
+   *
+   * It might be a smarty token OR a CiviCRM token. In both cases the
+   * absence of a '{' indicates no token is present.
+   *
+   * @param string $string
+   *
+   * @return bool
+   */
+  public static function stringContainsTokens(string $string) {
+    return strpos($string, '{') !== FALSE;
+  }
+
 }
diff --git a/civicrm/CRM/Utils/System.php b/civicrm/CRM/Utils/System.php
index 29b043f156..a8f78576e3 100644
--- a/civicrm/CRM/Utils/System.php
+++ b/civicrm/CRM/Utils/System.php
@@ -83,7 +83,7 @@ class CRM_Utils_System {
   public static function makeURL($urlVar, $includeReset = FALSE, $includeForce = TRUE, $path = NULL, $absolute = FALSE) {
     if (empty($path)) {
       $config = CRM_Core_Config::singleton();
-      $path = CRM_Utils_Array::value($config->userFrameworkURLVar, $_GET);
+      $path = $_GET[$config->userFrameworkURLVar] ?? NULL;
       if (empty($path)) {
         return '';
       }
@@ -376,7 +376,7 @@ class CRM_Utils_System {
    *   url
    */
   public static function crmURL($params) {
-    $p = CRM_Utils_Array::value('p', $params);
+    $p = $params['p'] ?? NULL;
     if (!isset($p)) {
       $p = self::currentPath();
     }
@@ -420,7 +420,7 @@ class CRM_Utils_System {
     $url = $default;
 
     $session = CRM_Core_Session::singleton();
-    $referer = CRM_Utils_Array::value('HTTP_REFERER', $_SERVER);
+    $referer = $_SERVER['HTTP_REFERER'] ?? NULL;
 
     if ($referer && !empty($names)) {
       foreach ($names as $name) {
@@ -465,7 +465,7 @@ class CRM_Utils_System {
     // this is kinda hackish but not sure how to do it right
     $url = str_replace('&amp;', '&', $url);
 
-    $context['output'] = CRM_Utils_Array::value('snippet', $_GET);
+    $context['output'] = $_GET['snippet'] ?? NULL;
 
     $parsedUrl = CRM_Utils_Url::parseUrl($url);
     CRM_Utils_Hook::alterRedirect($parsedUrl, $context);
@@ -1192,9 +1192,7 @@ class CRM_Utils_System {
    * this function, please go and change the code in the install script as well.
    */
   public static function isSSL() {
-    return (isset($_SERVER['HTTPS']) &&
-        !empty($_SERVER['HTTPS']) &&
-        strtolower($_SERVER['HTTPS']) != 'off') ? TRUE : FALSE;
+    return !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off';
   }
 
   /**
@@ -1245,7 +1243,7 @@ class CRM_Utils_System {
    *   IP address of logged in user.
    */
   public static function ipAddress($strictIPV4 = TRUE) {
-    $address = CRM_Utils_Array::value('REMOTE_ADDR', $_SERVER);
+    $address = $_SERVER['REMOTE_ADDR'] ?? NULL;
 
     $config = CRM_Core_Config::singleton();
     if ($config->userSystem->is_drupal && function_exists('ip_address')) {
@@ -1278,7 +1276,7 @@ class CRM_Utils_System {
    *   The previous page URL
    */
   public static function refererPath() {
-    return CRM_Utils_Array::value('HTTP_REFERER', $_SERVER);
+    return $_SERVER['HTTP_REFERER'] ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Utils/System/Backdrop.php b/civicrm/CRM/Utils/System/Backdrop.php
index 111db129c6..d46e56146c 100644
--- a/civicrm/CRM/Utils/System/Backdrop.php
+++ b/civicrm/CRM/Utils/System/Backdrop.php
@@ -564,7 +564,7 @@ AND    u.status = 1
       return TRUE;
     }
 
-    $uid = CRM_Utils_Array::value('uid', $params);
+    $uid = $params['uid'] ?? NULL;
     if (!$uid) {
       // Load the user we need to check Backdrop permissions.
       $name = CRM_Utils_Array::value('name', $params, FALSE) ? $params['name'] : trim(CRM_Utils_Array::value('name', $_REQUEST));
diff --git a/civicrm/CRM/Utils/System/Drupal.php b/civicrm/CRM/Utils/System/Drupal.php
index 0e05bf2bd5..f0c8cdbc7d 100644
--- a/civicrm/CRM/Utils/System/Drupal.php
+++ b/civicrm/CRM/Utils/System/Drupal.php
@@ -511,7 +511,7 @@ AND    u.status = 1
       return TRUE;
     }
 
-    $uid = CRM_Utils_Array::value('uid', $params);
+    $uid = $params['uid'] ?? NULL;
     if (!$uid) {
       //load user, we need to check drupal permissions.
       $name = CRM_Utils_Array::value('name', $params, FALSE) ? $params['name'] : trim(CRM_Utils_Array::value('name', $_REQUEST));
diff --git a/civicrm/CRM/Utils/System/Drupal6.php b/civicrm/CRM/Utils/System/Drupal6.php
index cca991289e..0ac291164e 100644
--- a/civicrm/CRM/Utils/System/Drupal6.php
+++ b/civicrm/CRM/Utils/System/Drupal6.php
@@ -165,8 +165,8 @@ class CRM_Utils_System_Drupal6 extends CRM_Utils_System_DrupalBase {
     $user = NULL;
 
     if (!empty($row)) {
-      $dbName = CRM_Utils_Array::value('name', $row);
-      $dbEmail = CRM_Utils_Array::value('mail', $row);
+      $dbName = $row['name'] ?? NULL;
+      $dbEmail = $row['mail'] ?? NULL;
       if (strtolower($dbName) == strtolower($name)) {
         $errors['cms_name'] = ts('The username %1 is already taken. Please select another username.',
           [1 => $name]
@@ -460,7 +460,7 @@ class CRM_Utils_System_Drupal6 extends CRM_Utils_System_DrupalBase {
     }
     global $user;
     // If $uid is passed in, authentication has been done already.
-    $uid = CRM_Utils_Array::value('uid', $params);
+    $uid = $params['uid'] ?? NULL;
     if (!$uid) {
       //load user, we need to check drupal permissions.
       $name = CRM_Utils_Array::value('name', $params, FALSE) ? $params['name'] : trim(CRM_Utils_Array::value('name', $_REQUEST));
@@ -687,7 +687,7 @@ class CRM_Utils_System_Drupal6 extends CRM_Utils_System_DrupalBase {
     $result = [];
     $q = db_query('SELECT name, status FROM {system} WHERE type = \'module\' AND schema_version <> -1');
     while ($row = db_fetch_object($q)) {
-      $result[] = new CRM_Core_Module('drupal.' . $row->name, ($row->status == 1) ? TRUE : FALSE);
+      $result[] = new CRM_Core_Module('drupal.' . $row->name, $row->status == 1);
     }
     return $result;
   }
diff --git a/civicrm/CRM/Utils/System/Drupal8.php b/civicrm/CRM/Utils/System/Drupal8.php
index 072e012270..49d39ca6d7 100644
--- a/civicrm/CRM/Utils/System/Drupal8.php
+++ b/civicrm/CRM/Utils/System/Drupal8.php
@@ -541,7 +541,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     foreach ($module_data as $module_name => $extension) {
       if (!isset($extension->info['hidden']) && $extension->origin != 'core') {
         $extension->schema_version = drupal_get_installed_schema_version($module_name);
-        $modules[] = new CRM_Core_Module('drupal.' . $module_name, ($extension->status == 1 ? TRUE : FALSE));
+        $modules[] = new CRM_Core_Module('drupal.' . $module_name, ($extension->status == 1));
       }
     }
     return $modules;
diff --git a/civicrm/CRM/Utils/System/DrupalBase.php b/civicrm/CRM/Utils/System/DrupalBase.php
index 380a9f07d9..a9c72b07db 100644
--- a/civicrm/CRM/Utils/System/DrupalBase.php
+++ b/civicrm/CRM/Utils/System/DrupalBase.php
@@ -294,7 +294,7 @@ abstract class CRM_Utils_System_DrupalBase extends CRM_Utils_System_Base {
     $result = [];
     $q = db_query('SELECT name, status FROM {system} WHERE type = \'module\' AND schema_version <> -1');
     foreach ($q as $row) {
-      $result[] = new CRM_Core_Module('drupal.' . $row->name, ($row->status == 1) ? TRUE : FALSE);
+      $result[] = new CRM_Core_Module('drupal.' . $row->name, $row->status == 1);
     }
     return $result;
   }
@@ -659,10 +659,7 @@ abstract class CRM_Utils_System_DrupalBase extends CRM_Utils_System_Base {
 
     // Get the menu for above URL.
     $item = CRM_Core_Menu::get($path);
-    if (!empty(CRM_Utils_Array::value('is_public', $item))) {
-      return TRUE;
-    }
-    return FALSE;
+    return !empty($item['is_public']);
   }
 
   /**
diff --git a/civicrm/CRM/Utils/System/Joomla.php b/civicrm/CRM/Utils/System/Joomla.php
index 380fb3774b..bea96efdaf 100644
--- a/civicrm/CRM/Utils/System/Joomla.php
+++ b/civicrm/CRM/Utils/System/Joomla.php
@@ -133,8 +133,8 @@ class CRM_Utils_System_Joomla extends CRM_Utils_System_Base {
     }
 
     if (!empty($row)) {
-      $dbName = CRM_Utils_Array::value('username', $row);
-      $dbEmail = CRM_Utils_Array::value('email', $row);
+      $dbName = $row['username'] ?? NULL;
+      $dbEmail = $row['email'] ?? NULL;
       if (strtolower($dbName) == strtolower($name)) {
         $errors['cms_name'] = ts('The username %1 is already taken. Please select another username.',
           [1 => $name]
@@ -606,7 +606,7 @@ class CRM_Utils_System_Joomla extends CRM_Utils_System_Base {
    */
   public function isUserLoggedIn() {
     $user = JFactory::getUser();
-    return ($user->guest) ? FALSE : TRUE;
+    return !$user->guest;
   }
 
   /**
@@ -693,7 +693,7 @@ class CRM_Utils_System_Joomla extends CRM_Utils_System_Base {
     foreach ($plugins as $plugin) {
       // question: is the folder really a critical part of the plugin's name?
       $name = implode('.', ['joomla', $plugin['type'], $plugin['folder'], $plugin['element']]);
-      $result[] = new CRM_Core_Module($name, $plugin['enabled'] ? TRUE : FALSE);
+      $result[] = new CRM_Core_Module($name, !empty($plugin['enabled']));
     }
 
     return $result;
diff --git a/civicrm/CRM/Utils/System/WordPress.php b/civicrm/CRM/Utils/System/WordPress.php
index 80cb3692af..be0beebbc8 100644
--- a/civicrm/CRM/Utils/System/WordPress.php
+++ b/civicrm/CRM/Utils/System/WordPress.php
@@ -409,63 +409,22 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base {
    * @inheritDoc
    */
   public function getUFLocale() {
-    // Bail early if method is called when WordPress isn't bootstrapped.
-    // Additionally, the function checked here is located in pluggable.php
-    // and is required by wp_get_referer() - so this also bails early if it is
-    // called too early in the request lifecycle.
-    // @see https://core.trac.wordpress.org/ticket/25294
-    if (!function_exists('wp_validate_redirect')) {
-      return NULL;
+    // Polylang plugin
+    if (function_exists('pll_current_language')) {
+      $language = pll_current_language();
     }
-
-    // Default to WordPress User locale.
-    $locale = get_user_locale();
-
-    // Is this a "back-end" AJAX call?
-    $is_backend = FALSE;
-    if (wp_doing_ajax() && FALSE !== strpos(wp_get_referer(), admin_url())) {
-      $is_backend = TRUE;
+    // WPML plugin
+    elseif (defined('ICL_LANGUAGE_CODE')) {
+      $language = ICL_LANGUAGE_CODE;
     }
-
-    // Ignore when in WordPress admin or it's a "back-end" AJAX call.
-    if (!(is_admin() || $is_backend)) {
-
-      // Reaching here means it is very likely to be a front-end context.
-
-      // Default to WordPress locale.
-      $locale = get_locale();
-
-      // Maybe override with the locale that Polylang reports.
-      if (function_exists('pll_current_language')) {
-        $pll_locale = pll_current_language('locale');
-        if (!empty($pll_locale)) {
-          $locale = $pll_locale;
-        }
-      }
-
-      // Maybe override with the locale that WPML reports.
-      elseif (defined('ICL_LANGUAGE_CODE')) {
-        $languages = apply_filters('wpml_active_languages', NULL);
-        foreach ($languages as $language) {
-          if ($language['active']) {
-            $locale = $language['default_locale'];
-            break;
-          }
-        }
-      }
-
-      // TODO: Set locale for other WordPress plugins.
-      // @see https://wordpress.org/plugins/tags/multilingual/
-      // A hook would be nice here.
-
+    // Wordpress "standard" single language mode
+    // We still have to check if the function exists as it may not during bootstrap
+    elseif (function_exists('get_locale')) {
+      $language = get_locale();
     }
 
-    if (!empty($locale)) {
-      // If for some reason only we get a language code, convert it to a locale.
-      if (2 === strlen($locale)) {
-        $locale = CRM_Core_I18n_PseudoConstant::longForShort($locale);
-      }
-      return $locale;
+    if (!empty($language)) {
+      return CRM_Core_I18n_PseudoConstant::longForShort(substr($language, 0, 2));
     }
     else {
       return NULL;
@@ -497,8 +456,8 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base {
   public function loadBootStrap($params = [], $loadUser = TRUE, $throwError = TRUE, $realPath = NULL) {
     global $wp, $wp_rewrite, $wp_the_query, $wp_query, $wpdb, $current_site, $current_blog, $current_user;
 
-    $name = CRM_Utils_Array::value('name', $params);
-    $pass = CRM_Utils_Array::value('pass', $params);
+    $name = $params['name'] ?? NULL;
+    $pass = $params['pass'] ?? NULL;
 
     if (!defined('WP_USE_THEMES')) {
       define('WP_USE_THEMES', FALSE);
@@ -524,7 +483,7 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base {
       CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone();
     }
     require_once $cmsRootPath . DIRECTORY_SEPARATOR . 'wp-includes/pluggable.php';
-    $uid = CRM_Utils_Array::value('uid', $params);
+    $uid = $params['uid'] ?? NULL;
     if (!$uid) {
       $name = $name ? $name : trim(CRM_Utils_Array::value('name', $_REQUEST));
       $pass = $pass ? $pass : trim(CRM_Utils_Array::value('pass', $_REQUEST));
@@ -764,7 +723,7 @@ class CRM_Utils_System_WordPress extends CRM_Utils_System_Base {
   public function getLoggedInUfID() {
     $ufID = NULL;
     $current_user = $this->getLoggedInUserObject();
-    return isset($current_user->ID) ? $current_user->ID : NULL;
+    return $current_user->ID ?? NULL;
   }
 
   /**
diff --git a/civicrm/CRM/Utils/Token.php b/civicrm/CRM/Utils/Token.php
index 156f87a279..6dd024553f 100644
--- a/civicrm/CRM/Utils/Token.php
+++ b/civicrm/CRM/Utils/Token.php
@@ -601,10 +601,10 @@ class CRM_Utils_Token {
       $value = "{action.$token}";
     }
     else {
-      $value = CRM_Utils_Array::value($token, $addresses);
+      $value = $addresses[$token] ?? NULL;
 
       if ($value == NULL) {
-        $value = CRM_Utils_Array::value($token, $urls);
+        $value = $urls[$token] ?? NULL;
       }
 
       if ($value && $html) {
@@ -722,7 +722,7 @@ class CRM_Utils_Token {
       $noReplace = TRUE;
     }
     elseif ($token == 'checksum') {
-      $hash = CRM_Utils_Array::value('hash', $contact);
+      $hash = $contact['hash'] ?? NULL;
       $contactID = CRM_Utils_Array::retrieveValueRecursive($contact, 'contact_id');
       $cs = CRM_Contact_BAO_Contact_Utils::generateChecksum($contactID,
         NULL,
@@ -844,7 +844,7 @@ class CRM_Utils_Token {
     $html = FALSE,
     $escapeSmarty = FALSE
   ) {
-    $value = CRM_Utils_Array::value("{$category}.{$token}", $contact);
+    $value = $contact["{$category}.{$token}"] ?? NULL;
 
     if ($value && !$html) {
       $value = str_replace('&amp;', '&', $value);
@@ -1641,7 +1641,7 @@ class CRM_Utils_Token {
     }
     $field = civicrm_api3($entity, 'getfield', ['action' => 'get', 'name' => $token, 'get_options' => 'get']);
     $field = $field['values'];
-    $fieldType = CRM_Utils_Array::value('type', $field);
+    $fieldType = $field['type'] ?? NULL;
     // Boolean fields
     if ($fieldType == CRM_Utils_Type::T_BOOLEAN && empty($field['options'])) {
       $field['options'] = [ts('No'), ts('Yes')];
diff --git a/civicrm/CRM/Utils/Verp.php b/civicrm/CRM/Utils/Verp.php
index 91bca0d282..133a8bde38 100644
--- a/civicrm/CRM/Utils/Verp.php
+++ b/civicrm/CRM/Utils/Verp.php
@@ -64,8 +64,8 @@ class CRM_Utils_Verp {
     $sdomain = $match[2];
 
     preg_match('/(.+)\@([^\@]+)$/', $recipient, $match);
-    $rlocal = CRM_Utils_Array::value(1, $match);
-    $rdomain = CRM_Utils_Array::value(2, $match);
+    $rlocal = $match[1] ?? NULL;
+    $rdomain = $match[2] ?? NULL;
 
     foreach (self::$encodeMap as $char => $code) {
       $rlocal = preg_replace('/' . preg_quote($char) . '/i', "+$code", $rlocal);
diff --git a/civicrm/CRM/Utils/VersionCheck.php b/civicrm/CRM/Utils/VersionCheck.php
index 18fb15511c..0b3b9fa460 100644
--- a/civicrm/CRM/Utils/VersionCheck.php
+++ b/civicrm/CRM/Utils/VersionCheck.php
@@ -237,7 +237,7 @@ class CRM_Utils_VersionCheck {
       $this->stats['extensions'][] = [
         'name' => $dao->full_name,
         'enabled' => $dao->is_active,
-        'version' => isset($info->version) ? $info->version : NULL,
+        'version' => $info->version ?? NULL,
       ];
     }
   }
diff --git a/civicrm/CRM/Utils/Wrapper.php b/civicrm/CRM/Utils/Wrapper.php
index 4c3a41c680..5efe9a89b6 100644
--- a/civicrm/CRM/Utils/Wrapper.php
+++ b/civicrm/CRM/Utils/Wrapper.php
@@ -46,7 +46,7 @@ class CRM_Utils_Wrapper {
    */
   public function run($formName, $formLabel = NULL, $arguments = NULL) {
     if (is_array($arguments)) {
-      $mode = CRM_Utils_Array::value('mode', $arguments);
+      $mode = $arguments['mode'] ?? NULL;
       $imageUpload = !empty($arguments['imageUpload']);
       $addSequence = !empty($arguments['addSequence']);
       $attachUpload = !empty($arguments['attachUpload']);
@@ -71,10 +71,10 @@ class CRM_Utils_Wrapper {
     if (array_key_exists('urlToSession', $arguments)) {
       if (is_array($arguments['urlToSession'])) {
         foreach ($arguments['urlToSession'] as $params) {
-          $urlVar = CRM_Utils_Array::value('urlVar', $params);
-          $sessionVar = CRM_Utils_Array::value('sessionVar', $params);
-          $type = CRM_Utils_Array::value('type', $params);
-          $default = CRM_Utils_Array::value('default', $params);
+          $urlVar = $params['urlVar'] ?? NULL;
+          $sessionVar = $params['sessionVar'] ?? NULL;
+          $type = $params['type'] ?? NULL;
+          $default = $params['default'] ?? NULL;
           $abort = CRM_Utils_Array::value('abort', $params, FALSE);
 
           $value = NULL;
diff --git a/civicrm/Civi/API/Kernel.php b/civicrm/Civi/API/Kernel.php
index 188e2c3acb..13e55c3445 100644
--- a/civicrm/Civi/API/Kernel.php
+++ b/civicrm/Civi/API/Kernel.php
@@ -325,8 +325,8 @@ class Kernel {
    */
   public function formatApiException($e, $apiRequest) {
     $data = $e->getExtraParams();
-    $data['entity'] = \CRM_Utils_Array::value('entity', $apiRequest);
-    $data['action'] = \CRM_Utils_Array::value('action', $apiRequest);
+    $data['entity'] = $apiRequest['entity'] ?? NULL;
+    $data['action'] = $apiRequest['action'] ?? NULL;
 
     if (\CRM_Utils_Array::value('debug', \CRM_Utils_Array::value('params', $apiRequest))
       // prevent recursion
diff --git a/civicrm/Civi/API/Provider/ReflectionProvider.php b/civicrm/Civi/API/Provider/ReflectionProvider.php
index 514b846931..87b95bb18b 100644
--- a/civicrm/Civi/API/Provider/ReflectionProvider.php
+++ b/civicrm/Civi/API/Provider/ReflectionProvider.php
@@ -134,7 +134,7 @@ class ReflectionProvider implements EventSubscriberInterface, ProviderInterface
    */
   public function getActionNames($version, $entity) {
     $entity = _civicrm_api_get_camel_name($entity, $version);
-    return isset($this->actions[$entity]) ? $this->actions[$entity] : $this->actions['*'];
+    return $this->actions[$entity] ?? $this->actions['*'];
   }
 
 }
diff --git a/civicrm/Civi/API/SelectQuery.php b/civicrm/Civi/API/SelectQuery.php
index d7c6d3f127..92e09ad8d1 100644
--- a/civicrm/Civi/API/SelectQuery.php
+++ b/civicrm/Civi/API/SelectQuery.php
@@ -85,7 +85,7 @@ abstract class SelectQuery {
     $baoName = _civicrm_api3_get_BAO($entity);
     $bao = new $baoName();
 
-    $this->entityFieldNames = _civicrm_api3_field_names(_civicrm_api3_build_fields_array($bao));
+    $this->entityFieldNames = array_column($baoName::fields(), 'name');
     $this->apiFieldSpec = $this->getFields();
 
     $this->query = \CRM_Utils_SQL_Select::from($bao->tableName() . ' ' . self::MAIN_TABLE_ALIAS);
@@ -210,7 +210,7 @@ abstract class SelectQuery {
       if (!isset($fkField['FKApiSpec'])) {
         $fkField['FKApiSpec'] = \_civicrm_api_get_fields($fkField['FKApiName']);
       }
-      $fieldInfo = \CRM_Utils_Array::value($fieldName, $fkField['FKApiSpec']);
+      $fieldInfo = $fkField['FKApiSpec'][$fieldName] ?? NULL;
 
       $keyColumn = \CRM_Utils_Array::value('FKKeyColumn', $fkField, 'id');
       if (!$fieldInfo || !isset($fkField['FKApiSpec'][$keyColumn])) {
@@ -259,7 +259,7 @@ abstract class SelectQuery {
   protected function getJoinInfo(&$fkField, $stack) {
     if ($fkField['name'] == 'entity_id') {
       $entityTableParam = substr(implode('.', $stack), 0, -2) . 'table';
-      $entityTable = \CRM_Utils_Array::value($entityTableParam, $this->where);
+      $entityTable = $this->where[$entityTableParam] ?? NULL;
       if ($entityTable && is_string($entityTable) && \CRM_Core_DAO_AllCoreTables::getClassForTable($entityTable)) {
         $fkField['FKClassName'] = \CRM_Core_DAO_AllCoreTables::getClassForTable($entityTable);
         $fkField['FKApiName'] = \CRM_Core_DAO_AllCoreTables::getBriefName($fkField['FKClassName']);
diff --git a/civicrm/Civi/API/Subscriber/ChainSubscriber.php b/civicrm/Civi/API/Subscriber/ChainSubscriber.php
index 37c8688a4c..8834495633 100644
--- a/civicrm/Civi/API/Subscriber/ChainSubscriber.php
+++ b/civicrm/Civi/API/Subscriber/ChainSubscriber.php
@@ -54,7 +54,7 @@ class ChainSubscriber implements EventSubscriberInterface {
     $apiRequest = $event->getApiRequest();
     if ($apiRequest['version'] < 4) {
       $result = $event->getResponse();
-      if (\CRM_Utils_Array::value('is_error', $result, 0) == 0) {
+      if (is_array($result) && empty($result['is_error'])) {
         $this->callNestedApi($event->getApiKernel(), $apiRequest['params'], $result, $apiRequest['action'], $apiRequest['entity'], $apiRequest['version']);
         $event->setResponse($result);
       }
@@ -106,7 +106,7 @@ class ChainSubscriber implements EventSubscriberInterface {
 
         $subaction = empty($subAPI[2]) ? $action : $subAPI[2];
         $subParams = [
-          'debug' => \CRM_Utils_Array::value('debug', $params),
+          'debug' => $params['debug'] ?? NULL,
         ];
         $subEntity = _civicrm_api_get_entity_name_from_camel($subAPI[1]);
 
diff --git a/civicrm/Civi/API/Subscriber/I18nSubscriber.php b/civicrm/Civi/API/Subscriber/I18nSubscriber.php
index cad932dd4e..f89964c0b2 100644
--- a/civicrm/Civi/API/Subscriber/I18nSubscriber.php
+++ b/civicrm/Civi/API/Subscriber/I18nSubscriber.php
@@ -50,10 +50,10 @@ class I18nSubscriber implements EventSubscriberInterface {
 
     $params = $apiRequest['params'];
     if ($apiRequest['version'] < 4) {
-      $language = !empty($params['options']['language']) ? $params['options']['language'] : \CRM_Utils_Array::value('option.language', $params);
+      $language = $params['options']['language'] ?? $params['option.language'] ?? NULL;
     }
     else {
-      $language = \CRM_Utils_Array::value('language', $params);
+      $language = $params['language'] ?? NULL;
     }
     if ($language) {
       $this->setLocale($language, $apiRequest['id']);
diff --git a/civicrm/Civi/Angular/AngularLoader.php b/civicrm/Civi/Angular/AngularLoader.php
index f74479fb46..58e6998700 100644
--- a/civicrm/Civi/Angular/AngularLoader.php
+++ b/civicrm/Civi/Angular/AngularLoader.php
@@ -73,7 +73,7 @@ class AngularLoader {
     $this->res = \CRM_Core_Resources::singleton();
     $this->angular = \Civi::service('angular');
     $this->region = \CRM_Utils_Request::retrieve('snippet', 'String') ? 'ajax-snippet' : 'html-header';
-    $this->pageName = isset($_GET['q']) ? $_GET['q'] : NULL;
+    $this->pageName = $_GET['q'] ?? NULL;
     $this->modules = [];
   }
 
diff --git a/civicrm/Civi/Angular/Page/Modules.php b/civicrm/Civi/Angular/Page/Modules.php
index aa3655b8c7..96d78867c4 100644
--- a/civicrm/Civi/Angular/Page/Modules.php
+++ b/civicrm/Civi/Angular/Page/Modules.php
@@ -77,19 +77,19 @@ class Modules extends \CRM_Core_Page {
 
     switch ($event->asset) {
       case 'angular-modules.json':
-        $moduleNames = $page->parseModuleNames(\CRM_Utils_Array::value('modules', $event->params), $angular);
+        $moduleNames = $page->parseModuleNames($event->params['modules'] ?? NULL, $angular);
         $event->mimeType = 'application/json';
         $event->content = json_encode($page->getMetadata($moduleNames, $angular));
         break;
 
       case 'angular-modules.js':
-        $moduleNames = $page->parseModuleNames(\CRM_Utils_Array::value('modules', $event->params), $angular);
+        $moduleNames = $page->parseModuleNames($event->params['modules'] ?? NULL, $angular);
         $event->mimeType = 'application/javascript';
         $event->content = $page->digestJs($angular->getResources($moduleNames, 'js', 'path'));
         break;
 
       case 'angular-modules.css':
-        $moduleNames = $page->parseModuleNames(\CRM_Utils_Array::value('modules', $event->params), $angular);
+        $moduleNames = $page->parseModuleNames($event->params['modules'] ?? NULL, $angular);
         $event->mimeType = 'text/css';
         $event->content = \CRM_Utils_File::concat($angular->getResources($moduleNames, 'css', 'path'), "\n");
 
diff --git a/civicrm/Civi/Api4/Dashboard.php b/civicrm/Civi/Api4/Dashboard.php
new file mode 100644
index 0000000000..5b406dac07
--- /dev/null
+++ b/civicrm/Civi/Api4/Dashboard.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ * $Id$
+ *
+ */
+
+namespace Civi\Api4;
+
+/**
+ * Dashboard entity.
+ *
+ * A "dashboard" record represents an item that can be displayed on a user's home screen.
+ * E.g. the "News" or "Getting Started" dashboard items.
+ *
+ * Dashboards can also be created from CiviReports, and some extensions provide dashboards as well.
+ * Displaying an item to a user is done with the `DashboardContact` entity.
+ *
+ * @see \Civi\Api4\DashboardContact
+ * @package Civi\Api4
+ */
+class Dashboard extends Generic\DAOEntity {
+
+}
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/UFMatchCreationSpecProvider.php b/civicrm/Civi/Api4/DashboardContact.php
similarity index 58%
rename from civicrm/Civi/Api4/Service/Spec/Provider/UFMatchCreationSpecProvider.php
rename to civicrm/Civi/Api4/DashboardContact.php
index 2ed93e4141..d652a1359f 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/UFMatchCreationSpecProvider.php
+++ b/civicrm/Civi/Api4/DashboardContact.php
@@ -18,25 +18,16 @@
  *
  */
 
+namespace Civi\Api4;
 
-namespace Civi\Api4\Service\Spec\Provider;
-
-use Civi\Api4\Service\Spec\RequestSpec;
-
-class UFMatchCreationSpecProvider implements Generic\SpecProviderInterface {
-
-  /**
-   * @inheritDoc
-   */
-  public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('domain_id')->setRequired(FALSE);
-  }
-
-  /**
-   * @inheritDoc
-   */
-  public function applies($entity, $action) {
-    return $entity === 'UFMatch' && $action === 'create';
-  }
+/**
+ * DashboardContact entity.
+ *
+ * This places a dashboard item on a user's home screen.
+ *
+ * @see \Civi\Api4\Dashboard
+ * @package Civi\Api4
+ */
+class DashboardContact extends Generic\DAOEntity {
 
 }
diff --git a/civicrm/Civi/Api4/Event/Subscriber/PostSelectQuerySubscriber.php b/civicrm/Civi/Api4/Event/Subscriber/PostSelectQuerySubscriber.php
index 84dbca9e79..e21c2dd381 100644
--- a/civicrm/Civi/Api4/Event/Subscriber/PostSelectQuerySubscriber.php
+++ b/civicrm/Civi/Api4/Event/Subscriber/PostSelectQuerySubscriber.php
@@ -110,11 +110,10 @@ class PostSelectQuerySubscriber implements EventSubscriberInterface {
    * @return array
    */
   private function getNtoManyJoinSelects(Api4SelectQuery $query) {
-    $fkAliases = $query->getFkSelectAliases();
     $joinedDotSelects = array_filter(
       $query->getSelect(),
-      function ($select) use ($fkAliases, $query) {
-        return isset($fkAliases[$select]) && array_filter($query->getPathJoinTypes($select));
+      function ($select) use ($query) {
+        return strpos($select, '.') && array_filter($query->getPathJoinTypes($select));
       }
     );
 
@@ -211,7 +210,7 @@ class PostSelectQuerySubscriber implements EventSubscriberInterface {
     $selectFields = [];
 
     foreach ($selects as $select) {
-      $selectAlias = $query->getFkSelectAliases()[$select];
+      $selectAlias = str_replace('`', '', $query->getField($select)['sql_name']);
       $fieldAlias = substr($select, strrpos($select, '.') + 1);
       $selectFields[$fieldAlias] = $selectAlias;
     }
diff --git a/civicrm/Civi/Api4/Generic/AbstractCreateAction.php b/civicrm/Civi/Api4/Generic/AbstractCreateAction.php
index ea9d3cdb9d..4b0002ede7 100644
--- a/civicrm/Civi/Api4/Generic/AbstractCreateAction.php
+++ b/civicrm/Civi/Api4/Generic/AbstractCreateAction.php
@@ -43,7 +43,7 @@ abstract class AbstractCreateAction extends AbstractAction {
    * @return mixed|null
    */
   public function getValue(string $fieldName) {
-    return isset($this->values[$fieldName]) ? $this->values[$fieldName] : NULL;
+    return $this->values[$fieldName] ?? NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Api4/Generic/AbstractGetAction.php b/civicrm/Civi/Api4/Generic/AbstractGetAction.php
index e9f892c2af..d82e7071b1 100644
--- a/civicrm/Civi/Api4/Generic/AbstractGetAction.php
+++ b/civicrm/Civi/Api4/Generic/AbstractGetAction.php
@@ -80,12 +80,15 @@ abstract class AbstractGetAction extends AbstractQueryAction {
    * @throws \API_Exception
    */
   protected function expandSelectClauseWildcards() {
-    foreach ($this->select as $item) {
-      if (strpos($item, '*') !== FALSE && strpos($item, '.') === FALSE) {
-        $this->select = array_diff($this->select, [$item]);
-        $this->select = array_unique(array_merge($this->select, SelectUtil::getMatchingFields($item, array_column($this->entityFields(), 'name'))));
-      }
+    $wildFields = array_filter($this->select, function($item) {
+      return strpos($item, '*') !== FALSE && strpos($item, '.') === FALSE;
+    });
+    foreach ($wildFields as $item) {
+      $pos = array_search($item, array_values($this->select));
+      $matches = SelectUtil::getMatchingFields($item, array_column($this->entityFields(), 'name'));
+      array_splice($this->select, $pos, 1, $matches);
     }
+    $this->select = array_unique($this->select);
   }
 
   /**
diff --git a/civicrm/Civi/Api4/Generic/AbstractUpdateAction.php b/civicrm/Civi/Api4/Generic/AbstractUpdateAction.php
index 93940e1976..aa1aa0d46c 100644
--- a/civicrm/Civi/Api4/Generic/AbstractUpdateAction.php
+++ b/civicrm/Civi/Api4/Generic/AbstractUpdateAction.php
@@ -57,7 +57,7 @@ abstract class AbstractUpdateAction extends AbstractBatchAction {
    * @return mixed|null
    */
   public function getValue(string $fieldName) {
-    return isset($this->values[$fieldName]) ? $this->values[$fieldName] : NULL;
+    return $this->values[$fieldName] ?? NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Api4/Generic/DAODeleteAction.php b/civicrm/Civi/Api4/Generic/DAODeleteAction.php
index 3e0135f899..666e702993 100644
--- a/civicrm/Civi/Api4/Generic/DAODeleteAction.php
+++ b/civicrm/Civi/Api4/Generic/DAODeleteAction.php
@@ -38,7 +38,7 @@ class DAODeleteAction extends AbstractBatchAction {
       throw new \API_Exception('Cannot delete ' . $this->getEntityName() . ' with no "where" parameter specified');
     }
 
-    $items = $this->getObjects();
+    $items = $this->getBatchRecords();
     if ($items) {
       $result->exchangeArray($this->deleteObjects($items));
     }
@@ -54,8 +54,9 @@ class DAODeleteAction extends AbstractBatchAction {
     $baoName = $this->getBaoName();
 
     if ($this->getCheckPermissions()) {
-      foreach ($items as $item) {
-        $this->checkContactPermissions($baoName, $item);
+      foreach (array_keys($items) as $key) {
+        $items[$key]['check_permissions'] = TRUE;
+        $this->checkContactPermissions($baoName, $items[$key]);
       }
     }
 
@@ -73,16 +74,8 @@ class DAODeleteAction extends AbstractBatchAction {
     }
     else {
       foreach ($items as $item) {
-        $bao = new $baoName();
-        $bao->id = $item['id'];
-        // delete it
-        $action_result = $bao->delete();
-        if ($action_result) {
-          $ids[] = ['id' => $item['id']];
-        }
-        else {
-          throw new \API_Exception("Could not delete {$this->getEntityName()} id {$item['id']}");
-        }
+        $baoName::deleteRecord($item);
+        $ids[] = ['id' => $item['id']];
       }
     }
     return $ids;
diff --git a/civicrm/Civi/Api4/Generic/DAOGetAction.php b/civicrm/Civi/Api4/Generic/DAOGetAction.php
index c7472969f4..100173d962 100644
--- a/civicrm/Civi/Api4/Generic/DAOGetAction.php
+++ b/civicrm/Civi/Api4/Generic/DAOGetAction.php
@@ -21,6 +21,8 @@
 
 namespace Civi\Api4\Generic;
 
+use Civi\Api4\Query\Api4SelectQuery;
+
 /**
  * Retrieve $ENTITIES based on criteria specified in the `where` parameter.
  *
@@ -48,4 +50,17 @@ class DAOGetAction extends AbstractGetAction {
     $result->exchangeArray($this->getObjects());
   }
 
+  /**
+   * @return array|int
+   */
+  protected function getObjects() {
+    $query = new Api4SelectQuery($this);
+
+    $result = $query->run();
+    if (is_array($result)) {
+      \CRM_Utils_API_HTMLInputCoder::singleton()->decodeRows($result);
+    }
+    return $result;
+  }
+
 }
diff --git a/civicrm/Civi/Api4/Generic/DAOUpdateAction.php b/civicrm/Civi/Api4/Generic/DAOUpdateAction.php
index b2768ee4d1..5fe1cda280 100644
--- a/civicrm/Civi/Api4/Generic/DAOUpdateAction.php
+++ b/civicrm/Civi/Api4/Generic/DAOUpdateAction.php
@@ -66,7 +66,7 @@ class DAOUpdateAction extends AbstractUpdateAction {
     }
 
     // Batch update 1 or more records based on WHERE clause
-    $items = $this->getObjects();
+    $items = $this->getBatchRecords();
     foreach ($items as &$item) {
       $item = $this->values + $item;
     }
diff --git a/civicrm/Civi/Api4/Generic/Result.php b/civicrm/Civi/Api4/Generic/Result.php
index fa6561a330..675b752e70 100644
--- a/civicrm/Civi/Api4/Generic/Result.php
+++ b/civicrm/Civi/Api4/Generic/Result.php
@@ -22,7 +22,7 @@ namespace Civi\Api4\Generic;
  *       For example, BasicReplaceAction returns ReplaceResult which includes the additional $deleted property to list any items deleted by the operation.
  *  3. Provide convenience methods like `$result->first()` and `$result->indexBy($field)`.
  */
-class Result extends \ArrayObject {
+class Result extends \ArrayObject implements \JsonSerializable {
   /**
    * @var string
    */
@@ -124,4 +124,11 @@ class Result extends \ArrayObject {
     return array_column($this->getArrayCopy(), $name, $this->indexedBy);
   }
 
+  /**
+   * @return array
+   */
+  public function jsonSerialize() {
+    return $this->getArrayCopy();
+  }
+
 }
diff --git a/civicrm/Civi/Api4/Generic/Traits/ArrayQueryActionTrait.php b/civicrm/Civi/Api4/Generic/Traits/ArrayQueryActionTrait.php
index 51491e9e8e..baddfe1a09 100644
--- a/civicrm/Civi/Api4/Generic/Traits/ArrayQueryActionTrait.php
+++ b/civicrm/Civi/Api4/Generic/Traits/ArrayQueryActionTrait.php
@@ -108,9 +108,9 @@ trait ArrayQueryActionTrait {
     if (!is_array($condition)) {
       throw new NotImplementedException('Unexpected where syntax; expecting array.');
     }
-    $value = isset($row[$condition[0]]) ? $row[$condition[0]] : NULL;
+    $value = $row[$condition[0]] ?? NULL;
     $operator = $condition[1];
-    $expected = isset($condition[2]) ? $condition[2] : NULL;
+    $expected = $condition[2] ?? NULL;
     switch ($operator) {
       case '=':
       case '!=':
diff --git a/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php b/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php
index fc4fe9d262..b8cb994feb 100644
--- a/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php
+++ b/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php
@@ -21,7 +21,6 @@
 namespace Civi\Api4\Generic\Traits;
 
 use Civi\Api4\Utils\FormattingUtil;
-use Civi\Api4\Query\Api4SelectQuery;
 
 /**
  * @method string getLanguage()
@@ -79,26 +78,6 @@ trait DAOActionTrait {
     return $values;
   }
 
-  /**
-   * @return array|int
-   */
-  protected function getObjects() {
-    $query = new Api4SelectQuery($this->getEntityName(), $this->getCheckPermissions(), $this->entityFields());
-    $query->select = $this->getSelect();
-    $query->where = $this->getWhere();
-    $query->orderBy = $this->getOrderBy();
-    $query->limit = $this->getLimit();
-    $query->offset = $this->getOffset();
-    if ($this->getDebug()) {
-      $query->debugOutput =& $this->_debugOutput;
-    }
-    $result = $query->run();
-    if (is_array($result)) {
-      \CRM_Utils_API_HTMLInputCoder::singleton()->decodeRows($result);
-    }
-    return $result;
-  }
-
   /**
    * Fill field defaults which were declared by the api.
    *
@@ -166,7 +145,7 @@ trait DAOActionTrait {
         $createResult = $baoName::$method($item);
       }
       else {
-        $createResult = $this->genericCreateMethod($item);
+        $createResult = $baoName::writeRecord($item);
       }
 
       if (!$createResult) {
@@ -180,26 +159,6 @@ trait DAOActionTrait {
     return $result;
   }
 
-  /**
-   * Fallback when a BAO does not contain create or add functions
-   *
-   * @param $params
-   * @return mixed
-   */
-  private function genericCreateMethod($params) {
-    $baoName = $this->getBaoName();
-    $hook = empty($params['id']) ? 'create' : 'edit';
-
-    \CRM_Utils_Hook::pre($hook, $this->getEntityName(), $params['id'] ?? NULL, $params);
-    /** @var \CRM_Core_DAO $instance */
-    $instance = new $baoName();
-    $instance->copyValues($params);
-    $instance->save();
-    \CRM_Utils_Hook::post($hook, $this->getEntityName(), $instance->id, $instance);
-
-    return $instance;
-  }
-
   /**
    * @param array $params
    * @param int $entityId
@@ -281,7 +240,7 @@ trait DAOActionTrait {
     else {
       // Fixme: decouple from v3
       require_once 'api/v3/utils.php';
-      _civicrm_api3_check_edit_permissions($baoName, ['check_permissions' => 1] + $item);
+      _civicrm_api3_check_edit_permissions($baoName, $item);
     }
   }
 
diff --git a/civicrm/Civi/Api4/Query/Api4SelectQuery.php b/civicrm/Civi/Api4/Query/Api4SelectQuery.php
index 1291726b87..de08a7b152 100644
--- a/civicrm/Civi/Api4/Query/Api4SelectQuery.php
+++ b/civicrm/Civi/Api4/Query/Api4SelectQuery.php
@@ -20,7 +20,6 @@ use Civi\Api4\Utils\FormattingUtil;
 use Civi\Api4\Utils\CoreUtil;
 use Civi\Api4\Utils\SelectUtil;
 use CRM_Core_DAO_AllCoreTables as AllCoreTables;
-use CRM_Utils_Array as UtilsArray;
 
 /**
  * A query `node` may be in one of three formats:
@@ -62,22 +61,27 @@ class Api4SelectQuery extends SelectQuery {
   public $debugOutput = NULL;
 
   /**
-   * @param string $entity
-   * @param bool $checkPermissions
-   * @param array $fields
+   * @param \Civi\Api4\Generic\DAOGetAction $apiGet
    */
-  public function __construct($entity, $checkPermissions, $fields) {
-    require_once 'api/v3/utils.php';
-    $this->entity = $entity;
-    $this->checkPermissions = $checkPermissions;
-
-    $baoName = CoreUtil::getBAOFromApiName($entity);
-    $bao = new $baoName();
-
-    $this->entityFieldNames = _civicrm_api3_field_names(_civicrm_api3_build_fields_array($bao));
-    $this->apiFieldSpec = (array) $fields;
+  public function __construct($apiGet) {
+    $this->entity = $apiGet->getEntityName();
+    $this->checkPermissions = $apiGet->getCheckPermissions();
+    $this->select = $apiGet->getSelect();
+    $this->where = $apiGet->getWhere();
+    $this->orderBy = $apiGet->getOrderBy();
+    $this->limit = $apiGet->getLimit();
+    $this->offset = $apiGet->getOffset();
+    if ($apiGet->getDebug()) {
+      $this->debugOutput =& $apiGet->_debugOutput;
+    }
+    $baoName = CoreUtil::getBAOFromApiName($this->entity);
+    $this->entityFieldNames = array_column($baoName::fields(), 'name');
+    $this->apiFieldSpec = $apiGet->entityFields();
+    foreach ($this->apiFieldSpec as $key => $field) {
+      $this->apiFieldSpec[$key]['sql_name'] = '`' . self::MAIN_TABLE_ALIAS . '`.`' . $field['column_name'] . '`';
+    }
 
-    \CRM_Utils_SQL_Select::from($this->getTableName($baoName) . ' ' . self::MAIN_TABLE_ALIAS);
+    $this->constructQueryObject($baoName);
 
     // Add ACLs first to avoid redundant subclauses
     $this->query->where($this->getAclClause(self::MAIN_TABLE_ALIAS, $baoName));
@@ -92,26 +96,10 @@ class Api4SelectQuery extends SelectQuery {
    * @throws \Civi\API\Exception\UnauthorizedException
    */
   public function getSql() {
-    $this->addJoins();
-    $this->buildSelectFields();
+    $this->buildSelectClause();
     $this->buildWhereClause();
-
-    // Select
-    if (in_array('row_count', $this->select)) {
-      $this->query->select("count(*) as c");
-    }
-    else {
-      foreach ($this->selectFields as $column => $alias) {
-        $this->query->select("$column as `$alias`");
-      }
-      // Order by
-      $this->buildOrderBy();
-    }
-
-    // Limit
-    if (!empty($this->limit) || !empty($this->offset)) {
-      $this->query->limit($this->limit, $this->offset);
-    }
+    $this->buildOrderBy();
+    $this->buildLimit();
     return $this->query->toSQL();
   }
 
@@ -134,10 +122,12 @@ class Api4SelectQuery extends SelectQuery {
         break;
       }
       $results[$query->id] = [];
-      foreach ($this->selectFields as $column => $alias) {
+      foreach ($this->select as $alias) {
         $returnName = $alias;
-        $alias = str_replace('.', '_', $alias);
-        $results[$query->id][$returnName] = property_exists($query, $alias) ? $query->$alias : NULL;
+        if ($this->isOneToOneField($alias)) {
+          $alias = str_replace('.', '_', $alias);
+          $results[$query->id][$returnName] = property_exists($query, $alias) ? $query->$alias : NULL;
+        }
       };
     }
     $event = new PostSelectQueryEvent($results, $this);
@@ -146,59 +136,44 @@ class Api4SelectQuery extends SelectQuery {
     return $event->getResults();
   }
 
-  /**
-   * Gets all FK fields and does the required joins
-   */
-  protected function addJoins() {
-    $allFields = array_merge($this->select, array_keys($this->orderBy));
-    $recurse = function($clauses) use (&$allFields, &$recurse) {
-      foreach ($clauses as $clause) {
-        if ($clause[0] === 'NOT' && is_string($clause[1][0])) {
-          $recurse($clause[1][1]);
-        }
-        elseif (in_array($clause[0], ['AND', 'OR', 'NOT'])) {
-          $recurse($clause[1]);
-        }
-        elseif (is_array($clause[0])) {
-          array_walk($clause, $recurse);
-        }
-        else {
-          $allFields[] = $clause[0];
-        }
-      }
-    };
-    $recurse($this->where);
-    $dotFields = array_unique(array_filter($allFields, function ($field) {
-      return strpos($field, '.') !== FALSE;
-    }));
-
-    foreach ($dotFields as $dotField) {
-      $this->joinFK($dotField);
+  protected function buildSelectClause() {
+    if (empty($this->select)) {
+      $this->select = $this->entityFieldNames;
     }
-  }
-
-  /**
-   * Populate $this->selectFields
-   *
-   * @throws \Civi\API\Exception\UnauthorizedException
-   */
-  protected function buildSelectFields() {
-    $selectAll = (empty($this->select) || in_array('*', $this->select));
-    $select = $selectAll ? $this->entityFieldNames : $this->select;
-
-    // Always select the ID if the table has one.
-    if (array_key_exists('id', $this->apiFieldSpec) || strstr($this->entity, 'Custom_')) {
-      $this->selectFields[self::MAIN_TABLE_ALIAS . ".id"] = "id";
+    elseif (in_array('row_count', $this->select)) {
+      $this->query->select("COUNT(*) AS `c`");
+      return;
     }
-
-    // core return fields
-    foreach ($select as $fieldName) {
+    else {
+      // Always select id field
+      $this->select = array_merge(['id'], $this->select);
+
+      // Expand wildcards in joins (the api wrapper already expanded non-joined wildcards)
+      $wildFields = array_filter($this->select, function($item) {
+        return strpos($item, '*') !== FALSE && strpos($item, '.') !== FALSE;
+      });
+      foreach ($wildFields as $item) {
+        $pos = array_search($item, array_values($this->select));
+        $this->joinFK($item);
+        $matches = SelectUtil::getMatchingFields($item, array_keys($this->apiFieldSpec));
+        array_splice($this->select, $pos, 1, $matches);
+      }
+      $this->select = array_unique($this->select);
+    }
+    foreach ($this->select as $fieldName) {
       $field = $this->getField($fieldName);
-      if (strpos($fieldName, '.') && !empty($this->fkSelectAliases[$fieldName]) && !array_filter($this->getPathJoinTypes($fieldName))) {
-        $this->selectFields[$this->fkSelectAliases[$fieldName]] = $fieldName;
+      if (!$this->isOneToOneField($fieldName)) {
+        continue;
+      }
+      elseif ($field) {
+        $this->query->select($field['sql_name'] . " AS `$fieldName`");
       }
-      elseif ($field && in_array($field['name'], $this->entityFieldNames)) {
-        $this->selectFields[self::MAIN_TABLE_ALIAS . "." . UtilsArray::value('column_name', $field, $field['name'])] = $field['name'];
+      // Remove unknown fields without raising an error
+      else {
+        $this->select = array_diff($this->select, [$fieldName]);
+        if (is_array($this->debugOutput)) {
+          $this->debugOutput['undefined_fields'][] = $fieldName;
+        }
       }
     }
   }
@@ -217,16 +192,20 @@ class Api4SelectQuery extends SelectQuery {
    * @inheritDoc
    */
   protected function buildOrderBy() {
-    foreach ($this->orderBy as $field => $dir) {
+    foreach ($this->orderBy as $fieldName => $dir) {
       if ($dir !== 'ASC' && $dir !== 'DESC') {
-        throw new \API_Exception("Invalid sort direction. Cannot order by $field $dir");
-      }
-      if ($this->getField($field)) {
-        $this->query->orderBy(self::MAIN_TABLE_ALIAS . '.' . $field . " $dir");
-      }
-      else {
-        throw new \API_Exception("Invalid sort field. Cannot order by $field $dir");
+        throw new \API_Exception("Invalid sort direction. Cannot order by $fieldName $dir");
       }
+      $this->query->orderBy($this->getField($fieldName, TRUE)['sql_name'] . " $dir");
+    }
+  }
+
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  protected function buildLimit() {
+    if (!empty($this->limit) || !empty($this->offset)) {
+      $this->query->limit($this->limit, $this->offset);
     }
   }
 
@@ -278,28 +257,14 @@ class Api4SelectQuery extends SelectQuery {
    */
   protected function validateClauseAndComposeSql($clause) {
     // Pad array for unary operators
-    list($key, $operator, $value) = array_pad($clause, 3, NULL);
-    $fieldSpec = $this->getField($key);
-    // derive table and column:
-    $table_name = NULL;
-    $column_name = NULL;
-    if (in_array($key, $this->entityFieldNames)) {
-      $table_name = self::MAIN_TABLE_ALIAS;
-      $column_name = $key;
-    }
-    elseif (strpos($key, '.') && isset($this->fkSelectAliases[$key])) {
-      list($table_name, $column_name) = explode('.', $this->fkSelectAliases[$key]);
-    }
+    list($fieldName, $operator, $value) = array_pad($clause, 3, NULL);
+    $field = $this->getField($fieldName, TRUE);
 
-    if (!$table_name || !$column_name) {
-      throw new \API_Exception("Invalid field '$key' in where clause.");
-    }
-
-    FormattingUtil::formatInputValue($value, $fieldSpec, $this->getEntity());
+    FormattingUtil::formatInputValue($value, $field, $this->getEntity());
 
-    $sql_clause = \CRM_Core_DAO::createSQLFilter("`$table_name`.`$column_name`", [$operator => $value]);
+    $sql_clause = \CRM_Core_DAO::createSQLFilter($field['sql_name'], [$operator => $value]);
     if ($sql_clause === NULL) {
-      throw new \API_Exception("Invalid value in where clause for field '$key'");
+      throw new \API_Exception("Invalid value in where clause for field '$fieldName'");
     }
     return $sql_clause;
   }
@@ -315,88 +280,70 @@ class Api4SelectQuery extends SelectQuery {
    * Fetch a field from the getFields list
    *
    * @param string $fieldName
+   * @param bool $strict
    *
    * @return string|null
+   * @throws \API_Exception
    */
-  protected function getField($fieldName) {
-    if ($fieldName) {
-      $fieldPath = explode('.', $fieldName);
-      if (count($fieldPath) > 1) {
-        $fieldName = implode('.', array_slice($fieldPath, -2));
-      }
-      return UtilsArray::value($fieldName, $this->apiFieldSpec);
+  public function getField($fieldName, $strict = FALSE) {
+    // Perform join if field not yet available - this will add it to apiFieldSpec
+    if (!isset($this->apiFieldSpec[$fieldName]) && strpos($fieldName, '.')) {
+      $this->joinFK($fieldName);
+    }
+    $field = $this->apiFieldSpec[$fieldName] ?? NULL;
+    // Check if field exists and we have permission to view it
+    if ($field && (!$this->checkPermissions || empty($field['permission']) || \CRM_Core_Permission::check($field['permission']))) {
+      return $field;
+    }
+    elseif ($strict) {
+      throw new \API_Exception("Invalid field '$fieldName'");
     }
     return NULL;
   }
 
   /**
+   * Joins a path and adds all fields in the joined eneity to apiFieldSpec
+   *
    * @param $key
+   * @return bool
    * @throws \API_Exception
+   * @throws \Exception
    */
   protected function joinFK($key) {
-    $pathArray = explode('.', $key);
-
-    if (count($pathArray) < 2) {
-      return;
+    if (isset($this->apiFieldSpec[$key])) {
+      return TRUE;
     }
 
+    $pathArray = explode('.', $key);
+
     /** @var \Civi\Api4\Service\Schema\Joiner $joiner */
     $joiner = \Civi::container()->get('joiner');
-    $field = array_pop($pathArray);
+    // The last item in the path is the field name. We don't care about that; we'll add all fields from the joined entity.
+    array_pop($pathArray);
     $pathString = implode('.', $pathArray);
 
     if (!$joiner->canJoin($this, $pathString)) {
-      return;
+      return FALSE;
     }
 
     $joinPath = $joiner->join($this, $pathString);
     /** @var \Civi\Api4\Service\Schema\Joinable\Joinable $lastLink */
     $lastLink = array_pop($joinPath);
 
-    $isWild = strpos($field, '*') !== FALSE;
-    if ($isWild) {
-      if (!in_array($key, $this->select)) {
-        throw new \API_Exception('Wildcards can only be used in the SELECT clause.');
-      }
-      $this->select = array_diff($this->select, [$key]);
+    // Custom field names are already prefixed
+    if ($lastLink instanceof CustomGroupJoinable) {
+      array_pop($pathArray);
     }
-
+    $prefix = $pathArray ? implode('.', $pathArray) . '.' : '';
     // Cache field info for retrieval by $this->getField()
-    $prefix = array_pop($pathArray) . '.';
-    if (!isset($this->apiFieldSpec[$prefix . $field])) {
-      $joinEntity = $lastLink->getEntity();
-      // Custom fields are already prefixed
-      if ($lastLink instanceof CustomGroupJoinable) {
-        $prefix = '';
-      }
-      foreach ($lastLink->getEntityFields() as $fieldObject) {
-        $this->apiFieldSpec[$prefix . $fieldObject->getName()] = $fieldObject->toArray() + ['entity' => $joinEntity];
-      }
-    }
-
-    if (!$isWild && !$lastLink->getField($field)) {
-      throw new \API_Exception('Invalid join');
-    }
-
-    $fields = $isWild ? [] : [$field];
-    // Expand wildcard and add matching fields to $this->select
-    if ($isWild) {
-      $fields = SelectUtil::getMatchingFields($field, $lastLink->getEntityFieldNames());
-      foreach ($fields as $field) {
-        $this->select[] = $pathString . '.' . $field;
-      }
-      $this->select = array_unique($this->select);
+    $joinEntity = $lastLink->getEntity();
+    foreach ($lastLink->getEntityFields() as $fieldObject) {
+      $fieldArray = ['entity' => $joinEntity] + $fieldObject->toArray();
+      $fieldArray['sql_name'] = '`' . $lastLink->getAlias() . '`.`' . $fieldArray['column_name'] . '`';
+      $this->apiFieldSpec[$prefix . $fieldArray['name']] = $fieldArray;
     }
 
-    foreach ($fields as $field) {
-      // custom groups use aliases for field names
-      $col = ($lastLink instanceof CustomGroupJoinable) ? $lastLink->getSqlColumn($field) : $field;
-      // Check Permission on field.
-      if ($this->checkPermissions && !empty($this->apiFieldSpec[$prefix . $field]['permission']) && !\CRM_Core_Permission::check($this->apiFieldSpec[$prefix . $field]['permission'])) {
-        return;
-      }
-      $this->fkSelectAliases[$pathString . '.' . $field] = sprintf('%s.%s', $lastLink->getAlias(), $col);
-    }
+    return TRUE;
   }
 
   /**
@@ -522,13 +469,6 @@ class Api4SelectQuery extends SelectQuery {
     return $this->apiVersion;
   }
 
-  /**
-   * @return array
-   */
-  public function getFkSelectAliases() {
-    return $this->fkSelectAliases;
-  }
-
   /**
    * @return \Civi\Api4\Service\Schema\Joinable\Joinable[]
    */
@@ -554,7 +494,7 @@ class Api4SelectQuery extends SelectQuery {
    *
    * @return void
    */
-  public function getTableName($baoName) {
+  public function constructQueryObject($baoName) {
     if (strstr($this->entity, 'Custom_')) {
       $this->query = \CRM_Utils_SQL_Select::from(CoreUtil::getCustomTableByName(str_replace('Custom_', '', $this->entity)) . ' ' . self::MAIN_TABLE_ALIAS);
       $this->entityFieldNames = array_keys($this->apiFieldSpec);
@@ -565,6 +505,19 @@ class Api4SelectQuery extends SelectQuery {
     }
   }
 
+  /**
+   * Checks if a field either belongs to the main entity or is joinable 1-to-1.
+   *
+   * Used to determine if a field can be added to the SELECT of the main query,
+   * or if it must be fetched post-query.
+   *
+   * @param string $fieldPath
+   * @return bool
+   */
+  public function isOneToOneField(string $fieldPath) {
+    return strpos($fieldPath, '.') === FALSE || !array_filter($this->getPathJoinTypes($fieldPath));
+  }
+
   /**
    * Separates a string like 'emails.location_type.label' into an array, where
    * each value in the array tells whether it is 1-1 or 1-n join type
diff --git a/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php b/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php
index 695c7b5662..fd5ab30f9d 100644
--- a/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php
+++ b/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php
@@ -59,7 +59,7 @@ class CustomGroupJoinable extends Joinable {
     if (!$this->entityFields) {
       $fields = CustomField::get()
         ->setCheckPermissions(FALSE)
-        ->setSelect(['custom_group.name', 'custom_group_id', 'name', 'label', 'data_type', 'html_type', 'is_required', 'is_searchable', 'is_search_range', 'weight', 'is_active', 'is_view', 'option_group_id', 'default_value', 'date_format', 'time_format', 'start_date_years', 'end_date_years'])
+        ->setSelect(['custom_group.name', '*'])
         ->addWhere('custom_group.table_name', '=', $this->getTargetTable())
         ->execute();
       foreach ($fields as $field) {
diff --git a/civicrm/Civi/Api4/Service/Schema/SchemaMapBuilder.php b/civicrm/Civi/Api4/Service/Schema/SchemaMapBuilder.php
index 4a82d826b8..66efeb3a85 100644
--- a/civicrm/Civi/Api4/Service/Schema/SchemaMapBuilder.php
+++ b/civicrm/Civi/Api4/Service/Schema/SchemaMapBuilder.php
@@ -29,7 +29,6 @@ use Civi\Api4\Service\Schema\Joinable\Joinable;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Civi\Api4\Service\Schema\Joinable\OptionValueJoinable;
 use CRM_Core_DAO_AllCoreTables as AllCoreTables;
-use CRM_Utils_Array as UtilsArray;
 
 class SchemaMapBuilder {
   /**
@@ -89,18 +88,18 @@ class SchemaMapBuilder {
    * @param array $data
    */
   private function addJoins(Table $table, $field, array $data) {
-    $fkClass = UtilsArray::value('FKClassName', $data);
+    $fkClass = $data['FKClassName'] ?? NULL;
 
     // can there be multiple methods e.g. pseudoconstant and fkclass
     if ($fkClass) {
       $tableName = AllCoreTables::getTableForClass($fkClass);
-      $fkKey = UtilsArray::value('FKKeyColumn', $data, 'id');
+      $fkKey = $data['FKKeyColumn'] ?? 'id';
       $alias = str_replace('_id', '', $field);
       $joinable = new Joinable($tableName, $fkKey, $alias);
       $joinable->setJoinType($joinable::JOIN_TYPE_MANY_TO_ONE);
       $table->addTableLink($field, $joinable);
     }
-    elseif (UtilsArray::value('pseudoconstant', $data)) {
+    elseif (!empty($data['pseudoconstant'])) {
       $this->addPseudoConstantJoin($table, $field, $data);
     }
   }
@@ -111,22 +110,22 @@ class SchemaMapBuilder {
    * @param array $data
    */
   private function addPseudoConstantJoin(Table $table, $field, array $data) {
-    $pseudoConstant = UtilsArray::value('pseudoconstant', $data);
-    $tableName = UtilsArray::value('table', $pseudoConstant);
-    $optionGroupName = UtilsArray::value('optionGroupName', $pseudoConstant);
-    $keyColumn = UtilsArray::value('keyColumn', $pseudoConstant, 'id');
+    $pseudoConstant = $data['pseudoconstant'] ?? NULL;
+    $tableName = $pseudoConstant['table'] ?? NULL;
+    $optionGroupName = $pseudoConstant['optionGroupName'] ?? NULL;
+    $keyColumn = $pseudoConstant['keyColumn'] ?? 'id';
 
     if ($tableName) {
       $alias = str_replace('civicrm_', '', $tableName);
       $joinable = new Joinable($tableName, $keyColumn, $alias);
-      $condition = UtilsArray::value('condition', $pseudoConstant);
+      $condition = $pseudoConstant['condition'] ?? NULL;
       if ($condition) {
         $joinable->addCondition($condition);
       }
       $table->addTableLink($field, $joinable);
     }
     elseif ($optionGroupName) {
-      $keyColumn = UtilsArray::value('keyColumn', $pseudoConstant, 'value');
+      $keyColumn = $pseudoConstant['keyColumn'] ?? 'value';
       $joinable = new OptionValueJoinable($optionGroupName, NULL, $keyColumn);
 
       if (!empty($data['serialize'])) {
diff --git a/civicrm/Civi/Api4/Service/Spec/CustomFieldSpec.php b/civicrm/Civi/Api4/Service/Spec/CustomFieldSpec.php
index cc62986e27..54ff20ee11 100644
--- a/civicrm/Civi/Api4/Service/Spec/CustomFieldSpec.php
+++ b/civicrm/Civi/Api4/Service/Spec/CustomFieldSpec.php
@@ -37,11 +37,6 @@ class CustomFieldSpec extends FieldSpec {
    */
   protected $tableName;
 
-  /**
-   * @var string
-   */
-  protected $columnName;
-
   /**
    * @inheritDoc
    */
@@ -116,22 +111,4 @@ class CustomFieldSpec extends FieldSpec {
     return $this;
   }
 
-  /**
-   * @return string
-   */
-  public function getCustomFieldColumnName() {
-    return $this->columnName;
-  }
-
-  /**
-   * @param string $customFieldColumnName
-   *
-   * @return $this
-   */
-  public function setCustomFieldColumnName($customFieldColumnName) {
-    $this->columnName = $customFieldColumnName;
-
-    return $this;
-  }
-
 }
diff --git a/civicrm/Civi/Api4/Service/Spec/FieldSpec.php b/civicrm/Civi/Api4/Service/Spec/FieldSpec.php
index 90a6844036..31caa2abb7 100644
--- a/civicrm/Civi/Api4/Service/Spec/FieldSpec.php
+++ b/civicrm/Civi/Api4/Service/Spec/FieldSpec.php
@@ -104,6 +104,11 @@ class FieldSpec {
    */
   protected $permission;
 
+  /**
+   * @var string
+   */
+  protected $columnName;
+
   /**
    * Aliases for the valid data types
    *
@@ -122,7 +127,7 @@ class FieldSpec {
    */
   public function __construct($name, $entity, $dataType = 'String') {
     $this->entity = $entity;
-    $this->setName($name);
+    $this->name = $this->columnName = $name;
     $this->setDataType($dataType);
   }
 
@@ -428,6 +433,23 @@ class FieldSpec {
     return $this;
   }
 
+  /**
+   * @return string
+   */
+  public function getColumnName() {
+    return $this->columnName;
+  }
+
+  /**
+   * @param string $columnName
+   *
+   * @return $this
+   */
+  public function setColumnName($columnName) {
+    $this->columnName = $columnName;
+    return $this;
+  }
+
   /**
    * @param array $values
    * @return array
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/StatusPreferenceCreationSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/FieldDomainIdSpecProvider.php
similarity index 67%
rename from civicrm/Civi/Api4/Service/Spec/Provider/StatusPreferenceCreationSpecProvider.php
rename to civicrm/Civi/Api4/Service/Spec/Provider/FieldDomainIdSpecProvider.php
index 7e7b4c4c24..7b6bbb45ba 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/StatusPreferenceCreationSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/FieldDomainIdSpecProvider.php
@@ -23,20 +23,23 @@ namespace Civi\Api4\Service\Spec\Provider;
 
 use Civi\Api4\Service\Spec\RequestSpec;
 
-class StatusPreferenceCreationSpecProvider implements Generic\SpecProviderInterface {
+class FieldDomainIdSpecProvider implements Generic\SpecProviderInterface {
 
   /**
-   * @inheritDoc
+   * Generic create spec function to set sensible defaults for any entity with a "domain_id" field.
    */
   public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('domain_id')->setRequired(FALSE);
+    $domainIdField = $spec->getFieldByName('domain_id');
+    if ($domainIdField && $domainIdField->isRequired()) {
+      $domainIdField->setRequired(FALSE)->setDefaultValue('current_domain');;
+    }
   }
 
   /**
    * @inheritDoc
    */
   public function applies($entity, $action) {
-    return $entity === 'StatusPreference' && $action === 'create';
+    return $action === 'create';
   }
 
 }
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/NavigationSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/NavigationSpecProvider.php
index 7c956a33ea..b6cc8cfb16 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/NavigationSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/NavigationSpecProvider.php
@@ -28,6 +28,10 @@ class NavigationSpecProvider implements Generic\SpecProviderInterface {
   /**
    * This runs for both create and get actions
    *
+   * @fixme - for 'create', this is redundant with FieldDomainIdSpecProvider.
+   * @fixme - for 'get', this is inconsistent with other entities which do not set this default. We should standardize on setting or not setting it.
+   * @see FieldDomainIdSpecProvider
+   *
    * @inheritDoc
    */
   public function modifySpec(RequestSpec $spec) {
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/PaymentProcessorCreationSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/PaymentProcessorCreationSpecProvider.php
index ec6a236080..e94c7f4d20 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/PaymentProcessorCreationSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/PaymentProcessorCreationSpecProvider.php
@@ -28,7 +28,6 @@ class PaymentProcessorCreationSpecProvider implements Generic\SpecProviderInterf
    * @inheritDoc
    */
   public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('domain_id')->setRequired(FALSE)->setDefaultValue('current_domain');
     // Billing mode is copied across from the payment processor type field in the BAO::create function.
     $spec->getFieldByName('billing_mode')->setRequired(FALSE);
 
diff --git a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
index 8c63e66228..b9d1cf5bcc 100644
--- a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
+++ b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
@@ -21,7 +21,6 @@
 
 namespace Civi\Api4\Service\Spec;
 
-use CRM_Utils_Array as ArrayHelper;
 use CRM_Core_DAO_AllCoreTables as AllCoreTables;
 
 class SpecFormatter {
@@ -62,34 +61,34 @@ class SpecFormatter {
       }
       else {
         $field->setCustomTableName($data['custom_group.table_name']);
-        $field->setCustomFieldColumnName($data['column_name']);
       }
-      $field->setCustomFieldId(ArrayHelper::value('id', $data));
+      $field->setColumnName($data['column_name']);
+      $field->setCustomFieldId($data['id'] ?? NULL);
       $field->setCustomGroupName($data['custom_group.name']);
-      $field->setTitle(ArrayHelper::value('label', $data));
-      $field->setHelpPre(ArrayHelper::value('help_pre', $data));
-      $field->setHelpPost(ArrayHelper::value('help_post', $data));
+      $field->setTitle($data['label'] ?? NULL);
+      $field->setHelpPre($data['help_pre'] ?? NULL);
+      $field->setHelpPost($data['help_post'] ?? NULL);
       $field->setOptions(self::customFieldHasOptions($data));
       if (\CRM_Core_BAO_CustomField::isSerialized($data)) {
         $field->setSerialize(\CRM_Core_DAO::SERIALIZE_SEPARATOR_BOOKEND);
       }
     }
     else {
-      $name = ArrayHelper::value('name', $data);
+      $name = $data['name'] ?? NULL;
       $field = new FieldSpec($name, $entity, $dataTypeName);
-      $field->setRequired((bool) ArrayHelper::value('required', $data, FALSE));
-      $field->setTitle(ArrayHelper::value('title', $data));
+      $field->setRequired(!empty($data['required']));
+      $field->setTitle($data['title'] ?? NULL);
       $field->setOptions(!empty($data['pseudoconstant']));
-      $field->setSerialize(ArrayHelper::value('serialize', $data));
+      $field->setSerialize($data['serialize'] ?? NULL);
     }
 
-    $field->setDefaultValue(ArrayHelper::value('default', $data));
-    $field->setDescription(ArrayHelper::value('description', $data));
+    $field->setDefaultValue($data['default'] ?? NULL);
+    $field->setDescription($data['description'] ?? NULL);
     self::setInputTypeAndAttrs($field, $data, $dataTypeName);
 
-    $field->setPermission(ArrayHelper::value('permission', $data));
-    $fkAPIName = ArrayHelper::value('FKApiName', $data);
-    $fkClassName = ArrayHelper::value('FKClassName', $data);
+    $field->setPermission($data['permission'] ?? NULL);
+    $fkAPIName = $data['FKApiName'] ?? NULL;
+    $fkClassName = $data['FKClassName'] ?? NULL;
     if ($fkAPIName || $fkClassName) {
       $field->setFkEntity($fkAPIName ?: AllCoreTables::getBriefName($fkClassName));
     }
@@ -132,7 +131,7 @@ class SpecFormatter {
       return !empty($data['time_format']) ? 'Timestamp' : $data['data_type'];
     }
 
-    $dataTypeInt = ArrayHelper::value('type', $data);
+    $dataTypeInt = $data['type'] ?? NULL;
     $dataTypeName = \CRM_Utils_Type::typeToString($dataTypeInt);
 
     return $dataTypeName;
@@ -144,8 +143,8 @@ class SpecFormatter {
    * @param string $dataTypeName
    */
   public static function setInputTypeAndAttrs(FieldSpec &$fieldSpec, $data, $dataTypeName) {
-    $inputType = isset($data['html']['type']) ? $data['html']['type'] : ArrayHelper::value('html_type', $data);
-    $inputAttrs = ArrayHelper::value('html', $data, []);
+    $inputType = $data['html']['type'] ?? $data['html_type'] ?? NULL;
+    $inputAttrs = $data['html'] ?? [];
     unset($inputAttrs['type']);
 
     if (strstr($inputType, 'Multi-Select') || ($inputType == 'Select' && !empty($data['serialize']))) {
@@ -158,7 +157,7 @@ class SpecFormatter {
       'Select Date' => 'Date',
       'Link' => 'Url',
     ];
-    $inputType = ArrayHelper::value($inputType, $map, $inputType);
+    $inputType = $map[$inputType] ?? $inputType;
     if ($inputType == 'Date' && !empty($inputAttrs['formatType'])) {
       self::setLegacyDateFormat($inputAttrs);
     }
diff --git a/civicrm/Civi/Api4/Service/Spec/SpecGatherer.php b/civicrm/Civi/Api4/Service/Spec/SpecGatherer.php
index dc7304731c..d9909c477d 100644
--- a/civicrm/Civi/Api4/Service/Spec/SpecGatherer.php
+++ b/civicrm/Civi/Api4/Service/Spec/SpecGatherer.php
@@ -131,7 +131,7 @@ class SpecGatherer {
       ->setCheckPermissions(FALSE)
       ->addWhere('custom_group.extends', 'IN', $extends)
       ->addWhere('custom_group.is_multiple', '=', '0')
-      ->setSelect(['custom_group.name', 'custom_group_id', 'name', 'label', 'data_type', 'html_type', 'is_searchable', 'is_search_range', 'weight', 'is_active', 'is_view', 'option_group_id', 'default_value', 'date_format', 'time_format', 'start_date_years', 'end_date_years', 'help_pre', 'help_post'])
+      ->setSelect(['custom_group.name', '*'])
       ->execute();
 
     foreach ($customFields as $fieldArray) {
@@ -147,7 +147,7 @@ class SpecGatherer {
   private function getCustomGroupFields($customGroup, RequestSpec $specification) {
     $customFields = CustomField::get()
       ->addWhere('custom_group.name', '=', $customGroup)
-      ->setSelect(['custom_group.name', 'custom_group_id', 'name', 'label', 'data_type', 'html_type', 'is_searchable', 'is_search_range', 'weight', 'is_active', 'is_view', 'option_group_id', 'default_value', 'custom_group.table_name', 'column_name', 'date_format', 'time_format', 'start_date_years', 'end_date_years', 'help_pre', 'help_post'])
+      ->setSelect(['custom_group.name', 'custom_group.table_name', '*'])
       ->execute();
 
     foreach ($customFields as $fieldArray) {
diff --git a/civicrm/Civi/Api4/Utils/ArrayInsertionUtil.php b/civicrm/Civi/Api4/Utils/ArrayInsertionUtil.php
index 0011a01b32..4c2d2f6b2d 100644
--- a/civicrm/Civi/Api4/Utils/ArrayInsertionUtil.php
+++ b/civicrm/Civi/Api4/Utils/ArrayInsertionUtil.php
@@ -21,8 +21,6 @@
 
 namespace Civi\Api4\Utils;
 
-use CRM_Utils_Array as UtilsArray;
-
 class ArrayInsertionUtil {
 
   /**
@@ -67,11 +65,11 @@ class ArrayInsertionUtil {
    * @return array|mixed
    */
   private static function filterValues($parentArray, $isMulti, $values) {
-    $parentID = UtilsArray::value('id', $parentArray);
+    $parentID = $parentArray['id'] ?? NULL;
 
     if ($parentID) {
       $values = array_filter($values, function ($value) use ($parentID) {
-        return UtilsArray::value('_parent_id', $value) == $parentID;
+        return ($value['_parent_id'] ?? NULL) == $parentID;
       });
     }
 
diff --git a/civicrm/Civi/Api4/Utils/SelectUtil.php b/civicrm/Civi/Api4/Utils/SelectUtil.php
index 38b085ceef..00863f051c 100644
--- a/civicrm/Civi/Api4/Utils/SelectUtil.php
+++ b/civicrm/Civi/Api4/Utils/SelectUtil.php
@@ -43,17 +43,32 @@ class SelectUtil {
   }
 
   /**
+   * Filters a list of fieldnames by matching a pattern which may contain * wildcards.
+   *
+   * For fieldnames joined with a dot (e.g. email.contact_id), wildcards are only allowed after the last dot.
+   *
    * @param string $pattern
    * @param array $fieldNames
    * @return array
    */
   public static function getMatchingFields($pattern, $fieldNames) {
+    // If the pattern is "select all" then we return all base fields (excluding those with a dot)
     if ($pattern === '*') {
-      return $fieldNames;
+      return array_values(array_filter($fieldNames, function($field) {
+        return strpos($field, '.') === FALSE;
+      }));
     }
-    $pattern = '/^' . str_replace('\*', '.*', preg_quote($pattern, '/')) . '$/';
-    return array_values(array_filter($fieldNames, function($field) use ($pattern) {
-      return preg_match($pattern, $field);
+    $dot = strrpos($pattern, '.');
+    $prefix = $dot === FALSE ? '' : substr($pattern, 0, $dot + 1);
+    $search = $dot === FALSE ? $pattern : substr($pattern, $dot + 1);
+    $search = '/^' . str_replace('\*', '.*', preg_quote($search, '/')) . '$/';
+    return array_values(array_filter($fieldNames, function($field) use ($search, $prefix) {
+      // Exclude fields that don't have the same join prefix
+      if (($prefix !== '' && strpos($field, $prefix) !== 0) || substr_count($prefix, '.') !== substr_count($field, '.')) {
+        return FALSE;
+      }
+      // Now strip the prefix and compare field name to the pattern
+      return preg_match($search, substr($field, strlen($prefix)));
     }));
   }
 
diff --git a/civicrm/Civi/CiUtil/Command/CompareCommand.php b/civicrm/Civi/CiUtil/Command/CompareCommand.php
index beae7ac779..925ac77387 100644
--- a/civicrm/Civi/CiUtil/Command/CompareCommand.php
+++ b/civicrm/Civi/CiUtil/Command/CompareCommand.php
@@ -71,7 +71,7 @@ class CompareCommand {
     foreach ($tests as $test) {
       $values = [];
       foreach ($suites as $suite) {
-        $values[] = isset($suite['results'][$test]) ? $suite['results'][$test] : 'MISSING';
+        $values[] = $suite['results'][$test] ?? 'MISSING';
       }
 
       if (count(array_unique($values)) > 1) {
diff --git a/civicrm/Civi/Core/CiviEventInspector.php b/civicrm/Civi/Core/CiviEventInspector.php
index ad260c099c..77d91684e2 100644
--- a/civicrm/Civi/Core/CiviEventInspector.php
+++ b/civicrm/Civi/Core/CiviEventInspector.php
@@ -133,7 +133,7 @@ class CiviEventInspector {
    * @return CiviEventInspector
    */
   public function add($eventDef) {
-    $name = isset($eventDef['name']) ? $eventDef['name'] : NULL;
+    $name = $eventDef['name'] ?? NULL;
 
     if (!isset($eventDef['type'])) {
       $eventDef['type'] = preg_match('/^hook_/', $eventDef['name']) ? 'hook' : 'object';
diff --git a/civicrm/Civi/Core/Container.php b/civicrm/Civi/Core/Container.php
index 4172c9946a..6666ce61fc 100644
--- a/civicrm/Civi/Core/Container.php
+++ b/civicrm/Civi/Core/Container.php
@@ -333,7 +333,9 @@ class Container {
     $dispatcher->addListener(SystemInstallEvent::EVENT_NAME, ['\Civi\Core\InstallationCanary', 'check']);
     $dispatcher->addListener(SystemInstallEvent::EVENT_NAME, ['\Civi\Core\DatabaseInitializer', 'initialize']);
     $dispatcher->addListener(SystemInstallEvent::EVENT_NAME, ['\Civi\Core\LocalizationInitializer', 'initialize']);
+    $dispatcher->addListener('hook_civicrm_post', ['\CRM_Core_Transaction', 'addPostCommit'], -1000);
     $dispatcher->addListener('hook_civicrm_pre', ['\Civi\Core\Event\PreEvent', 'dispatchSubevent'], 100);
+    $dispatcher->addListener('civi.dao.preDelete', ['\CRM_Core_BAO_EntityTag', 'preDeleteOtherEntity']);
     $dispatcher->addListener('hook_civicrm_post', ['\Civi\Core\Event\PostEvent', 'dispatchSubevent'], 100);
     $dispatcher->addListener('hook_civicrm_post::Activity', ['\Civi\CCase\Events', 'fireCaseChange']);
     $dispatcher->addListener('hook_civicrm_post::Case', ['\Civi\CCase\Events', 'fireCaseChange']);
diff --git a/civicrm/Civi/Core/Resolver.php b/civicrm/Civi/Core/Resolver.php
index b1e54684a6..379f94d64c 100644
--- a/civicrm/Civi/Core/Resolver.php
+++ b/civicrm/Civi/Core/Resolver.php
@@ -197,7 +197,7 @@ class ResolverApi {
     }
 
     $result = civicrm_api3($this->url['host'], ltrim($this->url['path'], '/'), $apiParams);
-    return isset($result['values']) ? $result['values'] : NULL;
+    return $result['values'] ?? NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Core/SettingsBag.php b/civicrm/Civi/Core/SettingsBag.php
index 1401da968e..be51cc6ae4 100644
--- a/civicrm/Civi/Core/SettingsBag.php
+++ b/civicrm/Civi/Core/SettingsBag.php
@@ -182,7 +182,7 @@ class SettingsBag {
    */
   public function get($key) {
     $all = $this->all();
-    return isset($all[$key]) ? $all[$key] : NULL;
+    return $all[$key] ?? NULL;
   }
 
   /**
@@ -193,7 +193,7 @@ class SettingsBag {
    * @return mixed|NULL
    */
   public function getDefault($key) {
-    return isset($this->defaults[$key]) ? $this->defaults[$key] : NULL;
+    return $this->defaults[$key] ?? NULL;
   }
 
   /**
@@ -205,7 +205,7 @@ class SettingsBag {
    * @return mixed|NULL
    */
   public function getExplicit($key) {
-    return (isset($this->values[$key]) ? $this->values[$key] : NULL);
+    return ($this->values[$key] ?? NULL);
   }
 
   /**
@@ -216,7 +216,7 @@ class SettingsBag {
    * @return mixed|NULL
    */
   public function getMandatory($key) {
-    return isset($this->mandatory[$key]) ? $this->mandatory[$key] : NULL;
+    return $this->mandatory[$key] ?? NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Core/SettingsManager.php b/civicrm/Civi/Core/SettingsManager.php
index 46d9b7bb35..1bd096758a 100644
--- a/civicrm/Civi/Core/SettingsManager.php
+++ b/civicrm/Civi/Core/SettingsManager.php
@@ -221,7 +221,7 @@ class SettingsManager {
       ]);
       $defaults = [];
       foreach ($specs as $key => $spec) {
-        $defaults[$key] = \CRM_Utils_Array::value('default', $spec);
+        $defaults[$key] = $spec['default'] ?? NULL;
       }
       \CRM_Utils_Array::extend($defaults, self::getSystemDefaults($entity));
       $this->cache->set($cacheKey, $defaults);
@@ -291,7 +291,7 @@ class SettingsManager {
 
     if (is_array($civicrm_setting)) {
       foreach ($civicrm_setting as $oldGroup => $values) {
-        $newGroup = isset($rewriteGroups[$oldGroup]) ? $rewriteGroups[$oldGroup] : 'domain';
+        $newGroup = $rewriteGroups[$oldGroup] ?? 'domain';
         $result[$newGroup] = array_merge($result[$newGroup], $values);
       }
     }
diff --git a/civicrm/Civi/Core/Themes.php b/civicrm/Civi/Core/Themes.php
index f7118d69d3..c3550bc63d 100644
--- a/civicrm/Civi/Core/Themes.php
+++ b/civicrm/Civi/Core/Themes.php
@@ -97,7 +97,7 @@ class Themes {
    */
   public function get($themeKey) {
     $all = $this->getAll();
-    return isset($all[$themeKey]) ? $all[$themeKey] : NULL;
+    return $all[$themeKey] ?? NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Core/Transaction/Manager.php b/civicrm/Civi/Core/Transaction/Manager.php
index bfa8130d39..263e39fa01 100644
--- a/civicrm/Civi/Core/Transaction/Manager.php
+++ b/civicrm/Civi/Core/Transaction/Manager.php
@@ -129,7 +129,7 @@ class Manager {
    * @return \Civi\Core\Transaction\Frame
    */
   public function getFrame() {
-    return isset($this->frames[0]) ? $this->frames[0] : NULL;
+    return $this->frames[0] ?? NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Payment/PropertyBag.php b/civicrm/Civi/Payment/PropertyBag.php
index 6cea55241e..c067a1f77a 100644
--- a/civicrm/Civi/Payment/PropertyBag.php
+++ b/civicrm/Civi/Payment/PropertyBag.php
@@ -67,6 +67,7 @@ class PropertyBag implements \ArrayAccess {
     'frequency_interval'          => 'recurFrequencyInterval',
     'recurFrequencyUnit'          => TRUE,
     'frequency_unit'              => 'recurFrequencyUnit',
+    'subscriptionId'              => 'recurProcessorID',
     'recurProcessorID'            => TRUE,
     'transactionID'               => TRUE,
     'transaction_id'              => 'transactionID',
@@ -106,8 +107,8 @@ class PropertyBag implements \ArrayAccess {
    * @return bool TRUE if we have that value (on our default store)
    */
   public function offsetExists ($offset): bool {
-    $prop = $this->handleLegacyPropNames($offset);
-    return isset($this->props['default'][$prop]);
+    $prop = $this->handleLegacyPropNames($offset, TRUE);
+    return $prop && isset($this->props['default'][$prop]);
   }
 
   /**
@@ -199,16 +200,21 @@ class PropertyBag implements \ArrayAccess {
 
   /**
    * @param string $prop
+   * @param bool $silent if TRUE return NULL instead of throwing an exception. This is because offsetExists should be safe and not throw exceptions.
    * @return string canonical name.
    * @throws \InvalidArgumentException if prop name not known.
    */
-  protected function handleLegacyPropNames($prop) {
+  protected function handleLegacyPropNames($prop, $silent = FALSE) {
     $newName = static::$propMap[$prop] ?? NULL;
     if ($newName === TRUE) {
       // Good, modern name.
       return $prop;
     }
     if ($newName === NULL) {
+      if ($silent) {
+        // Only for use by offsetExists
+        return;
+      }
       throw new \InvalidArgumentException("Unknown property '$prop'.");
     }
     // Remaining case is legacy name that's been translated.
diff --git a/civicrm/Civi/Test/Api3TestTrait.php b/civicrm/Civi/Test/Api3TestTrait.php
index 79e6e8e53c..6d5421053d 100644
--- a/civicrm/Civi/Test/Api3TestTrait.php
+++ b/civicrm/Civi/Test/Api3TestTrait.php
@@ -23,12 +23,7 @@ trait Api3TestTrait {
    * @return array
    */
   public function versionThreeAndFour() {
-    $r = [[3]];
-    global $civicrm_root;
-    if (file_exists("$civicrm_root/Civi/Api4") || file_exists("$civicrm_root/ext/api4")) {
-      $r[] = [4];
-    }
-    return $r;
+    return [[3], [4]];
   }
 
   /**
@@ -109,7 +104,7 @@ trait Api3TestTrait {
     if (!empty($apiResult['trace'])) {
       $errorMessage .= "\n" . print_r($apiResult['trace'], TRUE);
     }
-    $this->assertEmpty(\CRM_Utils_Array::value('is_error', $apiResult), $prefix . $errorMessage);
+    $this->assertEmpty($apiResult['is_error'] ?? NULL, $prefix . $errorMessage);
   }
 
   /**
@@ -289,7 +284,7 @@ trait Api3TestTrait {
    * @return array|int
    */
   public function civicrm_api($entity, $action, $params = []) {
-    if (\CRM_Utils_Array::value('version', $params) == 4) {
+    if (($params['version'] ?? 0) == 4) {
       return $this->runApi4Legacy($entity, $action, $params);
     }
     return civicrm_api($entity, $action, $params);
@@ -318,7 +313,7 @@ trait Api3TestTrait {
     if (!empty($v3Params['filters']['is_current']) || !empty($v3Params['isCurrent'])) {
       $v4Params['current'] = TRUE;
     }
-    $language = !empty($v3Params['options']['language']) ? $v3Params['options']['language'] : \CRM_Utils_Array::value('option.language', $v3Params);
+    $language = $v3Params['options']['language'] ?? $v3Params['option.language'] ?? NULL;
     if ($language) {
       $v4Params['language'] = $language;
     }
@@ -346,12 +341,12 @@ trait Api3TestTrait {
 
     if ($v4Entity == 'Setting') {
       $indexBy = NULL;
-      $v4Params['domainId'] = \CRM_Utils_Array::value('domain_id', $v3Params);
+      $v4Params['domainId'] = $v3Params['domain_id'] ?? NULL;
       if ($v3Action == 'getfields') {
         if (!empty($v3Params['name'])) {
           $v3Params['filters']['name'] = $v3Params['name'];
         }
-        foreach (\CRM_Utils_Array::value('filters', $v3Params, []) as $filter => $val) {
+        foreach ($v3Params['filters'] ?? [] as $filter => $val) {
           $v4Params['where'][] = [$filter, '=', $val];
         }
       }
@@ -378,7 +373,7 @@ trait Api3TestTrait {
 
     foreach ($v3Fields as $name => $field) {
       // Resolve v3 aliases
-      foreach (\CRM_Utils_Array::value('api.aliases', $field, []) as $alias) {
+      foreach ($field['api.aliases'] ?? [] as $alias) {
         if (isset($v3Params[$alias])) {
           $v3Params[$field['name']] = $v3Params[$alias];
           unset($v3Params[$alias]);
@@ -399,6 +394,14 @@ trait Api3TestTrait {
           unset($options['return'][$name]);
         }
       }
+
+      if ($name === 'option_group_id' && isset($v3Params[$name]) && !is_numeric($v3Params[$name])) {
+        // This is a per field hack (bad) but we can't solve everything at once
+        // & a cleverer way turned out to be too much for this round.
+        // Being in the test class it's tested....
+        $v3Params['option_group.name'] = $v3Params['option_group_id'];
+        unset($v3Params['option_group_id']);
+      }
     }
 
     switch ($v3Action) {
@@ -553,11 +556,12 @@ trait Api3TestTrait {
     }
 
     if ($v3Action == 'getvalue' && $v4Entity == 'Setting') {
-      return \CRM_Utils_Array::value('value', $result->first());
+      return $result->first()['value'] ?? NULL;
     }
 
     if ($v3Action == 'getvalue') {
-      return \CRM_Utils_Array::value(array_keys($options['return'])[0], $result->first());
+      $returnKey = array_keys($options['return'])[0];
+      return $result->first()[$returnKey] ?? NULL;
     }
 
     // Mimic api3 behavior when using 'replace' action to delete all
@@ -612,7 +616,7 @@ trait Api3TestTrait {
       'version' => 4,
       'count' => count($result),
       'values' => (array) $result,
-      'id' => is_object($result) && count($result) == 1 ? \CRM_Utils_Array::value('id', $result->first()) : NULL,
+      'id' => is_object($result) && count($result) == 1 ? ($result->first()['id'] ?? NULL) : NULL,
     ];
   }
 
@@ -649,7 +653,7 @@ trait Api3TestTrait {
     foreach ($params as $name => $param) {
       if (is_string($param) && strpos($param, '$value.') === 0) {
         $param = substr($param, 7);
-        $params[$name] = \CRM_Utils_Array::value($param, $result);
+        $params[$name] = $result[$param] ?? NULL;
       }
     }
 
@@ -685,7 +689,7 @@ trait Api3TestTrait {
       'Im' => 'IM',
       'Acl' => 'ACL',
     ];
-    return \CRM_Utils_Array::value($api4Name, $map, $api4Name);
+    return $map[$api4Name] ?? $api4Name;
   }
 
 }
diff --git a/civicrm/Civi/Test/ContactTestTrait.php b/civicrm/Civi/Test/ContactTestTrait.php
index 03b28597ad..efb0b146e2 100644
--- a/civicrm/Civi/Test/ContactTestTrait.php
+++ b/civicrm/Civi/Test/ContactTestTrait.php
@@ -158,14 +158,10 @@ trait ContactTestTrait {
    * @return int
    *   id of contact created
    *
-   * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
   private function _contactCreate($params) {
     $result = civicrm_api3('contact', 'create', $params);
-    if (!empty($result['is_error']) || empty($result['id'])) {
-      throw new \CRM_Core_Exception('Could not create test contact, with message: ' . \CRM_Utils_Array::value('error_message', $result) . "\nBacktrace:" . \CRM_Utils_Array::value('trace', $result));
-    }
     return (int) $result['id'];
   }
 
diff --git a/civicrm/Civi/Test/GenericAssertionsTrait.php b/civicrm/Civi/Test/GenericAssertionsTrait.php
index 993e1278cb..0d53d034ba 100644
--- a/civicrm/Civi/Test/GenericAssertionsTrait.php
+++ b/civicrm/Civi/Test/GenericAssertionsTrait.php
@@ -89,7 +89,7 @@ trait GenericAssertionsTrait {
    * @param array $list
    */
   public function assertArrayKeyExists($key, &$list) {
-    $result = isset($list[$key]) ? TRUE : FALSE;
+    $result = isset($list[$key]);
     $this->assertTrue($result, sprintf("%s element exists?", $key));
   }
 
@@ -100,7 +100,7 @@ trait GenericAssertionsTrait {
   public function assertArrayValueNotNull($key, &$list) {
     $this->assertArrayKeyExists($key, $list);
 
-    $value = isset($list[$key]) ? $list[$key] : NULL;
+    $value = $list[$key] ?? NULL;
     $this->assertTrue($value,
       sprintf("%s element not null?", $key)
     );
diff --git a/civicrm/Civi/Test/Schema.php b/civicrm/Civi/Test/Schema.php
index 40da4389a9..adca28b1b4 100644
--- a/civicrm/Civi/Test/Schema.php
+++ b/civicrm/Civi/Test/Schema.php
@@ -27,7 +27,7 @@ class Schema {
     $tables = $pdo->query($query);
     $result = [];
     foreach ($tables as $table) {
-      $result[] = isset($table['TABLE_NAME']) ? $table['TABLE_NAME'] : $table['table_name'];
+      $result[] = $table['TABLE_NAME'] ?? $table['table_name'];
     }
     return $result;
   }
diff --git a/civicrm/Civi/Token/TokenCompatSubscriber.php b/civicrm/Civi/Token/TokenCompatSubscriber.php
index d9b186e1f3..45a81fb174 100644
--- a/civicrm/Civi/Token/TokenCompatSubscriber.php
+++ b/civicrm/Civi/Token/TokenCompatSubscriber.php
@@ -63,7 +63,8 @@ class TokenCompatSubscriber implements EventSubscriberInterface {
         $contact = reset($contact);
         if (!$contact || is_a($contact, 'CRM_Core_Error')) {
           // FIXME: Need to differentiate errors which kill the batch vs the individual row.
-          throw new TokenException("Failed to generate token data. Invalid contact ID: " . $row->context['contactId']);
+          \Civi::log()->debug("Failed to generate token data. Invalid contact ID: " . $row->context['contactId']);
+          continue;
         }
 
         //update value of custom field token
diff --git a/civicrm/ang/api4Explorer/Explorer.js b/civicrm/ang/api4Explorer/Explorer.js
index 09db7d1d02..3ada1557e0 100644
--- a/civicrm/ang/api4Explorer/Explorer.js
+++ b/civicrm/ang/api4Explorer/Explorer.js
@@ -138,9 +138,8 @@
     }
 
     function addJoins(fieldList, addWildcard) {
-      var fields = _.cloneDeep(fieldList),
-        fks = _.findWhere(links, {entity: $scope.entity}) || {};
-      _.each(fks.links, function(link) {
+      var fields = _.cloneDeep(fieldList);
+      _.each(links[$scope.entity], function(link) {
         var linkFields = _.cloneDeep(entityFields(link.entity)),
           wildCard = addWildcard ? [{id: link.alias + '.*', text: link.alias + '.*', 'description': 'All core ' + link.entity + ' fields'}] : [];
         if (linkFields) {
@@ -1066,8 +1065,7 @@
         return comboName;
       }
       var linkName = fieldNames.shift(),
-        entityLinks = _.findWhere(links, {entity: entity}).links,
-        newEntity = _.findWhere(entityLinks, {alias: linkName}).entity;
+        newEntity = _.findWhere(links[entity], {alias: linkName}).entity;
       return get(newEntity, fieldNames);
     }
   }
diff --git a/civicrm/api/api.php b/civicrm/api/api.php
index 43902e227c..8208af08db 100644
--- a/civicrm/api/api.php
+++ b/civicrm/api/api.php
@@ -184,12 +184,7 @@ function _civicrm_api3_api_getfields(&$apiRequest) {
  *   true if error, false otherwise
  */
 function civicrm_error($result) {
-  if (is_array($result)) {
-    return (array_key_exists('is_error', $result) &&
-      $result['is_error']
-    ) ? TRUE : FALSE;
-  }
-  return FALSE;
+  return is_array($result) && !empty($result['is_error']);
 }
 
 /**
@@ -267,7 +262,7 @@ function _civicrm_api_replace_variable($value, $parentResult, $separator) {
       if (array_key_exists($fieldname, $parentResult) && is_array($parentResult[$fieldname])) {
         $arrayLocation = $parentResult[$fieldname];
         foreach ($stringParts as $key => $innerValue) {
-          $arrayLocation = CRM_Utils_Array::value($innerValue, $arrayLocation);
+          $arrayLocation = $arrayLocation[$innerValue] ?? NULL;
         }
         $value = $arrayLocation;
       }
diff --git a/civicrm/api/v3/Activity.php b/civicrm/api/v3/Activity.php
index 8a41a70b7c..d02aaa2d02 100644
--- a/civicrm/api/v3/Activity.php
+++ b/civicrm/api/v3/Activity.php
@@ -556,7 +556,7 @@ function _civicrm_api3_activity_get_formatResult($params, $activities, $options)
     ]);
     foreach ($activities as &$activity) {
       if (!empty($activity['case_id'])) {
-        $case = CRM_Utils_Array::value($activity['case_id'][0], $cases['values']);
+        $case = $cases['values'][$activity['case_id'][0]] ?? NULL;
         if ($case) {
           foreach ($case as $key => $value) {
             if ($key != 'id') {
@@ -644,13 +644,13 @@ function _civicrm_api3_activity_fill_activity_contact_names(&$activities, $param
     $recordType = $typeMap[$activityContact['record_type_id']];
     if (in_array($recordType, ['target', 'assignee'])) {
       $activities[$activityContact['activity_id']][$recordType . '_contact_id'][] = $contactID;
-      $activities[$activityContact['activity_id']][$recordType . '_contact_name'][$contactID] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : '';
-      $activities[$activityContact['activity_id']][$recordType . '_contact_sort_name'][$contactID] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : '';
+      $activities[$activityContact['activity_id']][$recordType . '_contact_name'][$contactID] = $activityContact['contact_id.display_name'] ?? '';
+      $activities[$activityContact['activity_id']][$recordType . '_contact_sort_name'][$contactID] = $activityContact['contact_id.sort_name'] ?? '';
     }
     else {
       $activities[$activityContact['activity_id']]['source_contact_id'] = $contactID;
-      $activities[$activityContact['activity_id']]['source_contact_name'] = isset($activityContact['contact_id.display_name']) ? $activityContact['contact_id.display_name'] : '';
-      $activities[$activityContact['activity_id']]['source_contact_sort_name'] = isset($activityContact['contact_id.sort_name']) ? $activityContact['contact_id.sort_name'] : '';
+      $activities[$activityContact['activity_id']]['source_contact_name'] = $activityContact['contact_id.display_name'] ?? '';
+      $activities[$activityContact['activity_id']]['source_contact_sort_name'] = $activityContact['contact_id.sort_name'] ?? '';
     }
   }
 }
@@ -689,9 +689,9 @@ function civicrm_api3_activity_delete($params) {
  */
 function _civicrm_api3_activity_check_params(&$params) {
   $activityIds = [
-    'activity' => CRM_Utils_Array::value('id', $params),
-    'parent' => CRM_Utils_Array::value('parent_id', $params),
-    'original' => CRM_Utils_Array::value('original_id', $params),
+    'activity' => $params['id'] ?? NULL,
+    'parent' => $params['parent_id'] ?? NULL,
+    'original' => $params['original_id'] ?? NULL,
   ];
 
   foreach ($activityIds as $id => $value) {
@@ -705,14 +705,14 @@ function _civicrm_api3_activity_check_params(&$params) {
   //correctly by doing pseudoconstant validation
   // needs testing
   $activityTypes = CRM_Activity_BAO_Activity::buildOptions('activity_type_id', 'validate');
-  $activityName = CRM_Utils_Array::value('activity_name', $params);
+  $activityName = $params['activity_name'] ?? NULL;
   $activityName = ucfirst($activityName);
-  $activityLabel = CRM_Utils_Array::value('activity_label', $params);
+  $activityLabel = $params['activity_label'] ?? NULL;
   if ($activityLabel) {
     $activityTypes = CRM_Activity_BAO_Activity::buildOptions('activity_type_id', 'create');
   }
 
-  $activityTypeId = CRM_Utils_Array::value('activity_type_id', $params);
+  $activityTypeId = $params['activity_type_id'] ?? NULL;
 
   if ($activityName || $activityLabel) {
     $activityTypeIdInList = array_search(($activityName ? $activityName : $activityLabel), $activityTypes);
diff --git a/civicrm/api/v3/Attachment.php b/civicrm/api/v3/Attachment.php
index b2834091f8..1e78d6796b 100644
--- a/civicrm/api/v3/Attachment.php
+++ b/civicrm/api/v3/Attachment.php
@@ -338,7 +338,7 @@ function __civicrm_api3_attachment_find($params, $id, $file, $entityFile, $isTru
  * @throws API_Exception validation errors
  */
 function _civicrm_api3_attachment_parse_params($params) {
-  $id = CRM_Utils_Array::value('id', $params, NULL);
+  $id = $params['id'] ?? NULL;
   if ($id && !is_numeric($id)) {
     throw new API_Exception("Malformed id");
   }
@@ -385,7 +385,7 @@ function _civicrm_api3_attachment_parse_params($params) {
 
   $isTrusted = empty($params['check_permissions']);
 
-  $returns = isset($params['return']) ? $params['return'] : [];
+  $returns = $params['return'] ?? [];
   $returns = is_array($returns) ? $returns : [$returns];
   $returnContent = in_array('content', $returns);
 
diff --git a/civicrm/api/v3/Case.php b/civicrm/api/v3/Case.php
index 3cf80ca99e..1f5b9b6ae4 100644
--- a/civicrm/api/v3/Case.php
+++ b/civicrm/api/v3/Case.php
@@ -145,19 +145,19 @@ function _civicrm_api3_case_create_xmlProcessor($params, $caseBAO) {
   // Initialize XML processor with $params
   $xmlProcessor = new CRM_Case_XMLProcessor_Process();
   $xmlProcessorParams = [
-    'clientID' => CRM_Utils_Array::value('contact_id', $params),
-    'creatorID' => CRM_Utils_Array::value('creator_id', $params),
+    'clientID' => $params['contact_id'] ?? NULL,
+    'creatorID' => $params['creator_id'] ?? NULL,
     'standardTimeline' => 1,
     'activityTypeName' => 'Open Case',
-    'caseID' => CRM_Utils_Array::value('id', $params),
-    'subject' => CRM_Utils_Array::value('subject', $params),
-    'location' => CRM_Utils_Array::value('location', $params),
-    'activity_date_time' => CRM_Utils_Array::value('start_date', $params),
-    'duration' => CRM_Utils_Array::value('duration', $params),
-    'medium_id' => CRM_Utils_Array::value('medium_id', $params),
-    'details' => CRM_Utils_Array::value('details', $params),
+    'caseID' => $params['id'] ?? NULL,
+    'subject' => $params['subject'] ?? NULL,
+    'location' => $params['location'] ?? NULL,
+    'activity_date_time' => $params['start_date'] ?? NULL,
+    'duration' => $params['duration'] ?? NULL,
+    'medium_id' => $params['medium_id'] ?? NULL,
+    'details' => $params['details'] ?? NULL,
     'custom' => [],
-    'relationship_end_date' => CRM_Utils_Array::value('end_date', $params),
+    'relationship_end_date' => $params['end_date'] ?? NULL,
   ];
 
   // Do it! :-D
diff --git a/civicrm/api/v3/CaseContact.php b/civicrm/api/v3/CaseContact.php
index cc535fda90..1139f98614 100644
--- a/civicrm/api/v3/CaseContact.php
+++ b/civicrm/api/v3/CaseContact.php
@@ -82,7 +82,7 @@ function _civicrm_api3_case_contact_getlist_output($result, $request, $entity, $
         $row['case_id.subject'],
       ];
       if (!empty($request['image_field'])) {
-        $data['image'] = isset($row[$request['image_field']]) ? $row[$request['image_field']] : '';
+        $data['image'] = $row[$request['image_field']] ?? '';
       }
       $output[] = $data;
     }
diff --git a/civicrm/api/v3/Contact.php b/civicrm/api/v3/Contact.php
index 1b7f9cade8..bbbf007576 100644
--- a/civicrm/api/v3/Contact.php
+++ b/civicrm/api/v3/Contact.php
@@ -27,10 +27,12 @@
  * @param array $params
  *   Input parameters.
  *
- * @throws API_Exception
- *
  * @return array
  *   API Result Array
+ *
+ * @throws \CiviCRM_API3_Exception
+ * @throws API_Exception
+ * @throws \CRM_Core_Exception
  */
 function civicrm_api3_contact_create($params) {
   $contactID = CRM_Utils_Array::value('contact_id', $params, CRM_Utils_Array::value('id', $params));
@@ -152,6 +154,7 @@ function _civicrm_api3_contact_create_spec(&$params) {
  *   API Result Array
  *
  * @throws \API_Exception
+ * @throws \CiviCRM_API3_Exception
  */
 function civicrm_api3_contact_get($params) {
   $options = [];
@@ -169,6 +172,7 @@ function civicrm_api3_contact_get($params) {
  * @param array $params
  *
  * @return int
+ * @throws \API_Exception
  */
 function civicrm_api3_contact_getcount($params) {
   $options = [];
@@ -444,37 +448,36 @@ function _civicrm_api3_contact_get_supportanomalies(&$params, &$options) {
  * @param array $params
  *   input parameters per getfields
  *
- * @throws \Civi\API\Exception\UnauthorizedException
  * @return array
  *   API Result Array
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
+ * @throws \Civi\API\Exception\UnauthorizedException
  */
 function civicrm_api3_contact_delete($params) {
-  $contactID = CRM_Utils_Array::value('id', $params);
+  $contactID = (int) $params['id'];
 
   if (!empty($params['check_permissions']) && !CRM_Contact_BAO_Contact_Permission::allow($contactID, CRM_Core_Permission::DELETE)) {
     throw new \Civi\API\Exception\UnauthorizedException('Permission denied to modify contact record');
   }
 
-  $session = CRM_Core_Session::singleton();
-  if ($contactID == $session->get('userID')) {
-    return civicrm_api3_create_error('This contact record is linked to the currently logged in user account - and cannot be deleted.');
+  if ($contactID == CRM_Core_Session::getLoggedInContactID()) {
+    throw new API_Exception('This contact record is linked to the currently logged in user account - and cannot be deleted.');
   }
-  $restore = !empty($params['restore']) ? $params['restore'] : FALSE;
-  $skipUndelete = !empty($params['skip_undelete']) ? $params['skip_undelete'] : FALSE;
+  $restore = !empty($params['restore']);
+  $skipUndelete = !empty($params['skip_undelete']);
 
   // CRM-12929
   // restrict permanent delete if a contact has financial trxn associated with it
   $error = NULL;
   if ($skipUndelete && CRM_Financial_BAO_FinancialItem::checkContactPresent([$contactID], $error)) {
-    return civicrm_api3_create_error($error['_qf_default']);
+    throw new API_Exception($error['_qf_default']);
   }
   if (CRM_Contact_BAO_Contact::deleteContact($contactID, $restore, $skipUndelete,
     CRM_Utils_Array::value('check_permissions', $params))) {
     return civicrm_api3_create_success();
   }
-  else {
-    return civicrm_api3_create_error('Could not delete contact');
-  }
+  throw new CiviCRM_API3_Exception('Could not delete contact');
 }
 
 /**
@@ -557,6 +560,10 @@ function _civicrm_api3_contact_check_params(&$params) {
  *   If present the contact with that ID is updated.
  *
  * @return CRM_Contact_BAO_Contact|CRM_Core_Error
+ *
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
+ * @throws \Civi\API\Exception\UnauthorizedException
  */
 function _civicrm_api3_contact_update($params, $contactID = NULL) {
   //@todo - doesn't contact create support 'id' which is already set- check & remove
@@ -574,6 +581,7 @@ function _civicrm_api3_contact_update($params, $contactID = NULL) {
  *   Array per getfields metadata.
  *
  * @throws API_Exception
+ * @throws \CRM_Core_Exception
  */
 function _civicrm_api3_greeting_format_params($params) {
   $greetingParams = ['', '_id', '_custom'];
@@ -607,9 +615,9 @@ function _civicrm_api3_greeting_format_params($params) {
     ];
 
     $greetings = CRM_Core_PseudoConstant::greeting($filter);
-    $greetingId = CRM_Utils_Array::value("{$key}{$greeting}_id", $params);
-    $greetingVal = CRM_Utils_Array::value("{$key}{$greeting}", $params);
-    $customGreeting = CRM_Utils_Array::value("{$key}{$greeting}_custom", $params);
+    $greetingId = $params["{$key}{$greeting}_id"] ?? NULL;
+    $greetingVal = $params["{$key}{$greeting}"] ?? NULL;
+    $customGreeting = $params["{$key}{$greeting}_custom"] ?? NULL;
 
     if (!$greetingId && $greetingVal) {
       $params["{$key}{$greeting}_id"] = CRM_Utils_Array::key($params["{$key}{$greeting}"], $greetings);
@@ -862,7 +870,7 @@ function civicrm_api3_contact_getquick($params) {
   }
   $actualSelectElements = implode(', ', $actualSelectElements);
   $from = implode(' ', $from);
-  $limit = (int) CRM_Utils_Array::value('limit', $params);
+  $limit = (int) ($params['limit'] ?? 0);
   $limit = $limit > 0 ? $limit : Civi::settings()->get('search_autocomplete_count');
 
   // add acl clause here
@@ -1032,7 +1040,7 @@ function civicrm_api3_contact_getquick($params) {
   while ($dao->fetch()) {
     $t = ['id' => $dao->id];
     foreach ($as as $k) {
-      $t[$k] = isset($dao->$k) ? $dao->$k : '';
+      $t[$k] = $dao->$k ?? '';
     }
     $t['data'] = $dao->data;
     // Replace keys with values when displaying fields from an option list
@@ -1151,7 +1159,10 @@ function _civicrm_api3_contact_deprecation() {
  *
  * @return array
  *   API Result Array
+ *
  * @throws API_Exception
+ * @throws \CiviCRM_API3_Exception
+ * @throws \CRM_Core_Exception
  */
 function civicrm_api3_contact_merge($params) {
   if (($result = CRM_Dedupe_Merger::merge(
@@ -1254,7 +1265,8 @@ function _civicrm_api3_contact_get_merge_conflicts_spec(&$params) {
  *
  * @return array
  *   API Result Array
- * @throws API_Exception
+ *
+ * @throws \CiviCRM_API3_Exception
  */
 function civicrm_api3_contact_getmergedto($params) {
   $contactID = _civicrm_api3_contact_getmergedto($params);
@@ -1277,6 +1289,8 @@ function civicrm_api3_contact_getmergedto($params) {
  * @param array $params
  *
  * @return int|false
+ *
+ * @throws \CiviCRM_API3_Exception
  */
 function _civicrm_api3_contact_getmergedto($params) {
   $contactID = FALSE;
@@ -1328,7 +1342,8 @@ function _civicrm_api3_contact_getmergedto_spec(&$params) {
  *
  * @return array
  *   API Result Array
- * @throws API_Exception
+ *
+ * @throws \CiviCRM_API3_Exception
  */
 function civicrm_api3_contact_getmergedfrom($params) {
   $contacts = _civicrm_api3_contact_getmergedfrom($params);
@@ -1341,6 +1356,8 @@ function civicrm_api3_contact_getmergedfrom($params) {
  * @param array $params
  *
  * @return array
+ *
+ * @throws \CiviCRM_API3_Exception
  */
 function _civicrm_api3_contact_getmergedfrom($params) {
   $activities = [];
@@ -1423,11 +1440,11 @@ function _civicrm_api3_contact_proximity_spec(&$params) {
  * @throws Exception
  */
 function civicrm_api3_contact_proximity($params) {
-  $latitude = CRM_Utils_Array::value('latitude', $params);
-  $longitude = CRM_Utils_Array::value('longitude', $params);
-  $distance = CRM_Utils_Array::value('distance', $params);
+  $latitude = $params['latitude'] ?? NULL;
+  $longitude = $params['longitude'] ?? NULL;
+  $distance = $params['distance'] ?? NULL;
 
-  $unit = CRM_Utils_Array::value('unit', $params);
+  $unit = $params['unit'] ?? NULL;
 
   // check and ensure that lat/long and distance are floats
   if (
@@ -1435,10 +1452,10 @@ function civicrm_api3_contact_proximity($params) {
     !CRM_Utils_Rule::numeric($longitude) ||
     !CRM_Utils_Rule::numeric($distance)
   ) {
-    throw new Exception(ts('Latitude, Longitude and Distance should exist and be numeric'));
+    throw new API_Exception(ts('Latitude, Longitude and Distance should exist and be numeric'));
   }
 
-  if ($unit == "mile") {
+  if ($unit === 'mile') {
     $conversionFactor = 1609.344;
   }
   else {
@@ -1493,7 +1510,7 @@ function _civicrm_api3_contact_getlist_params(&$request) {
   // If we are doing quicksearch by a field other than name, make sure that field is added to results
   $field_name = CRM_Utils_String::munge($request['search_field']);
   // Unique name contact_id = id
-  if ($field_name == 'contact_id') {
+  if ($field_name === 'contact_id') {
     $field_name = 'id';
   }
   // phone_numeric should be phone
@@ -1509,7 +1526,7 @@ function _civicrm_api3_contact_getlist_params(&$request) {
   if (!empty($request['input'])) {
     $request['params'][$request['search_field']] = $request['input'];
     // Temporarily override wildcard setting
-    if (Civi::settings()->get('includeWildCardInName') != $request['add_wildcard']) {
+    if (Civi::settings()->get('includeWildCardInName') !== $request['add_wildcard']) {
       Civi::$statics['civicrm_api3_contact_getlist']['override_wildcard'] = !$request['add_wildcard'];
       Civi::settings()->set('includeWildCardInName', $request['add_wildcard']);
     }
@@ -1557,7 +1574,7 @@ function _civicrm_api3_contact_getlist_output($result, $request) {
         $data['description'][] = implode(' ', $address);
       }
       if (!empty($request['image_field'])) {
-        $data['image'] = isset($row[$request['image_field']]) ? $row[$request['image_field']] : '';
+        $data['image'] = $row[$request['image_field']] ?? '';
       }
       else {
         $data['icon_class'] = $row['contact_type'];
@@ -1581,6 +1598,8 @@ function _civicrm_api3_contact_getlist_output($result, $request) {
  *
  * @return array
  *   API formatted array
+ *
+ * @throws \CiviCRM_API3_Exception
  */
 function civicrm_api3_contact_duplicatecheck($params) {
   $dupes = CRM_Contact_BAO_Contact::getDuplicateContacts(
@@ -1596,9 +1615,9 @@ function civicrm_api3_contact_duplicatecheck($params) {
     return civicrm_api3('Contact', 'get', [
       'return' => $params['return'],
       'id' => ['IN' => $dupes],
-      'options' => CRM_Utils_Array::value('options', $params),
-      'sequential' => CRM_Utils_Array::value('sequential', $params),
-      'check_permissions' => CRM_Utils_Array::value('check_permissions', $params),
+      'options' => $params['options'] ?? NULL,
+      'sequential' => $params['sequential'] ?? NULL,
+      'check_permissions' => $params['check_permissions'] ?? NULL,
     ]);
   }
   foreach ($dupes as $dupe) {
@@ -1610,7 +1629,7 @@ function civicrm_api3_contact_duplicatecheck($params) {
 /**
  * Declare metadata for contact dedupe function.
  *
- * @param $params
+ * @param array $params
  */
 function _civicrm_api3_contact_duplicatecheck_spec(&$params) {
   $params['dedupe_rule_id'] = [
diff --git a/civicrm/api/v3/Contribution.php b/civicrm/api/v3/Contribution.php
index 66dc25a66f..b9e633a03a 100644
--- a/civicrm/api/v3/Contribution.php
+++ b/civicrm/api/v3/Contribution.php
@@ -356,7 +356,7 @@ function _civicrm_api3_contribution_get_spec(&$params) {
 
   $params['financial_type_id']['api.aliases'] = ['contribution_type_id'];
   $params['payment_instrument_id']['api.aliases'] = ['contribution_payment_instrument', 'payment_instrument'];
-  $params['contact_id'] = CRM_Utils_Array::value('contribution_contact_id', $params);
+  $params['contact_id'] = $params['contribution_contact_id'] ?? NULL;
   $params['contact_id']['api.aliases'] = ['contribution_contact_id'];
   $params['is_template']['api.default'] = 0;
   unset($params['contribution_contact_id']);
@@ -672,8 +672,8 @@ function _ipn_process_transaction(&$params, $contribution, $input, $ids, $firstC
     $input['receipt_from_name'] = CRM_Utils_Array::value('receipt_from_name', $params, $domainFromName);
     $input['receipt_from_email'] = CRM_Utils_Array::value('receipt_from_email', $params, $domainFromEmail);
   }
-  $input['card_type_id'] = CRM_Utils_Array::value('card_type_id', $params);
-  $input['pan_truncation'] = CRM_Utils_Array::value('pan_truncation', $params);
+  $input['card_type_id'] = $params['card_type_id'] ?? NULL;
+  $input['pan_truncation'] = $params['pan_truncation'] ?? NULL;
   $transaction = new CRM_Core_Transaction();
   return CRM_Contribute_BAO_Contribution::completeOrder($input, $ids, $objects, $transaction,
      $contribution, CRM_Utils_Array::value('is_post_payment_create', $params));
diff --git a/civicrm/api/v3/ContributionPage.php b/civicrm/api/v3/ContributionPage.php
index 4202987d17..d744043f71 100644
--- a/civicrm/api/v3/ContributionPage.php
+++ b/civicrm/api/v3/ContributionPage.php
@@ -102,7 +102,7 @@ function civicrm_api3_contribution_page_validate($params) {
   // authorization from a payment processor like Paypal checkout) the lack of a qfKey will not result in a valid
   // one being generated so we generate one first.
   $originalRequest = $_REQUEST;
-  $qfKey = CRM_Utils_Array::value('qfKey', $_REQUEST);
+  $qfKey = $_REQUEST['qfKey'] ?? NULL;
   if (!$qfKey) {
     $_REQUEST['qfKey'] = CRM_Core_Key::get('CRM_Core_Controller', TRUE);
   }
diff --git a/civicrm/api/v3/CustomValue.php b/civicrm/api/v3/CustomValue.php
index a524d61571..0711224f00 100644
--- a/civicrm/api/v3/CustomValue.php
+++ b/civicrm/api/v3/CustomValue.php
@@ -347,14 +347,14 @@ function civicrm_api3_custom_value_gettree($params) {
     $result[$group['name']] = [];
     $groupToReturn = $toReturn['custom_group'] ? $toReturn['custom_group'] : array_keys($group);
     foreach ($groupToReturn as $item) {
-      $result[$group['name']][$item] = CRM_Utils_Array::value($item, $group);
+      $result[$group['name']][$item] = $group[$item] ?? NULL;
     }
     $result[$group['name']]['fields'] = [];
     foreach ($group['fields'] as $fieldInfo) {
       $field = ['value' => NULL];
       $fieldToReturn = $toReturn['custom_field'] ? $toReturn['custom_field'] : array_keys($fieldInfo);
       foreach ($fieldToReturn as $item) {
-        $field[$item] = CRM_Utils_Array::value($item, $fieldInfo);
+        $field[$item] = $fieldInfo[$item] ?? NULL;
       }
       unset($field['customValue']);
       if (!empty($fieldInfo['customValue'])) {
diff --git a/civicrm/api/v3/Dashboard.php b/civicrm/api/v3/Dashboard.php
index e38ead8353..4fa78a46e6 100644
--- a/civicrm/api/v3/Dashboard.php
+++ b/civicrm/api/v3/Dashboard.php
@@ -65,12 +65,8 @@ function civicrm_api3_dashboard_get($params) {
  *   Array holding 'id' of dashlet to be deleted.
  * @return array
  * @throws API_Exception
+ * @throws CiviCRM_API3_Exception
  */
 function civicrm_api3_dashboard_delete($params) {
-  if (CRM_Core_BAO_Dashboard::deleteDashlet($params['id'])) {
-    return civicrm_api3_create_success(1, $params, 'Dashboard', 'delete');
-  }
-  else {
-    throw new API_Exception('Could not delete dashlet');
-  }
+  return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }
diff --git a/civicrm/api/v3/DashboardContact.php b/civicrm/api/v3/DashboardContact.php
index e867a9bf48..1467d24f22 100644
--- a/civicrm/api/v3/DashboardContact.php
+++ b/civicrm/api/v3/DashboardContact.php
@@ -23,14 +23,6 @@
  * @return array
  */
 function civicrm_api3_dashboard_contact_create($params) {
-  if (empty($params['id'])) {
-    civicrm_api3_verify_one_mandatory($params,
-      NULL,
-      [
-        'dashboard_id',
-      ]
-    );
-  }
   $errors = _civicrm_api3_dashboard_contact_check_params($params);
   if ($errors !== NULL) {
     return $errors;
@@ -55,11 +47,11 @@ function civicrm_api3_dashboard_contact_get($params) {
  *
  * The metadata is used for setting defaults, documentation & validation.
  *
- * @param array $params
- *   Array of parameters determined by getfields.
+ * @param array $fields
+ *   Array of fields determined by getfields.
  */
-function _civicrm_api3_dashboard_contact_create_spec(&$params) {
-  unset($params['version']);
+function _civicrm_api3_dashboard_contact_create_spec(&$fields) {
+  $fields['dashboard_id']['api.required'] = TRUE;
 }
 
 /**
@@ -71,10 +63,9 @@ function _civicrm_api3_dashboard_contact_create_spec(&$params) {
  * @return array|null
  */
 function _civicrm_api3_dashboard_contact_check_params(&$params) {
-  $dashboard_id = CRM_Utils_Array::value('dashboard_id', $params);
-  if ($dashboard_id) {
-    $allDashlets = CRM_Core_BAO_Dashboard::getDashlets(TRUE, CRM_Utils_Array::value('check_permissions', $params, 0));
-    if (!isset($allDashlets[$dashboard_id])) {
+  if (!empty($params['dashboard_id'])) {
+    $allDashlets = CRM_Core_BAO_Dashboard::getDashlets(TRUE, $params['check_permissions'] ?? FALSE);
+    if (!isset($allDashlets[$params['dashboard_id']])) {
       return civicrm_api3_create_error('Invalid or inaccessible dashboard ID');
     }
   }
@@ -84,9 +75,6 @@ function _civicrm_api3_dashboard_contact_check_params(&$params) {
 /**
  * Delete an existing dashboard-contact.
  *
- * This method is used to delete any existing dashboard-board. the id of the dashboard-contact
- * is required field in $params array
- *
  * @param array $params
  *
  * @return array
diff --git a/civicrm/api/v3/Domain.php b/civicrm/api/v3/Domain.php
index 8ca245cb80..166179f88f 100644
--- a/civicrm/api/v3/Domain.php
+++ b/civicrm/api/v3/Domain.php
@@ -25,7 +25,7 @@
  */
 function civicrm_api3_domain_get($params) {
 
-  $params['version'] = CRM_Utils_Array::value('domain_version', $params);
+  $params['version'] = $params['domain_version'] ?? NULL;
   unset($params['version']);
 
   $bao = new CRM_Core_BAO_Domain();
@@ -54,14 +54,14 @@ function civicrm_api3_domain_get($params) {
       ];
 
       if (!empty($values['location']['email'])) {
-        $domain['domain_email'] = CRM_Utils_Array::value('email', $values['location']['email'][1]);
+        $domain['domain_email'] = $values['location']['email'][1]['email'] ?? NULL;
       }
 
       if (!empty($values['location']['phone'])) {
         $domain['domain_phone'] = [
           'phone_type' => CRM_Core_PseudoConstant::getLabel('CRM_Core_BAO_Phone', 'phone_type_id',
             CRM_Utils_Array::value('phone_type_id', $values['location']['phone'][1])),
-          'phone' => CRM_Utils_Array::value('phone', $values['location']['phone'][1]),
+          'phone' => $values['location']['phone'][1]['phone'] ?? NULL,
         ];
       }
 
diff --git a/civicrm/api/v3/EntityTag.php b/civicrm/api/v3/EntityTag.php
index f87a2c6700..cfc212a328 100644
--- a/civicrm/api/v3/EntityTag.php
+++ b/civicrm/api/v3/EntityTag.php
@@ -159,7 +159,7 @@ function civicrm_api3_entity_tag_replace($params) {
     // Lookup pre-existing records
     $preexisting = civicrm_api3('entity_tag', 'get', $baseParams);
     $preexisting = array_column($preexisting['values'], 'tag_id');
-    $toAdd = isset($params['tag_id']) ? $params['tag_id'] : array_column($params['values'], 'tag_id');
+    $toAdd = $params['tag_id'] ?? array_column($params['values'], 'tag_id');
     $toRemove = array_diff($preexisting, $toAdd);
 
     $result = [];
diff --git a/civicrm/api/v3/Generic.php b/civicrm/api/v3/Generic.php
index 549ed2a420..d8f2e92db4 100644
--- a/civicrm/api/v3/Generic.php
+++ b/civicrm/api/v3/Generic.php
@@ -60,8 +60,8 @@ function civicrm_api3_generic_getfields($apiRequest, $unique = TRUE) {
   }
   $entity = $apiRequest['entity'];
   $lowercase_entity = _civicrm_api_get_entity_name_from_camel($entity);
-  $subentity    = CRM_Utils_Array::value('contact_type', $apiRequest['params']);
-  $action = CRM_Utils_Array::value('action', $apiRequest['params']);
+  $subentity    = $apiRequest['params']['contact_type'] ?? NULL;
+  $action = $apiRequest['params']['action'] ?? NULL;
   $sequential = empty($apiRequest['params']['sequential']) ? 0 : 1;
   $apiRequest['params']['options'] = CRM_Utils_Array::value('options', $apiRequest['params'], []);
   $optionsToResolve = (array) CRM_Utils_Array::value('get_options', $apiRequest['params']['options'], []);
@@ -414,7 +414,7 @@ function civicrm_api3_generic_getoptions($apiRequest) {
     return civicrm_api3_create_error("The field '{$apiRequest['params']['field']}' doesn't exist.");
   }
   // Validate 'context' from params
-  $context = CRM_Utils_Array::value('context', $apiRequest['params']);
+  $context = $apiRequest['params']['context'] ?? NULL;
   CRM_Core_DAO::buildOptionsContext($context);
   unset($apiRequest['params']['context'], $apiRequest['params']['field'], $apiRequest['params']['condition']);
 
@@ -502,10 +502,10 @@ function _civicrm_api3_generic_get_metadata_options(&$metadata, $apiRequest, $fi
   }
 
   // Allow caller to specify context
-  $context = CRM_Utils_Array::value('get_options_context', $apiRequest['params']['options']);
+  $context = $apiRequest['params']['options']['get_options_context'] ?? NULL;
   // Default to api action if it is a supported context.
   if (!$context) {
-    $action = CRM_Utils_Array::value('action', $apiRequest['params']);
+    $action = $apiRequest['params']['action'] ?? NULL;
     $contexts = CRM_Core_DAO::buildOptionsContext();
     if (isset($contexts[$action])) {
       $context = $action;
@@ -513,7 +513,7 @@ function _civicrm_api3_generic_get_metadata_options(&$metadata, $apiRequest, $fi
   }
 
   $options = civicrm_api($apiRequest['entity'], 'getoptions', ['version' => 3, 'field' => $fieldname, 'context' => $context]);
-  if (is_array(CRM_Utils_Array::value('values', $options))) {
+  if (isset($options['values']) && is_array($options['values'])) {
     $metadata[$fieldname]['options'] = $options['values'];
   }
 }
diff --git a/civicrm/api/v3/Generic/Getlist.php b/civicrm/api/v3/Generic/Getlist.php
index 2473c36462..464bd09be0 100644
--- a/civicrm/api/v3/Generic/Getlist.php
+++ b/civicrm/api/v3/Generic/Getlist.php
@@ -182,7 +182,7 @@ function _civicrm_api3_generic_getlist_output($result, $request, $entity, $field
         }
       };
       if (!empty($request['image_field'])) {
-        $data['image'] = isset($row[$request['image_field']]) ? $row[$request['image_field']] : '';
+        $data['image'] = $row[$request['image_field']] ?? '';
       }
       if (isset($row[$request['color_field']])) {
         $data['color'] = $row[$request['color_field']];
@@ -210,10 +210,10 @@ function _civicrm_api3_generic_getlist_postprocess($result, $request, &$values)
   if (!empty($result['values'])) {
     foreach (array_values($result['values']) as $num => $row) {
       foreach ($request['extra'] as $field) {
-        $values[$num]['extra'][$field] = isset($row[$field]) ? $row[$field] : NULL;
+        $values[$num]['extra'][$field] = $row[$field] ?? NULL;
       }
       foreach ($chains as $chain) {
-        $values[$num][$chain] = isset($row[$chain]) ? $row[$chain] : NULL;
+        $values[$num][$chain] = $row[$chain] ?? NULL;
       }
     }
   }
diff --git a/civicrm/api/v3/GroupContact.php b/civicrm/api/v3/GroupContact.php
index 116ec298a6..250438378f 100644
--- a/civicrm/api/v3/GroupContact.php
+++ b/civicrm/api/v3/GroupContact.php
@@ -52,7 +52,7 @@ function civicrm_api3_group_contact_get($params) {
   }
   $status = CRM_Utils_Array::value('status', $params, 'Added');
 
-  $groupId = CRM_Utils_Array::value('group_id', $params);
+  $groupId = $params['group_id'] ?? NULL;
   $values = CRM_Contact_BAO_GroupContact::getContactGroup($params['contact_id'], $status, NULL, FALSE, TRUE, FALSE, TRUE, $groupId);
   return civicrm_api3_create_success($values, $params, 'GroupContact');
 }
@@ -219,7 +219,7 @@ function _civicrm_api3_group_contact_common($params, $op = 'Added') {
 
   $method = CRM_Utils_Array::value('method', $params, 'API');
   $status = CRM_Utils_Array::value('status', $params, $op);
-  $tracking = CRM_Utils_Array::value('tracking', $params);
+  $tracking = $params['tracking'] ?? NULL;
 
   if ($op == 'Added' || $op == 'Pending') {
     $extraReturnValues = [
diff --git a/civicrm/api/v3/Job.php b/civicrm/api/v3/Job.php
index 20a1e15d1f..252726d787 100644
--- a/civicrm/api/v3/Job.php
+++ b/civicrm/api/v3/Job.php
@@ -512,7 +512,7 @@ function civicrm_api3_job_process_respondent($params) {
  * @throws \CiviCRM_API3_Exception
  */
 function civicrm_api3_job_process_batch_merge($params) {
-  $rule_group_id = CRM_Utils_Array::value('rule_group_id', $params);
+  $rule_group_id = $params['rule_group_id'] ?? NULL;
   if (!$rule_group_id) {
     $rule_group_id = civicrm_api3('RuleGroup', 'getvalue', [
       'contact_type' => 'Individual',
@@ -521,8 +521,8 @@ function civicrm_api3_job_process_batch_merge($params) {
       'options' => ['limit' => 1],
     ]);
   }
-  $rgid = CRM_Utils_Array::value('rgid', $params);
-  $gid = CRM_Utils_Array::value('gid', $params);
+  $rgid = $params['rgid'] ?? NULL;
+  $gid = $params['gid'] ?? NULL;
   $mode = CRM_Utils_Array::value('mode', $params, 'safe');
 
   $result = CRM_Dedupe_Merger::batchMerge($rule_group_id, $gid, $mode, 1, 2, CRM_Utils_Array::value('criteria', $params, []), CRM_Utils_Array::value('check_permissions', $params), NULL, $params['search_limit']);
@@ -678,7 +678,7 @@ function civicrm_api3_job_group_rebuild($params) {
     throw new API_Exception('Could not acquire lock, another GroupRebuild process is running');
   }
 
-  $limit = CRM_Utils_Array::value('limit', $params, 0);
+  $limit = $params['limit'] ?? 0;
 
   CRM_Contact_BAO_GroupContactCache::loadAll(NULL, $limit);
   $lock->release();
diff --git a/civicrm/api/v3/Mailing.php b/civicrm/api/v3/Mailing.php
index fc7645a049..185b3cd374 100644
--- a/civicrm/api/v3/Mailing.php
+++ b/civicrm/api/v3/Mailing.php
@@ -192,7 +192,7 @@ function civicrm_api3_mailing_clone($params) {
   $get = civicrm_api3('Mailing', 'getsingle', ['id' => $params['id']]);
 
   $newParams = [];
-  $newParams['debug'] = CRM_Utils_Array::value('debug', $params);
+  $newParams['debug'] = $params['debug'] ?? NULL;
   $newParams['groups']['include'] = [];
   $newParams['groups']['exclude'] = [];
   $newParams['mailings']['include'] = [];
@@ -393,9 +393,9 @@ function civicrm_api3_mailing_event_reply($params) {
   $queue     = $params['event_queue_id'];
   $hash      = $params['hash'];
   $replyto   = $params['replyTo'];
-  $bodyTxt   = CRM_Utils_Array::value('bodyTxt', $params);
-  $bodyHTML  = CRM_Utils_Array::value('bodyHTML', $params);
-  $fullEmail = CRM_Utils_Array::value('fullEmail', $params);
+  $bodyTxt   = $params['bodyTxt'] ?? NULL;
+  $bodyHTML  = $params['bodyHTML'] ?? NULL;
+  $fullEmail = $params['fullEmail'] ?? NULL;
 
   $mailing = CRM_Mailing_Event_BAO_Reply::reply($job, $queue, $hash, $replyto);
 
@@ -440,8 +440,8 @@ function civicrm_api3_mailing_event_forward($params) {
   $queue     = $params['event_queue_id'];
   $hash      = $params['hash'];
   $email     = $params['email'];
-  $fromEmail = CRM_Utils_Array::value('fromEmail', $params);
-  $params    = CRM_Utils_Array::value('params', $params);
+  $fromEmail = $params['fromEmail'] ?? NULL;
+  $params    = $params['params'] ?? NULL;
 
   $forward = CRM_Mailing_Event_BAO_Forward::forward($job, $queue, $hash, $email, $fromEmail, $params);
 
@@ -538,7 +538,7 @@ function civicrm_api3_mailing_preview($params) {
   }
 
   $mailing = new CRM_Mailing_BAO_Mailing();
-  $mailingID = CRM_Utils_Array::value('id', $params);
+  $mailingID = $params['id'] ?? NULL;
   if ($mailingID) {
     $mailing->id = $mailingID;
     $mailing->find(TRUE);
@@ -555,7 +555,7 @@ function civicrm_api3_mailing_preview($params) {
   $attachments = CRM_Core_BAO_File::getEntityFile('civicrm_mailing', $mailing->id);
 
   $returnProperties = $mailing->getReturnProperties();
-  $contactID = CRM_Utils_Array::value('contact_id', $params);
+  $contactID = $params['contact_id'] ?? NULL;
   if (!$contactID) {
     // If we still don't have a userID in a session because we are annon then set contactID to be 0
     $contactID = empty($session->get('userID')) ? 0 : $session->get('userID');
@@ -564,7 +564,7 @@ function civicrm_api3_mailing_preview($params) {
 
   if (!$contactID) {
     $details = CRM_Utils_Token::getAnonymousTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
-    $details = CRM_Utils_Array::value(0, $details[0]);
+    $details = $details[0][0] ?? NULL;
   }
   else {
     $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
diff --git a/civicrm/api/v3/MailingEventSubscribe.php b/civicrm/api/v3/MailingEventSubscribe.php
index b594d772ac..92a8795bdb 100644
--- a/civicrm/api/v3/MailingEventSubscribe.php
+++ b/civicrm/api/v3/MailingEventSubscribe.php
@@ -29,7 +29,7 @@
 function civicrm_api3_mailing_event_subscribe_create($params) {
   $email      = $params['email'];
   $group_id   = $params['group_id'];
-  $contact_id = CRM_Utils_Array::value('contact_id', $params);
+  $contact_id = $params['contact_id'] ?? NULL;
 
   $group            = new CRM_Contact_DAO_Group();
   $group->is_active = 1;
diff --git a/civicrm/api/v3/Membership.php b/civicrm/api/v3/Membership.php
index 879aeb80ad..8e935373d1 100644
--- a/civicrm/api/v3/Membership.php
+++ b/civicrm/api/v3/Membership.php
@@ -208,7 +208,7 @@ function _civicrm_api3_membership_get_spec(&$params) {
 function civicrm_api3_membership_get($params) {
   $activeOnly = $membershipTypeId = $membershipType = NULL;
 
-  $contactID = CRM_Utils_Array::value('contact_id', $params);
+  $contactID = $params['contact_id'] ?? NULL;
   if (!empty($params['filters']) && is_array($params['filters']) && isset($params['filters']['is_current'])) {
     $activeOnly = $params['filters']['is_current'];
     unset($params['filters']['is_current']);
@@ -291,7 +291,7 @@ function _civicrm_api3_membership_relationsship_get_customv2behaviour(&$params,
 
     // populating relationship type name.
     $relationshipType = new CRM_Contact_BAO_RelationshipType();
-    $relationshipType->id = CRM_Utils_Array::value('relationship_type_id', $membershipType);
+    $relationshipType->id = $membershipType['relationship_type_id'] ?? NULL;
     if ($relationshipType->find(TRUE)) {
       $membershipValues[$membershipId]['relationship_name'] = $relationshipType->name_a_b;
     }
diff --git a/civicrm/api/v3/MembershipStatus.php b/civicrm/api/v3/MembershipStatus.php
index 97421d09d9..f49c269435 100644
--- a/civicrm/api/v3/MembershipStatus.php
+++ b/civicrm/api/v3/MembershipStatus.php
@@ -72,7 +72,7 @@ function civicrm_api3_membership_status_update($params) {
 
   civicrm_api3_verify_mandatory($params, NULL, ['id']);
   //don't allow duplicate names.
-  $name = CRM_Utils_Array::value('name', $params);
+  $name = $params['name'] ?? NULL;
   if ($name) {
     $status = new CRM_Member_DAO_MembershipStatus();
     $status->name = $params['name'];
diff --git a/civicrm/api/v3/Order.php b/civicrm/api/v3/Order.php
index 464dcd4270..99b270ec29 100644
--- a/civicrm/api/v3/Order.php
+++ b/civicrm/api/v3/Order.php
@@ -74,7 +74,7 @@ function civicrm_api3_order_create($params) {
   civicrm_api3_verify_one_mandatory($params, NULL, ['line_items', 'total_amount']);
   $entity = NULL;
   $entityIds = [];
-  $contributionStatus = CRM_Utils_Array::value('contribution_status_id', $params);
+  $contributionStatus = $params['contribution_status_id'] ?? NULL;
   if ($contributionStatus !== 'Pending' && 'Pending' !== CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $contributionStatus)) {
     CRM_Core_Error::deprecatedFunctionWarning("Creating a Order with a status other than pending is deprecated. Currently empty defaults to 'Completed' so as a transition not passing in 'Pending' is deprecated. You can chain payment creation e.g civicrm_api3('Order', 'create', ['blah' => 'blah', 'contribution_status_id' => 'Pending', 'api.Payment.create => ['total_amount' => 5]]");
   }
diff --git a/civicrm/api/v3/Payment.php b/civicrm/api/v3/Payment.php
index cab15b3f3c..32cff589fd 100644
--- a/civicrm/api/v3/Payment.php
+++ b/civicrm/api/v3/Payment.php
@@ -30,7 +30,7 @@ function civicrm_api3_payment_get($params) {
   $financialTrxn = [];
   $limit = '';
   if (isset($params['options']) && !empty($params['options']['limit'])) {
-    $limit = CRM_Utils_Array::value('limit', $params['options']);
+    $limit = $params['options']['limit'] ?? NULL;
   }
   $params['options']['limit'] = 0;
   if (isset($params['trxn_id'])) {
diff --git a/civicrm/api/v3/Profile.php b/civicrm/api/v3/Profile.php
index 73ea34dc7a..fb0597faf5 100644
--- a/civicrm/api/v3/Profile.php
+++ b/civicrm/api/v3/Profile.php
@@ -36,7 +36,7 @@
  * @throws API_Exception
  */
 function civicrm_api3_profile_get($params) {
-  $nonStandardLegacyBehaviour = is_numeric($params['profile_id']) ? TRUE : FALSE;
+  $nonStandardLegacyBehaviour = is_numeric($params['profile_id']);
   if (!empty($params['check_permissions']) && !empty($params['contact_id']) && !1 === civicrm_api3('contact', 'getcount', ['contact_id' => $params['contact_id'], 'check_permissions' => 1])) {
     throw new API_Exception('permission denied');
   }
@@ -63,7 +63,7 @@ function civicrm_api3_profile_get($params) {
       NULL,
       FALSE,
       NULL,
-      empty($params['check_permissions']) ? FALSE : TRUE,
+      empty($params['check_permissions']),
       NULL,
       CRM_Core_Permission::EDIT
     );
@@ -296,7 +296,7 @@ function _civicrm_api3_profile_submit_spec(&$params, $apirequest) {
     //@todo get_options should take an array - @ the moment it is only takes 'all' - which is supported
     // by other getfields fn
     // we don't resolve state, country & county for performance reasons
-    $resolveOptions = CRM_Utils_Array::value('get_options', $apirequest['params']) == 'all' ? TRUE : FALSE;
+    $resolveOptions = ($apirequest['params']['get_options'] ?? NULL) == 'all';
     $profileID = _civicrm_api3_profile_getProfileID($apirequest['params']['profile_id']);
     $params = _civicrm_api3_buildprofile_submitfields($profileID, $resolveOptions, CRM_Utils_Array::value('cache_clear', $params));
   }
@@ -442,17 +442,17 @@ function _civicrm_api3_profile_getbillingpseudoprofile(&$params) {
 
   if (!empty($result['api.address.get.1']['count'])) {
     foreach ($addressFields as $fieldname) {
-      $values['billing_' . $fieldname . '-' . $locationTypeID] = isset($result['api.address.get.1']['values'][0][$fieldname]) ? $result['api.address.get.1']['values'][0][$fieldname] : '';
+      $values['billing_' . $fieldname . '-' . $locationTypeID] = $result['api.address.get.1']['values'][0][$fieldname] ?? '';
     }
   }
   elseif (!empty($result['api.address.get.2']['count'])) {
     foreach ($addressFields as $fieldname) {
-      $values['billing_' . $fieldname . '-' . $locationTypeID] = isset($result['api.address.get.2']['values'][0][$fieldname]) ? $result['api.address.get.2']['values'][0][$fieldname] : '';
+      $values['billing_' . $fieldname . '-' . $locationTypeID] = $result['api.address.get.2']['values'][0][$fieldname] ?? '';
     }
   }
   else {
     foreach ($addressFields as $fieldname) {
-      $values['billing_' . $fieldname . '-' . $locationTypeID] = isset($result[$fieldname]) ? $result[$fieldname] : '';
+      $values['billing_' . $fieldname . '-' . $locationTypeID] = $result[$fieldname] ?? '';
     }
   }
 
@@ -515,10 +515,10 @@ function _civicrm_api3_buildprofile_submitfields($profileID, $optionsBehaviour =
     $profileFields[$profileID][$fieldName] = array_merge([
       'api.required' => $field['is_required'],
       'title' => $field['label'],
-      'help_pre' => CRM_Utils_Array::value('help_pre', $field),
-      'help_post' => CRM_Utils_Array::value('help_post', $field),
+      'help_pre' => $field['help_pre'] ?? NULL,
+      'help_post' => $field['help_post'] ?? NULL,
       'entity' => $entity,
-      'weight' => CRM_Utils_Array::value('weight', $field),
+      'weight' => $field['weight'] ?? NULL,
     ], $aliasArray);
 
     $ufFieldTaleFieldName = $field['field_name'];
@@ -608,13 +608,13 @@ function _civicrm_api3_buildprofile_submitfields($profileID, $optionsBehaviour =
 }
 
 /**
- * @param $a
- * @param $b
+ * @param array $a
+ * @param array $b
  *
  * @return bool
  */
 function _civicrm_api3_order_by_weight($a, $b) {
-  return CRM_Utils_Array::value('weight', $b) < CRM_Utils_Array::value('weight', $a) ? TRUE : FALSE;
+  return ($b['weight'] ?? 0) < ($a['weight'] ?? 0);
 }
 
 /**
@@ -731,7 +731,7 @@ function _civicrm_api3_profile_appendaliases($values, $entity) {
   }
   //special case on membership & contribution - can't see how to handle in a generic way
   if (in_array($entity, ['membership', 'contribution'])) {
-    $values['send_receipt'] = ['title' => 'Send Receipt', 'type' => (int) 16];
+    $values['send_receipt'] = ['title' => 'Send Receipt', 'type' => 16];
   }
   return $values;
 }
diff --git a/civicrm/api/v3/Setting.php b/civicrm/api/v3/Setting.php
index dc5fc1d6e9..2f6e7ee6d8 100644
--- a/civicrm/api/v3/Setting.php
+++ b/civicrm/api/v3/Setting.php
@@ -132,10 +132,10 @@ function _civicrm_api3_setting_getdefaults_spec(&$params) {
  * @throws \API_Exception
  */
 function civicrm_api3_setting_getoptions($params) {
-  $domainId = CRM_Utils_Array::value('domain_id', $params);
+  $domainId = $params['domain_id'] ?? NULL;
   $specs = \Civi\Core\SettingsMetadata::getMetadata(['name' => $params['field']], $domainId, TRUE);
 
-  if (empty($specs[$params['field']]) || !is_array(CRM_Utils_Array::value('options', $specs[$params['field']]))) {
+  if (!isset($specs[$params['field']]['options']) || !is_array($specs[$params['field']]['options'])) {
     throw new API_Exception("The field '" . $params['field'] . "' has no associated option list.");
   }
 
diff --git a/civicrm/api/v3/System.php b/civicrm/api/v3/System.php
index 3eb6845ce4..486d67bb1b 100644
--- a/civicrm/api/v3/System.php
+++ b/civicrm/api/v3/System.php
@@ -246,7 +246,7 @@ function civicrm_api3_system_get($params) {
         'exampleUrl' => CRM_Utils_System::url('civicrm/example', NULL, TRUE, NULL, FALSE),
       ],
       'http' => [
-        'software' => CRM_Utils_Array::value('SERVER_SOFTWARE', $_SERVER),
+        'software' => $_SERVER['SERVER_SOFTWARE'] ?? NULL,
         'forwarded' => !empty($_SERVER['HTTP_X_FORWARDED_FOR']) || !empty($_SERVER['X_FORWARDED_PROTO']),
         'port' => (empty($_SERVER['SERVER_PORT']) || $_SERVER['SERVER_PORT'] == 80 || $_SERVER['SERVER_PORT'] == 443) ? 'Standard' : 'Nonstandard',
       ],
diff --git a/civicrm/api/v3/UFGroup.php b/civicrm/api/v3/UFGroup.php
index 3f0f584814..2d25eedea0 100644
--- a/civicrm/api/v3/UFGroup.php
+++ b/civicrm/api/v3/UFGroup.php
@@ -135,7 +135,7 @@ function _civicrm_api3_uf_group_getlist_output($result, $request, $entity, $fiel
         }
       };
       if (!empty($request['image_field'])) {
-        $data['image'] = isset($row[$request['image_field']]) ? $row[$request['image_field']] : '';
+        $data['image'] = $row[$request['image_field']] ?? '';
       }
       $output[] = $data;
     }
diff --git a/civicrm/api/v3/utils.php b/civicrm/api/v3/utils.php
index 65fe0128da..3101e29480 100644
--- a/civicrm/api/v3/utils.php
+++ b/civicrm/api/v3/utils.php
@@ -183,7 +183,7 @@ function civicrm_api3_create_success($values = 1, $params = [], $entity = NULL,
     }
 
     $allFields = [];
-    if ($action !== 'getfields' && is_array($apiFields) && is_array(CRM_Utils_Array::value('values', $apiFields))) {
+    if ($action !== 'getfields' && isset($apiFields['values']) && is_array($apiFields['values'])) {
       $allFields = array_keys($apiFields['values']);
     }
     $paramFields = array_keys($params);
@@ -457,11 +457,13 @@ function _civicrm_api3_store_values(&$fields, &$params, &$values) {
 /**
  * Returns field names of the given entity fields.
  *
+ * @deprecated
  * @param array $fields
  *   Fields array to retrieve the field names for.
  * @return array
  */
 function _civicrm_api3_field_names($fields) {
+  CRM_Core_Error::deprecatedFunctionWarning('array_column');
   $result = [];
   foreach ($fields as $key => $value) {
     if (!empty($value['name'])) {
@@ -539,10 +541,10 @@ function _civicrm_api3_get_using_query_object($entity, $params, $additional_opti
     }
   }
   $options = array_merge($options, $additional_options);
-  $sort             = CRM_Utils_Array::value('sort', $options, NULL);
-  $offset             = CRM_Utils_Array::value('offset', $options, NULL);
-  $limit             = CRM_Utils_Array::value('limit', $options, NULL);
-  $smartGroupCache  = CRM_Utils_Array::value('smartGroupCache', $params);
+  $sort             = $options['sort'] ?? NULL;
+  $offset             = $options['offset'] ?? NULL;
+  $limit             = $options['limit'] ?? NULL;
+  $smartGroupCache  = $params['smartGroupCache'] ?? NULL;
 
   if ($getCount) {
     $limit = NULL;
@@ -590,11 +592,11 @@ function _civicrm_api3_get_using_query_object($entity, $params, $additional_opti
  */
 function _civicrm_api3_get_query_object($params, $mode, $entity) {
   $options = _civicrm_api3_get_options_from_params($params, TRUE, $entity, 'get');
-  $sort = CRM_Utils_Array::value('sort', $options, NULL);
-  $offset = CRM_Utils_Array::value('offset', $options);
-  $rowCount = CRM_Utils_Array::value('limit', $options);
+  $sort = $options['sort'] ?? NULL;
+  $offset = $options['offset'] ?? NULL;
+  $rowCount = $options['limit'] ?? NULL;
   $inputParams = CRM_Utils_Array::value('input_params', $options, []);
-  $returnProperties = CRM_Utils_Array::value('return', $options, NULL);
+  $returnProperties = $options['return'] ?? NULL;
   if (empty($returnProperties)) {
     $returnProperties = CRM_Contribute_BAO_Query::defaultReturnProperties($mode);
   }
@@ -776,25 +778,21 @@ function _civicrm_api3_apply_filters_to_dao($filterField, $filterValue, &$dao) {
 function _civicrm_api3_get_options_from_params($params, $queryObject = FALSE, $entity = '', $action = '') {
   $lowercase_entity = _civicrm_api_get_entity_name_from_camel($entity);
   $is_count = FALSE;
-  $sort = CRM_Utils_Array::value('sort', $params, 0);
-  $sort = CRM_Utils_Array::value('option.sort', $params, $sort);
-  $sort = CRM_Utils_Array::value('option_sort', $params, $sort);
 
-  $offset = CRM_Utils_Array::value('offset', $params, 0);
-  $offset = CRM_Utils_Array::value('option.offset', $params, $offset);
   // dear PHP thought it would be a good idea to transform a.b into a_b in the get/post
-  $offset = CRM_Utils_Array::value('option_offset', $params, $offset);
+  $sort = $params['option_sort'] ?? $params['option.sort'] ?? $params['sort'] ?? 0;
+  $offset = $params['option_offset'] ?? $params['option.offset'] ?? $params['offset'] ?? 0;
 
   $limit = CRM_Utils_Array::value('rowCount', $params, 25);
   $limit = CRM_Utils_Array::value('option.limit', $params, $limit);
   $limit = CRM_Utils_Array::value('option_limit', $params, $limit);
 
-  if (is_array(CRM_Utils_Array::value('options', $params))) {
+  if (isset($params['options']) && is_array($params['options'])) {
     // is count is set by generic getcount not user
-    $is_count = CRM_Utils_Array::value('is_count', $params['options']);
-    $offset = CRM_Utils_Array::value('offset', $params['options'], $offset);
-    $limit  = CRM_Utils_Array::value('limit', $params['options'], $limit);
-    $sort   = CRM_Utils_Array::value('sort', $params['options'], $sort);
+    $is_count = $params['options']['is_count'] ?? FALSE;
+    $offset = $params['options']['offset'] ?? $offset;
+    $limit = CRM_Utils_Array::value('limit', $params['options'], $limit);
+    $sort = $params['options']['sort'] ?? $sort;
   }
 
   $returnProperties = [];
@@ -869,9 +867,7 @@ function _civicrm_api3_get_options_from_params($params, $queryObject = FALSE, $e
     elseif ($n === 'id') {
       $inputParams[$lowercase_entity . '_id'] = $v;
     }
-    elseif (in_array($n, $otherVars)) {
-    }
-    else {
+    elseif (!in_array($n, $otherVars)) {
       $inputParams[$n] = $v;
       if ($v && !is_array($v) && stristr($v, 'SELECT')) {
         throw new API_Exception('invalid string');
@@ -1331,10 +1327,7 @@ function _civicrm_api3_basic_create($bao_name, &$params, $entity = NULL) {
 /**
  * For BAO's which don't have a create() or add() functions, use this fallback implementation.
  *
- * @fixme There's an intuitive sense that this behavior should be defined somehow in the BAO/DAO class
- * structure. In practice, that requires a fair amount of refactoring and/or kludgery.
- *
- * @param string $bao_name
+ * @param string|CRM_Core_DAO $bao_name
  * @param array $params
  *
  * @throws API_Exception
@@ -1342,26 +1335,8 @@ function _civicrm_api3_basic_create($bao_name, &$params, $entity = NULL) {
  * @return CRM_Core_DAO|NULL
  *   An instance of the BAO
  */
-function _civicrm_api3_basic_create_fallback($bao_name, &$params) {
-  $dao_name = get_parent_class($bao_name);
-  if ($dao_name === 'CRM_Core_DAO' || !$dao_name) {
-    $dao_name = $bao_name;
-  }
-  $entityName = CRM_Core_DAO_AllCoreTables::getBriefName($dao_name);
-  if (empty($entityName)) {
-    throw new API_Exception("Class \"$bao_name\" does not map to an entity name", "unmapped_class_to_entity", [
-      'class_name' => $bao_name,
-    ]);
-  }
-  $hook = empty($params['id']) ? 'create' : 'edit';
-
-  CRM_Utils_Hook::pre($hook, $entityName, CRM_Utils_Array::value('id', $params), $params);
-  $instance = new $dao_name();
-  $instance->copyValues($params);
-  $instance->save();
-  CRM_Utils_Hook::post($hook, $entityName, $instance->id, $instance);
-
-  return $instance;
+function _civicrm_api3_basic_create_fallback($bao_name, $params) {
+  return $bao_name::writeRecord($params);
 }
 
 /**
@@ -1369,7 +1344,7 @@ function _civicrm_api3_basic_create_fallback($bao_name, &$params) {
  *
  * When the api is only doing a $bao::del then use this if api::del doesn't exist it will try DAO delete method.
  *
- * @param string $bao_name
+ * @param string|CRM_Core_DAO $bao_name
  * @param array $params
  *
  * @return array
@@ -1382,8 +1357,8 @@ function _civicrm_api3_basic_create_fallback($bao_name, &$params) {
 function _civicrm_api3_basic_delete($bao_name, &$params) {
   civicrm_api3_verify_mandatory($params, NULL, ['id']);
   _civicrm_api3_check_edit_permissions($bao_name, ['id' => $params['id']]);
-  $args = [&$params['id']];
   if (method_exists($bao_name, 'del')) {
+    $args = [&$params['id']];
     $dao = new $bao_name();
     $dao->id = $params['id'];
     if ($dao->find()) {
@@ -1395,21 +1370,10 @@ function _civicrm_api3_basic_delete($bao_name, &$params) {
     }
     throw new API_Exception('Could not delete entity id ' . $params['id']);
   }
-  elseif (method_exists($bao_name, 'delete')) {
-    $dao = new $bao_name();
-    $dao->id = $params['id'];
-    if ($dao->find()) {
-      while ($dao->fetch()) {
-        $dao->delete();
-        return civicrm_api3_create_success();
-      }
-    }
-    else {
-      throw new API_Exception('Could not delete entity id ' . $params['id']);
-    }
+  else {
+    $bao_name::deleteRecord($params);
+    return civicrm_api3_create_success();
   }
-
-  throw new API_Exception('no delete method found');
 }
 
 /**
@@ -1975,7 +1939,7 @@ function _civicrm_api_get_custom_fields($entity, &$params) {
   $entity = _civicrm_api_get_camel_name($entity);
   if ($entity == 'Contact') {
     // Use sub-type if available, otherwise "NULL" to fetch from all contact types
-    $entity = CRM_Utils_Array::value('contact_type', $params);
+    $entity = $params['contact_type'] ?? NULL;
   }
   $customfields = CRM_Core_BAO_CustomField::getFields($entity,
     FALSE,
@@ -2015,7 +1979,7 @@ function _civicrm_api_get_custom_fields($entity, &$params) {
  */
 function _civicrm_api3_swap_out_aliases(&$apiRequest, $fields) {
   foreach ($fields as $field => $values) {
-    $uniqueName = CRM_Utils_Array::value('uniqueName', $values);
+    $uniqueName = $values['uniqueName'] ?? NULL;
     if (!empty($values['api.aliases'])) {
       // if aliased field is not set we try to use field alias
       if (!isset($apiRequest['params'][$field])) {
@@ -2043,7 +2007,7 @@ function _civicrm_api3_swap_out_aliases(&$apiRequest, $fields) {
       && $field != $uniqueName
       && array_key_exists($uniqueName, $apiRequest['params'])
     ) {
-      $apiRequest['params'][$field] = CRM_Utils_Array::value($values['uniqueName'], $apiRequest['params']);
+      $apiRequest['params'][$field] = $apiRequest['params'][$values['uniqueName']] ?? NULL;
       // note that it would make sense to unset the original field here but tests need to be in place first
     }
   }
@@ -2292,7 +2256,7 @@ function _civicrm_api3_api_match_pseudoconstant(&$fieldValue, $entity, $fieldNam
     return;
   }
 
-  $options = CRM_Utils_Array::value('options', $fieldInfo);
+  $options = $fieldInfo['options'] ?? NULL;
 
   if (!$options) {
     if (strtolower($entity) == 'profile' && !empty($fieldInfo['entity'])) {
@@ -2463,7 +2427,7 @@ function _civicrm_api3_deprecation_check($entity, $result = []) {
  * @return mixed
  */
 function _civicrm_api3_field_value_check(&$params, $fieldName, $type = NULL) {
-  $fieldValue = CRM_Utils_Array::value($fieldName, $params);
+  $fieldValue = $params[$fieldName] ?? NULL;
   $op = NULL;
 
   if (!empty($fieldValue) && is_array($fieldValue) &&
@@ -2471,7 +2435,7 @@ function _civicrm_api3_field_value_check(&$params, $fieldName, $type = NULL) {
       $type == 'String' && strstr(key($fieldValue), 'EMPTY'))
   ) {
     $op = key($fieldValue);
-    $fieldValue = CRM_Utils_Array::value($op, $fieldValue);
+    $fieldValue = $fieldValue[$op] ?? NULL;
   }
   return [$fieldValue, $op];
 }
@@ -2497,8 +2461,8 @@ function _civicrm_api3_field_value_check(&$params, $fieldName, $type = NULL) {
 function _civicrm_api3_basic_array_get($entity, $params, $records, $idCol, $filterableFields) {
   $options = _civicrm_api3_get_options_from_params($params, TRUE, $entity, 'get');
   // TODO // $sort = CRM_Utils_Array::value('sort', $options, NULL);
-  $offset = CRM_Utils_Array::value('offset', $options);
-  $limit = CRM_Utils_Array::value('limit', $options);
+  $offset = $options['offset'] ?? NULL;
+  $limit = $options['limit'] ?? NULL;
 
   $matches = [];
 
diff --git a/civicrm/bin/cli.class.php b/civicrm/bin/cli.class.php
index dff79069f4..3d719ea6fd 100644
--- a/civicrm/bin/cli.class.php
+++ b/civicrm/bin/cli.class.php
@@ -211,7 +211,7 @@ class civicrm_cli {
         }
         // all other arguments are parameters
         $key = ltrim($arg, '--');
-        $this->_params[$key] = isset($value) ? $value : NULL;
+        $this->_params[$key] = $value ?? NULL;
       }
     }
     return TRUE;
diff --git a/civicrm/bower_components/jquery-validation/.composer-downloads/jquery-validation-134dc18b66d427be700a9e1241688102.json b/civicrm/bower_components/jquery-validation/.composer-downloads/jquery-validation-134dc18b66d427be700a9e1241688102.json
index 97ada7c035..b3ab648ef6 100644
--- a/civicrm/bower_components/jquery-validation/.composer-downloads/jquery-validation-134dc18b66d427be700a9e1241688102.json
+++ b/civicrm/bower_components/jquery-validation/.composer-downloads/jquery-validation-134dc18b66d427be700a9e1241688102.json
@@ -1,7 +1,7 @@
 {
     "name": "civicrm/civicrm-core:jquery-validation",
-    "url": "https://github.com/jquery-validation/jquery-validation/archive/1.13.1.zip",
-    "checksum": "674d447514392228eae53e2c56ae4ddb293c4276786adabc4242a843fc49a471",
+    "url": "https://github.com/jquery-validation/jquery-validation/archive/1.19.1.zip",
+    "checksum": "9426a5503735ae5f5ac78bb491ac8139631eeb8863f43e939d965562048b11c3",
     "ignore": [
         ".*",
         "node_modules",
diff --git a/civicrm/bower_components/jquery-validation/CONTRIBUTING.md b/civicrm/bower_components/jquery-validation/CONTRIBUTING.md
index 1ec9357d60..d317b2ab7a 100644
--- a/civicrm/bower_components/jquery-validation/CONTRIBUTING.md
+++ b/civicrm/bower_components/jquery-validation/CONTRIBUTING.md
@@ -1,4 +1,19 @@
-# Contributing to jQuery Validation Plugin
+# Contributing to the jQuery Validation Plugin
+
+## Reporting an Issue
+
+1. Make sure the problem you're addressing is reproducible.
+2. Use https://jsbin.com or https://jsfiddle.net to provide a test page.
+3. Indicate what browsers the issue can be reproduced in. **Note: IE Compatibilty mode issues will not be addressed. Make sure you test in a real browser!**
+4. What version of the plug-in is the issue reproducible in. Is it reproducible after updating to the latest version.
+
+Documentation issues are also tracked at the [jQuery Validation](https://github.com/jquery-validation/jquery-validation/issues) issue tracker.
+Pull Requests to improve the docs are welcome at the [jQuery Validation docs](https://github.com/jquery-validation/validation-content) repository, though.
+
+**IMPORTANT NOTE ABOUT EMAIL VALIDATION**. As of version 1.12.0 this plugin is using the same regular expression that the [HTML5 specification suggests for browsers to use](https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address). We will follow their lead and use the same check. If you think the specification is wrong, please report the issue to them. If you have different requirements, consider [using a custom method](http://jqueryvalidation.org/jQuery.validator.addMethod/).
+In case you need to adjust the built-in validation regular expression patterns, please [follow the documentation](http://jqueryvalidation.org/jQuery.validator.methods/).
+
+## Contributing code
 
 Thanks for contributing! Here's a few guidelines to help your contribution get landed.
 
@@ -6,12 +21,12 @@ Thanks for contributing! Here's a few guidelines to help your contribution get l
 2. Follow the [jQuery style guide](http://contribute.jquery.com/style-guides/js)
 3. Add or update unit tests along with your patch. Run the unit tests in at least one browser (see below).
 4. Run `grunt` (see below) to check for linting and a few other issues.
-5. Describe the change in your commit message and reference the ticket, like this: "Fixed delegate bug for dynamic-totals demo. Fixes #51". If you're adding a new localization file, use something like this: "Added croatian (HR) localization"
+5. Describe the change in your commit message and reference the ticket, like this: "Demos: Fixed delegate bug for dynamic-totals demo. Fixes #51". If you're adding a new localization file, use something like this: "Localization: Added croatian (HR) localization"
 
 ## Build setup
 
 1. Install [NodeJS](http://nodejs.org).
-2. Install the Grunt CLI To install by running `npm install -g grunt-cli`. More details are available on their website http://gruntjs.com/getting-started.
+2. Install the Grunt CLI by running `npm install -g grunt-cli`. More details are available on their website http://gruntjs.com/getting-started.
 3. Install the NPM dependencies by running `npm install`.
 4. The build can now be called by running `grunt`.
 
@@ -20,14 +35,20 @@ Thanks for contributing! Here's a few guidelines to help your contribution get l
 If you've wrote custom methods that you'd like to contribute to additional-methods.js:
 
 1. Create a branch
-2. Add the method as a new file in src/additional
-3. (Optional) Add translations to src/localization
+2. Add the method as a new file in `src/additional`
+3. (Optional) Add translations to `src/localization`
 4. Send a pull request to the master branch.
 
 ## Unit Tests
 
-To run unit tests, you should have a local webserver installed and pointing at your workspace. Then open `http://localhost/jquery-validation/test` to run the unit tests. Start with one browser while developing the fix, then run against others before committing. Usually latest Chrome, Firefox, Safari and Opera and a few IEs.
+To run unit tests, just open `test/index.html` within your browser. Make sure you ran `npm install` before so all required dependencies are available.
+Start with one browser while developing the fix, then run against others before committing. Usually latest Chrome, Firefox, Safari and Opera and a few IEs.
+
+## Documentation
+
+Please report documentation issues at the [jQuery Validation](https://github.com/jquery-validation/jquery-validation/issues) issue tracker.
+In case your pull request implements or changes public API it would be a plus you would provide a pull request against the [jQuery Validation docs](https://github.com/jquery-validation/validation-content) repository.
 
 ## Linting
 
-To run JSHint and other tools, use `grunt`. 
+To run JSHint and other tools, use `grunt`.
diff --git a/civicrm/bower_components/jquery-validation/Gruntfile.js b/civicrm/bower_components/jquery-validation/Gruntfile.js
index f6e42d029e..c5fe1df1ed 100644
--- a/civicrm/bower_components/jquery-validation/Gruntfile.js
+++ b/civicrm/bower_components/jquery-validation/Gruntfile.js
@@ -1,5 +1,5 @@
 /*jshint node:true*/
-module.exports = function(grunt) {
+module.exports = function( grunt ) {
 
 "use strict";
 
@@ -17,29 +17,33 @@ banner = "/*!\n" +
 	" * <%= pkg.homepage %>\n" +
 	" *\n" +
 	" * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>\n" +
-	" * Released under the <%= _.pluck(pkg.licenses, 'type').join(', ') %> license\n" +
+	" * Released under the <%= _.map(pkg.licenses, 'type').join(', ') %> license\n" +
 	" */\n";
 
-// define UMD wrapper variables
+// Define UMD wrapper variables
 
 umdStart = "(function( factory ) {\n" +
 	"\tif ( typeof define === \"function\" && define.amd ) {\n";
 
-umdMiddle = "\t} else {\n" +
+umdMiddle = "\t} else if (typeof module === \"object\" && module.exports) {\n" +
+	"\t\tmodule.exports = factory( require( \"jquery\" ) );\n" +
+	"\t} else {\n" +
 	"\t\tfactory( jQuery );\n" +
 	"\t}\n" +
 	"}(function( $ ) {\n\n";
 
-umdEnd = "\n}));";
+umdEnd = "return $;" +
+	"\n}));";
 
 umdStandardDefine = "\t\tdefine( [\"jquery\"], factory );\n";
 umdAdditionalDefine = "\t\tdefine( [\"jquery\", \"./jquery.validate\"], factory );\n";
 umdLocalizationDefine = "\t\tdefine( [\"jquery\", \"../jquery.validate\"], factory );\n";
 
-grunt.initConfig({
-	pkg: grunt.file.readJSON("package.json"),
+grunt.initConfig( {
+	pkg: grunt.file.readJSON( "package.json" ),
 	concat: {
-		// used to copy to dist folder
+
+		// Used to copy to dist folder
 		dist: {
 			options: {
 				banner: banner +
@@ -72,7 +76,7 @@ grunt.initConfig({
 				"<%= grunt.template.today('m/d/yyyy') %>\n" +
 				" * <%= pkg.homepage %>\n" +
 				" * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" +
-				" Licensed <%= _.pluck(pkg.licenses, 'type').join(', ') %> */\n"
+				" Licensed <%= _.map(pkg.licenses, 'type').join(', ') %> */\n"
 		},
 		dist: {
 			files: {
@@ -120,7 +124,7 @@ grunt.initConfig({
 			src: "src/**/*.js"
 		},
 		test: {
-			src: "test/*.js"
+			src: [ "test/*.js", "test/additional/*.js" ]
 		},
 		grunt: {
 			src: "Gruntfile.js"
@@ -143,7 +147,8 @@ grunt.initConfig({
 	copy: {
 		dist: {
 			options: {
-				// append UMD wrapper
+
+				// Append UMD wrapper
 				process: function( content ) {
 					return umdStart + umdLocalizationDefine + umdMiddle + content + umdEnd;
 				}
@@ -166,21 +171,43 @@ grunt.initConfig({
 				}
 			]
 		}
+	},
+
+	// Generate the sub-resource integrity hashes of the distribution files
+	sri: {
+		options: {
+			algorithms: [ "sha256", "sha384", "sha512" ],
+
+			// The target json file
+			dest: "dist/jquery-validation-sri.json",
+
+			// Stringify the JSON output in a pretty format
+			pretty: true
+		},
+
+		all: {
+			src: [
+				"dist/jquery.validate.{min.js,js}",
+				"dist/additional-methods.{min.js,js}",
+				"dist/localization/*.js"
+			]
+		}
 	}
-});
-
-grunt.loadNpmTasks("grunt-contrib-jshint");
-grunt.loadNpmTasks("grunt-contrib-qunit");
-grunt.loadNpmTasks("grunt-contrib-uglify");
-grunt.loadNpmTasks("grunt-contrib-concat");
-grunt.loadNpmTasks("grunt-contrib-compress");
-grunt.loadNpmTasks("grunt-contrib-watch");
-grunt.loadNpmTasks("grunt-jscs");
-grunt.loadNpmTasks("grunt-contrib-copy");
-grunt.loadNpmTasks("grunt-text-replace");
-
-grunt.registerTask("default", [ "concat", "copy", "jscs", "jshint", "qunit" ]);
-grunt.registerTask("release", [ "default", "uglify", "replace", "compress" ]);
-grunt.registerTask("start", [ "concat", "watch" ]);
+} );
+
+grunt.loadNpmTasks( "grunt-contrib-jshint" );
+grunt.loadNpmTasks( "grunt-contrib-qunit" );
+grunt.loadNpmTasks( "grunt-contrib-uglify" );
+grunt.loadNpmTasks( "grunt-contrib-concat" );
+grunt.loadNpmTasks( "grunt-contrib-compress" );
+grunt.loadNpmTasks( "grunt-contrib-watch" );
+grunt.loadNpmTasks( "grunt-jscs" );
+grunt.loadNpmTasks( "grunt-contrib-copy" );
+grunt.loadNpmTasks( "grunt-text-replace" );
+grunt.loadNpmTasks( "grunt-sri" );
+
+grunt.registerTask( "default", [ "concat", "copy", "jscs", "jshint", "qunit" ] );
+grunt.registerTask( "release", [ "default", "uglify", "replace", "compress", "sri" ] );
+grunt.registerTask( "start", [ "concat", "watch" ] );
 
 };
diff --git a/civicrm/bower_components/jquery-validation/LICENSE.md b/civicrm/bower_components/jquery-validation/LICENSE.md
new file mode 100644
index 0000000000..dc377cc031
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/LICENSE.md
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+=====================
+
+Copyright Jörn Zaefferer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/civicrm/bower_components/jquery-validation/README.md b/civicrm/bower_components/jquery-validation/README.md
index 4e71318bae..f02786c1c7 100644
--- a/civicrm/bower_components/jquery-validation/README.md
+++ b/civicrm/bower_components/jquery-validation/README.md
@@ -1,31 +1,24 @@
-[jQuery Validation Plugin](http://jqueryvalidation.org/) - Form validation made easy
+[jQuery Validation Plugin](https://jqueryvalidation.org/) - Form validation made easy
 ================================
 
-[![Build Status](https://secure.travis-ci.org/jzaefferer/jquery-validation.png)](http://travis-ci.org/jzaefferer/jquery-validation)
-[![devDependency Status](https://david-dm.org/jzaefferer/jquery-validation/dev-status.png?theme=shields.io)](https://david-dm.org/jzaefferer/jquery-validation#info=devDependencies)
+[![release](https://img.shields.io/github/release/jquery-validation/jquery-validation.svg)](https://github.com/jquery-validation/jquery-validation/releases/latest)
+[![Build Status](https://secure.travis-ci.org/jquery-validation/jquery-validation.svg)](https://travis-ci.org/jquery-validation/jquery-validation)
+[![devDependency Status](https://david-dm.org/jquery-validation/jquery-validation/dev-status.svg?theme=shields.io)](https://david-dm.org/jquery-validation/jquery-validation#info=devDependencies)
+[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/jquery-validation/badge?style=rounded)](https://www.jsdelivr.com/package/npm/jquery-validation)
 
 The jQuery Validation Plugin provides drop-in validation for your existing forms, while making all kinds of customizations to fit your application really easy.
 
-## [Help the project](http://pledgie.com/campaigns/18159)
-
-[![Help the project](http://www.pledgie.com/campaigns/18159.png?skin_name=chrome)](http://pledgie.com/campaigns/18159)
-
-This project is looking for help! [You can donate to the ongoing pledgie campaign](http://pledgie.com/campaigns/18159)
-and help spread the word. If you've used the plugin, or plan to use, consider a donation - any amount will help.
-
-You can find the plan for how to spend the money on the [pledgie page](http://pledgie.com/campaigns/18159).
-
 ## Getting Started
 
 ### Downloading the prebuilt files
 
-Prebuilt files can be downloaded from http://jqueryvalidation.org/
+Prebuilt files can be downloaded from https://jqueryvalidation.org/
 
 ### Downloading the latest changes
 
 The unreleased development files can be obtained by:
 
- 1. [Downloading](https://github.com/jzaefferer/jquery-validation/archive/master.zip) or Forking this repository
+ 1. [Downloading](https://github.com/jquery-validation/jquery-validation/archive/master.zip) or Forking this repository
  2. [Setup the build](CONTRIBUTING.md#build-setup)
  3. Run `grunt` to create the built files in the "dist" directory
 
@@ -40,7 +33,7 @@ Include jQuery and the plugin on a page. Then select a form to validate and call
 <script src="jquery.js"></script>
 <script src="jquery.validate.js"></script>
 <script>
-$("form").validate();
+    $("form").validate();
 </script>
 ```
 
@@ -52,21 +45,34 @@ define(["jquery", "jquery.validate"], function( $ ) {
 });
 ```
 
-For more information on how to setup a rules and customizations, [check the documentation](http://jqueryvalidation.org/documentation/).
-
-## Reporting an Issue
-
-**IMPORTANT NOTE ABOUT EMAIL VALIDATION**. As of version 1.12.0 this plugin is using the same regular expression that the [HTML5 specification suggests for browsers to use](http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29). We will follow their lead and use the same check. If you think the specification is wrong, please report the issue to them.
-
-1. Make sure the problem you're addressing is reproducible.
-2. Use http://jsbin.com or http://jsfiddle.net to provide a test page.
-3. Indicate what browsers the issue can be reproduced in. **Note: IE Compatibilty modes issues will not be addressed.**
-4. What version of the plug-in is the issue reproducible in. Is it reproducible after updating to the latest version.
-
-## Contributing
-
-See the [Contributing Guide](CONTRIBUTING.md)
+For more information on how to setup a rules and customizations, [check the documentation](https://jqueryvalidation.org/documentation/).
+
+## Reporting issues and contributing code
+
+See the [Contributing Guidelines](CONTRIBUTING.md) for details.
+
+**IMPORTANT NOTE ABOUT EMAIL VALIDATION**. As of version 1.12.0 this plugin is using the same regular expression that the [HTML5 specification suggests for browsers to use](https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address). We will follow their lead and use the same check. If you think the specification is wrong, please report the issue to them. If you have different requirements, consider [using a custom method](https://jqueryvalidation.org/jQuery.validator.addMethod/).
+In case you need to adjust the built-in validation regular expression patterns, please [follow the documentation](https://jqueryvalidation.org/jQuery.validator.methods/).
+
+**IMPORTANT NOTE ABOUT REQUIRED METHOD**. As of version 1.14.0 this plugin stops trimming white spaces from the value of the attached element. If you want to achieve the same result, you can use the [`normalizer`](https://jqueryvalidation.org/normalizer/) that can be used to transform the value of an element before validation. This feature was available since `v1.15.0`. In other words, you can do something like this:
+``` js
+$("#myForm").validate({
+	rules: {
+		username: {
+			required: true,
+			// Using the normalizer to trim the value of the element
+			// before validating it.
+			//
+			// The value of `this` inside the `normalizer` is the corresponding
+			// DOMElement. In this example, `this` references the `username` element.
+			normalizer: function(value) {
+				return $.trim(value);
+			}
+		}
+	}
+});
+```
 
 ## License
-Copyright (c) 2013 Jörn Zaefferer
+Copyright &copy; Jörn Zaefferer<br>
 Licensed under the MIT license.
diff --git a/civicrm/bower_components/jquery-validation/bower.json b/civicrm/bower_components/jquery-validation/bower.json
index 0618defd75..9ff23ccfc3 100644
--- a/civicrm/bower_components/jquery-validation/bower.json
+++ b/civicrm/bower_components/jquery-validation/bower.json
@@ -1,9 +1,9 @@
 {
 	"name": "jquery-validation",
-	"homepage": "http://jqueryvalidation.org/",
+	"homepage": "https://jqueryvalidation.org/",
 	"repository": {
 		"type": "git",
-		"url": "git://github.com/jzaefferer/jquery-validation.git"
+		"url": "git://github.com/jquery-validation/jquery-validation.git"
 	},
 	"authors": [
 		"Jörn Zaefferer <joern.zaefferer@gmail.com>"
@@ -25,7 +25,7 @@
 		"lib"
 	],
 	"dependencies": {
-		"jquery": ">= 1.6.4"
+		"jquery": ">= 1.7.2"
 	},
-	"version": "1.13.1"
+	"version": "1.19.1"
 }
diff --git a/civicrm/bower_components/jquery-validation/build/release.js b/civicrm/bower_components/jquery-validation/build/release.js
index 81a2f72cb6..a9576181f5 100644
--- a/civicrm/bower_components/jquery-validation/build/release.js
+++ b/civicrm/bower_components/jquery-validation/build/release.js
@@ -1,3 +1,25 @@
+/* Release checklist
+- Run `git changelog` and edit to match previous output (this should make use of jquey-release instead)
+- make sure the correct 'x.y.z-pre' version is defined in package.json
+- cd into your local https://github.com/jquery/jquery-release fork
+- pull latest https://github.com/jquery/jquery-release
+- disable _generateChangelog task in release.js (BOOOO)
+- run
+	node release.js --remote=jquery-validation/jquery-validation
+- Wait a while, verify and confirm each step
+- Create GitHub release: Pick the new tag, add changelog, upload zip (from __release/repo/dist/*.zip)
+- Upload to NPM
+    cd into your local jquery-validation fork
+    git fetch --tags upstream
+    git checkout tags/X.YY.Z
+    npm publish
+- Update MS CDN (Ping Chris Sfanos)
+- Check jsdelivr CDN: new git tags are automatically pulled, tested & merged via https://github.com/jsdelivr/jsdelivr/pulls
+- Check cdnjs CDN: new git tags are automatically committed into https://github.com/cdnjs/cdnjs/commits/master or ping @cdnjs
+- Update validation-content/pages/index.html (may have to hold off on CDN updates until available)
+- Write blog post: Some highlights, changelog, download links
+*/
+
 /*jshint node:true */
 module.exports = function( Release ) {
 
@@ -16,16 +38,21 @@ Release.define({
 
 	generateArtifacts: function( done ) {
 		Release.exec( "grunt release", "Grunt command failed" );
+		// Keep this list of files in sync with package.json's files key
 		done([
+			"dist/localization/",
 			"dist/additional-methods.js",
 			"dist/additional-methods.min.js",
 			"dist/jquery.validate.js",
-			"dist/jquery.validate.min.js"
+			"dist/jquery.validate.min.js",
+
+			// The sub-resource integrity hashes of the distribution files
+			"dist/jquery-validation-sri.json"
 		]);
 	},
 
-	// disable CDN publishing
 	cdnPublish: false,
+	npmPublish: true,
 
 	// disable authors check
 	_checkAuthorsTxt: function() {}
diff --git a/civicrm/bower_components/jquery-validation/changelog.md b/civicrm/bower_components/jquery-validation/changelog.md
index 3f98a7a589..b4f142f8c3 100644
--- a/civicrm/bower_components/jquery-validation/changelog.md
+++ b/civicrm/bower_components/jquery-validation/changelog.md
@@ -1,3 +1,257 @@
+1.18.0 / 2018-09-09
+===================
+
+## Additional
+  * Add Brazillian PIS/NIS number validation method (#2204)
+  * Add validation method for Polish telephone number (#2136)
+  * Updated link to EAN docs in creditcard.js (#2120)
+  * Allow N11 exchange for non-geo US phone (#2098)
+  * Add new BIN range for MasterCard (#2088)
+  * Add maxfiles, maxsize and maxsizetotal methods (#2087)
+  * Add greaterThan and lessThan methods (#2061)
+
+## Build
+  * Test on node 6.x and drop node 0.12.x (#2133)
+  * Generate sub-resource integrity hashes of the distribution files (#2082)
+  * Include localization files in tagged releases (#2057)
+  * Include minified version of additional methods in npm package (#2057)
+
+## Core
+  * Don't call submitHandler when in debug mode (#2193)
+  * Cast empty data attributes to 'true' (#2182)
+  * Ignore elements that belong to other/nested forms (#2147)
+  * Use element.isContentEditable instead of hasAttribute (#2142)
+  * Add deprecation warning to 'date' method (#2138)
+  * Allow the normalizer to return any value (#2054)
+  * Guard against null & undefined values in required method (#2053)
+
+## Demo
+  * Add sample code for Bootstrap 4 usage (#2173)
+
+## Localization
+  * Added Czech and Slovak translations for STEP method (#2197)
+  * Add localized methods for italian culture (it) (#2195)
+  * Add step validation string to message_zh (#2177)
+  * Fix typo in pt-BR localization file (#2139)
+  * Add message for phonePL method (#2136)
+  * Update Norwegian language file (#2132)
+  * Update Persian language file (#2122)
+  * Update German language file (#2115)
+  * Fix meaning in Bulgarian sentence (#2112)
+  * Add remote translation to no (#2097)
+  * Fixed wrong placeholder in vi translation (#2085)
+  * Add missing format method in message_{fr,tr}.js files (#2075)
+  * Fix typos in messages_pt_BR.js (#2073)
+  * Add new danish translations (#2067)
+  * Add Swedish validation message for remote (#2066)
+
+## Test
+  * Cast empty data attributes to 'true' (#2182)
+  * Ignore elements that belong to other/nested forms (#2147)
+  * Add tests for phonePL method (#2136)
+  * Add missing description to a test (#2055)
+  * Required method should return false for null & undefined values (#2053)
+
+1.17.0 / 2017-07-20
+==================
+
+## Core
+  * Pass on the value of the used submit button for scripted submits (#2019)
+  * Removed aria-required attribute (#2012)
+  * Assign rules to contenteditable via `.validate()` and `.rules()` (#1947)
+  * Count invalid fields with empty message in `numberOfInvalids()` (#1942)
+  * Added support for button elements with descendants (#1901)
+  * Add support for defining a global normalizer (#1905)
+
+## Additional
+  * Add localized number validation to methods_nl.js (#2014)
+  * Remove unreachable return from `cifES.js` (#1994)
+  * Add optional support to cifES, nifES and nieES (#1966)
+  * Add netmask validation method (#1955)
+  * Add Polish tax id validation method (#1850)
+  * Fixed validation for specific case for Spanish NIFs (#1914)
+
+## Localization
+  * Added Step Range Validation  to messages_ja (#1936)
+  * Add hungarian step message (#1888)
+  * Add Sindhi locale (#1900)
+  * Added norsk step translation (#1918)
+  * Add missing french step translation (#1928)
+  * Added nl- translation for "step" property (#1902)
+  * Add French translation for notEqualTo method (#2033)
+
+## Readme
+  * Add note about trimming whitespaces inside required method (#2028)
+
+## Tests
+  * Pass on the value of the used submit button for scripted submits (#2019)
+  * Use assert#pushResult instead of assert#push (#2018)
+  
+## All
+  * Fix links after move to organization
+  * Use https
+
+## Build
+  * Upgrade QUnit to 2.3.3 (#2018)
+
+1.16.0 / 2016-12-01
+==================
+
+## Additional
+  * Refine cifES and nieES algorithms. Closes #1826
+
+## Build
+  * Include Minified Version in NPM Package
+  * Bump dev-dependencies to latest versions
+
+## Core
+  * Add binding for input with button type. Closes #1891
+  * Support jquery3. Closes #1866
+  * Change jQuery alias 'expr[":"]' to 'expr.pseudos'
+
+## Localisation
+  * Add Urdu translation. Closes #1873.
+
+## Localization
+  * Fixed wrong file-extension for az translation. Closes #1890.
+  * Added missing translation in pt-BR (Closes #1897)
+  * Fixed typo in arabien language file.
+
+## Tests
+  * Upgrade QUnit to 2.0.
+
+## UMD
+  * Better support for CommonJS.
+
+1.15.1 / 2016-07-22
+==================
+
+## Additional
+  * Fix multiple mime-type validation
+  * IBAN require at least 5 chars (Closes #1797, Fixes #1674)
+  * Correct notEqualTo jQuery reference
+
+## Core
+  * Added failing test for #1805
+  * Fix group validation with 3 and more fields
+  * Fix regressions introduced in #1644 and #1657 (Closes #1800)
+  * Update step validation to handle floating points correctly
+  * Fix error when calling $.fn.rules() on a non-form element
+  * Call `errorPlacement` in validator scope
+  * Fixed issue with contenteditable elements in forms where events for single input validation would cause exceptions
+
+## Demo
+  * Add links to Bootstrap and Semantic-UI demos to index.html
+  * Use `.on()` instead of `.validateDelegate()`
+
+## Localization
+  * Added Azeri language
+
+## Tests
+  * Added regression unit tests for PR #1760
+
+1.15.0 / 2016-02-24
+==================
+
+## All
+  * Fixed code style issues
+
+## Core
+  * `resetForm` should also remove `valid` class from elements.
+  * Unhighlighting field if already highlighted when using remote rule.
+  * Bind the `blur` event just once in `equalTo` rule
+  * Fixed error when calling .rules() on empty jquery set.
+  * Fix handling of error messages with input groups.
+  * Fix TypeError in `showLabel` when using `groups` settings
+  * Adding a way to pass method name to remote
+  * Validation fails to trigger when next field is already filled out (Fixes #1508)
+  * Required rule take precedence over number & digits rules
+  * Error hidden but input error class not removed
+  * Remote validation uses wrong error messages
+  * Fixed field highlighting with remote validation.
+  * Fixed `:filled` selector for multiple select elements.
+  * Added doc reference to jQuery.validator.methods
+  * Move message processing from `formatAndAdd` to `defaultMessage`
+  * ErrorList should contain only the errors that it should
+  * Extract the file name without including "C:\fakepath\"
+  * HTML5 step attribute support. Fixes #1295
+  * Added support for "pending" class on outstanding requests
+  * Added normalizer (#1602)
+  * Split out `creditcard` method
+  * Escape errorID for use in the regex, not to build aria-describedby
+  * Escape single quotes in names avoiding a Sizzle Error being thrown
+  * Instead of using validating field's value to skip api call, use the serialized data object of the request
+  * Add support for contentEditable tags
+
+## Additional
+  * BIC: allow digits 1-9 in second place of location
+  * Accept method regex should be escaped properly.
+  * Case-insensitive check for BIC
+  * Correct postalCodeCA to exclude invalid combinations
+  * Make postalCodeCA method more lenient
+
+## Localization
+  * Added Macedonian localization.
+  * Added missing pattern message in Polish (adamwojtkiewicz)
+  * Fixed Persian translation of min/max message.
+  * Updated messages_sk.js
+  * Update Malay translation
+  * Included messages from additional methods
+  * Improving pt_BR translation and fixing a typo on the 'cifES' key.
+
+1.14.0 / 2015-06-30
+==================
+
+## Core
+  * Remove unused removeAttrs method
+  * Replace regex for url method
+  * Remove bad url param in $.ajax, overwritten by $.extend
+  * Properly handle nested cancel submit button
+  * Fix indent
+  * Refactor attributeRules and dataRules to share noramlizer
+  * dataRules method to convert value to number for number inputs
+  * Update url method to allow for protocol-relative URLs
+  * Remove deprecated $.format placeholder
+  * Use jQuery 1.7+ on/off, add destroy method
+  * IE8 compatibility changed .indexOf to $.inArray
+  * Cast NaN value attributes to undefined for Opera Mini
+  * Stop trimming value inside required method
+  * Use :disabled selector to match disabled elements
+  * Exclude some keyboard keys to prevent revalidating the field
+  * Do not search the whole DOM for radio/checkbox elements
+  * Throw better errors for bad rule methods
+  * Fixed number validation error
+  * Fix reference to whatwg spec
+  * Focus invalid element when validating a custom set of inputs
+  * Reset element styles when using custom highlight methods
+  * Escape dollar sign in error id
+  * Revert "Ignore readonly as well as disabled fields."
+  * Update link in comment for Luhn algorithm
+
+## Additionals
+  * Update dateITA to address timezone issue
+  * Fix extension method to only method period
+  * Fix accept method to match period only
+  * Update time method to allow single digit hour
+  * Drop bad test for notEqualTo method
+  * Add notEqualTo method
+  * Use correct jQuery reference via `$`
+  * Remove useless regex check in iban method
+  * Brazilian CPF number
+
+## Localization
+  * Update messages_tr.js
+  * Update messages_sr_lat.js
+  * Adding Perú Spanish (ES PE)
+  * Adding Georgian (ქართული, ge)
+  * Fixed typo in catalan translation
+  * Improve Finnish (fi) translation
+  * Add armenian (hy_AM) locale
+  * Extend italian (it) translation with currency method
+  * Add bn_BD locale
+  * Update zh locale
+  * Remove full stop at the end of italian messages
+
 1.13.1 / 2014-10-14
 ==================
 
diff --git a/civicrm/bower_components/jquery-validation/dist/additional-methods.js b/civicrm/bower_components/jquery-validation/dist/additional-methods.js
index dd328bd23b..168cc6df8f 100644
--- a/civicrm/bower_components/jquery-validation/dist/additional-methods.js
+++ b/civicrm/bower_components/jquery-validation/dist/additional-methods.js
@@ -1,67 +1,111 @@
 /*!
- * jQuery Validation Plugin v1.13.1
+ * jQuery Validation Plugin v1.19.1
  *
- * http://jqueryvalidation.org/
+ * https://jqueryvalidation.org/
  *
- * Copyright (c) 2014 Jörn Zaefferer
+ * Copyright (c) 2019 Jörn Zaefferer
  * Released under the MIT license
  */
 (function( factory ) {
 	if ( typeof define === "function" && define.amd ) {
 		define( ["jquery", "./jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
 	} else {
 		factory( jQuery );
 	}
 }(function( $ ) {
 
-(function() {
+( function() {
 
-	function stripHtml(value) {
-		// remove html tags and space chars
-		return value.replace(/<.[^<>]*?>/g, " ").replace(/&nbsp;|&#160;/gi, " ")
-		// remove punctuation
-		.replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "");
+	function stripHtml( value ) {
+
+		// Remove html tags and space chars
+		return value.replace( /<.[^<>]*?>/g, " " ).replace( /&nbsp;|&#160;/gi, " " )
+
+		// Remove punctuation
+		.replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" );
 	}
 
-	$.validator.addMethod("maxWords", function(value, element, params) {
-		return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length <= params;
-	}, $.validator.format("Please enter {0} words or less."));
+	$.validator.addMethod( "maxWords", function( value, element, params ) {
+		return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length <= params;
+	}, $.validator.format( "Please enter {0} words or less." ) );
 
-	$.validator.addMethod("minWords", function(value, element, params) {
-		return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params;
-	}, $.validator.format("Please enter at least {0} words."));
+	$.validator.addMethod( "minWords", function( value, element, params ) {
+		return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length >= params;
+	}, $.validator.format( "Please enter at least {0} words." ) );
 
-	$.validator.addMethod("rangeWords", function(value, element, params) {
-		var valueStripped = stripHtml(value),
+	$.validator.addMethod( "rangeWords", function( value, element, params ) {
+		var valueStripped = stripHtml( value ),
 			regex = /\b\w+\b/g;
-		return this.optional(element) || valueStripped.match(regex).length >= params[0] && valueStripped.match(regex).length <= params[1];
-	}, $.validator.format("Please enter between {0} and {1} words."));
+		return this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];
+	}, $.validator.format( "Please enter between {0} and {1} words." ) );
+
+}() );
+
+/**
+ * This is used in the United States to process payments, deposits,
+ * or transfers using the Automated Clearing House (ACH) or Fedwire
+ * systems. A very common use case would be to validate a form for
+ * an ACH bill payment.
+ */
+$.validator.addMethod( "abaRoutingNumber", function( value ) {
+	var checksum = 0;
+	var tokens = value.split( "" );
+	var length = tokens.length;
+
+	// Length Check
+	if ( length !== 9 ) {
+		return false;
+	}
 
-}());
+	// Calc the checksum
+	// https://en.wikipedia.org/wiki/ABA_routing_transit_number
+	for ( var i = 0; i < length; i += 3 ) {
+		checksum +=	parseInt( tokens[ i ], 10 )     * 3 +
+					parseInt( tokens[ i + 1 ], 10 ) * 7 +
+					parseInt( tokens[ i + 2 ], 10 );
+	}
+
+	// If not zero and divisible by 10 then valid
+	if ( checksum !== 0 && checksum % 10 === 0 ) {
+		return true;
+	}
+
+	return false;
+}, "Please enter a valid routing number." );
 
 // Accept a value from a file input based on a required mimetype
-$.validator.addMethod("accept", function(value, element, param) {
+$.validator.addMethod( "accept", function( value, element, param ) {
+
 	// Split mime on commas in case we have multiple types we can accept
-	var typeParam = typeof param === "string" ? param.replace(/\s/g, "").replace(/,/g, "|") : "image/*",
-	optionalValue = this.optional(element),
-	i, file;
+	var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
+		optionalValue = this.optional( element ),
+		i, file, regex;
 
 	// Element is optional
-	if (optionalValue) {
+	if ( optionalValue ) {
 		return optionalValue;
 	}
 
-	if ($(element).attr("type") === "file") {
-		// If we are using a wildcard, make it regex friendly
-		typeParam = typeParam.replace(/\*/g, ".*");
+	if ( $( element ).attr( "type" ) === "file" ) {
+
+		// Escape string to be used in the regex
+		// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
+		// Escape also "/*" as "/.*" as a wildcard
+		typeParam = typeParam
+				.replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
+				.replace( /,/g, "|" )
+				.replace( /\/\*/g, "/.*" );
 
 		// Check if the element has a FileList before checking each file
-		if (element.files && element.files.length) {
-			for (i = 0; i < element.files.length; i++) {
-				file = element.files[i];
+		if ( element.files && element.files.length ) {
+			regex = new RegExp( ".?(" + typeParam + ")$", "i" );
+			for ( i = 0; i < element.files.length; i++ ) {
+				file = element.files[ i ];
 
 				// Grab the mimetype from the loaded file, verify it matches
-				if (!file.type.match(new RegExp( ".?(" + typeParam + ")$", "i"))) {
+				if ( !file.type.match( regex ) ) {
 					return false;
 				}
 			}
@@ -71,11 +115,11 @@ $.validator.addMethod("accept", function(value, element, param) {
 	// Either return true because we've validated each file, or because the
 	// browser does not support element.files and the FileList feature
 	return true;
-}, $.validator.format("Please enter a value with a valid mimetype."));
+}, $.validator.format( "Please enter a value with a valid mimetype." ) );
 
-$.validator.addMethod("alphanumeric", function(value, element) {
-	return this.optional(element) || /^\w+$/i.test(value);
-}, "Letters, numbers, and underscores only please");
+$.validator.addMethod( "alphanumeric", function( value, element ) {
+	return this.optional( element ) || /^\w+$/i.test( value );
+}, "Letters, numbers, and underscores only please" );
 
 /*
  * Dutch bank account numbers (not 'giro' numbers) have 9 digits
@@ -83,180 +127,468 @@ $.validator.addMethod("alphanumeric", function(value, element) {
  * We accept the notation with spaces, as that is common.
  * acceptable: 123456789 or 12 34 56 789
  */
-$.validator.addMethod("bankaccountNL", function(value, element) {
-	if (this.optional(element)) {
+$.validator.addMethod( "bankaccountNL", function( value, element ) {
+	if ( this.optional( element ) ) {
 		return true;
 	}
-	if (!(/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(value))) {
+	if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {
 		return false;
 	}
-	// now '11 check'
-	var account = value.replace(/ /g, ""), // remove spaces
+
+	// Now '11 check'
+	var account = value.replace( / /g, "" ), // Remove spaces
 		sum = 0,
 		len = account.length,
 		pos, factor, digit;
 	for ( pos = 0; pos < len; pos++ ) {
 		factor = len - pos;
-		digit = account.substring(pos, pos + 1);
+		digit = account.substring( pos, pos + 1 );
 		sum = sum + factor * digit;
 	}
 	return sum % 11 === 0;
-}, "Please specify a valid bank account number");
+}, "Please specify a valid bank account number" );
 
-$.validator.addMethod("bankorgiroaccountNL", function(value, element) {
-	return this.optional(element) ||
-			($.validator.methods.bankaccountNL.call(this, value, element)) ||
-			($.validator.methods.giroaccountNL.call(this, value, element));
-}, "Please specify a valid bank or giro account number");
+$.validator.addMethod( "bankorgiroaccountNL", function( value, element ) {
+	return this.optional( element ) ||
+			( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||
+			( $.validator.methods.giroaccountNL.call( this, value, element ) );
+}, "Please specify a valid bank or giro account number" );
 
 /**
  * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.
  *
  * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
  *
+ * Validation is case-insensitive. Please make sure to normalize input yourself.
+ *
  * BIC definition in detail:
  * - First 4 characters - bank code (only letters)
  * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
  * - Next 2 characters - location code (letters and digits)
  *   a. shall not start with '0' or '1'
- *   b. second character must be a letter ('O' is not allowed) or one of the following digits ('0' for test (therefore not allowed), '1' for passive participant and '2' for active participant)
+ *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)
  * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
  */
-$.validator.addMethod("bic", function(value, element) {
-    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value );
-}, "Please specify a valid BIC code");
+$.validator.addMethod( "bic", function( value, element ) {
+    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );
+}, "Please specify a valid BIC code" );
 
 /*
  * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
  * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
+ *
+ * Spanish CIF structure:
+ *
+ * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]
+ *
+ * Where:
+ *
+ * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]
+ * P: 2 characters. Province.
+ * N: 5 characters. Secuencial Number within the province.
+ * C: 1 character. Control Digit: [0-9A-J].
+ *
+ * [ T ]: Kind of Organizations. Possible values:
+ *
+ *   A. Corporations
+ *   B. LLCs
+ *   C. General partnerships
+ *   D. Companies limited partnerships
+ *   E. Communities of goods
+ *   F. Cooperative Societies
+ *   G. Associations
+ *   H. Communities of homeowners in horizontal property regime
+ *   J. Civil Societies
+ *   K. Old format
+ *   L. Old format
+ *   M. Old format
+ *   N. Nonresident entities
+ *   P. Local authorities
+ *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
+ *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
+ *   S. Organs of State Administration and regions
+ *   V. Agrarian Transformation
+ *   W. Permanent establishments of non-resident in Spain
+ *
+ * [ C ]: Control Digit. It can be a number or a letter depending on T value:
+ * [ T ]  -->  [ C ]
+ * ------    ----------
+ *   A         Number
+ *   B         Number
+ *   E         Number
+ *   H         Number
+ *   K         Letter
+ *   P         Letter
+ *   Q         Letter
+ *   S         Letter
+ *
  */
-$.validator.addMethod( "cifES", function( value ) {
+$.validator.addMethod( "cifES", function( value, element ) {
 	"use strict";
 
-	var num = [],
-		controlDigit, sum, i, count, tmp, secondDigit;
+	if ( this.optional( element ) ) {
+		return true;
+	}
 
-	value = value.toUpperCase();
+	var cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi );
+	var letter  = value.substring( 0, 1 ), // [ T ]
+		number  = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]
+		control = value.substring( 8, 9 ), // [ C ]
+		all_sum = 0,
+		even_sum = 0,
+		odd_sum = 0,
+		i, n,
+		control_digit,
+		control_letter;
+
+	function isOdd( n ) {
+		return n % 2 === 0;
+	}
 
 	// Quick format test
-	if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+	if ( value.length !== 9 || !cifRegEx.test( value ) ) {
 		return false;
 	}
 
-	for ( i = 0; i < 9; i++ ) {
-		num[ i ] = parseInt( value.charAt( i ), 10 );
-	}
-
-	// Algorithm for checking CIF codes
-	sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
-	for ( count = 1; count < 8; count += 2 ) {
-		tmp = ( 2 * num[ count ] ).toString();
-		secondDigit = tmp.charAt( 1 );
-
-		sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === "" ? 0 : parseInt( secondDigit, 10 ) );
-	}
-
-	/* The first (position 1) is a letter following the following criteria:
-	 *	A. Corporations
-	 *	B. LLCs
-	 *	C. General partnerships
-	 *	D. Companies limited partnerships
-	 *	E. Communities of goods
-	 *	F. Cooperative Societies
-	 *	G. Associations
-	 *	H. Communities of homeowners in horizontal property regime
-	 *	J. Civil Societies
-	 *	K. Old format
-	 *	L. Old format
-	 *	M. Old format
-	 *	N. Nonresident entities
-	 *	P. Local authorities
-	 *	Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
-	 *	R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
-	 *	S. Organs of State Administration and regions
-	 *	V. Agrarian Transformation
-	 *	W. Permanent establishments of non-resident in Spain
-	 */
-	if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
-		sum += "";
-		controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
-		value += controlDigit;
-		return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
+	for ( i = 0; i < number.length; i++ ) {
+		n = parseInt( number[ i ], 10 );
+
+		// Odd positions
+		if ( isOdd( i ) ) {
+
+			// Odd positions are multiplied first.
+			n *= 2;
+
+			// If the multiplication is bigger than 10 we need to adjust
+			odd_sum += n < 10 ? n : n - 9;
+
+		// Even positions
+		// Just sum them
+		} else {
+			even_sum += n;
+		}
+	}
+
+	all_sum = even_sum + odd_sum;
+	control_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();
+	control_digit = parseInt( control_digit, 10 ) > 9 ? "0" : control_digit;
+	control_letter = "JABCDEFGHI".substr( control_digit, 1 ).toString();
+
+	// Control must be a digit
+	if ( letter.match( /[ABEH]/ ) ) {
+		return control === control_digit;
+
+	// Control must be a letter
+	} else if ( letter.match( /[KPQS]/ ) ) {
+		return control === control_letter;
 	}
 
-	return false;
+	// Can be either
+	return control === control_digit || control === control_letter;
 
 }, "Please specify a valid CIF number." );
 
+/*
+ * Brazillian CNH number (Carteira Nacional de Habilitacao) is the License Driver number.
+ * CNH numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cnhBR", function( value ) {
+
+  // Removing special characters from value
+  value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+  // Checking value to have 11 digits only
+  if ( value.length !== 11 ) {
+    return false;
+  }
+
+  var sum = 0, dsc = 0, firstChar,
+		firstCN, secondCN, i, j, v;
+
+  firstChar = value.charAt( 0 );
+
+  if ( new Array( 12 ).join( firstChar ) === value ) {
+    return false;
+  }
+
+  // Step 1 - using first Check Number:
+  for ( i = 0, j = 9, v = 0; i < 9; ++i, --j ) {
+    sum += +( value.charAt( i ) * j );
+  }
+
+  firstCN = sum % 11;
+  if ( firstCN >= 10 ) {
+    firstCN = 0;
+    dsc = 2;
+  }
+
+  sum = 0;
+  for ( i = 0, j = 1, v = 0; i < 9; ++i, ++j ) {
+    sum += +( value.charAt( i ) * j );
+  }
+
+  secondCN = sum % 11;
+  if ( secondCN >= 10 ) {
+    secondCN = 0;
+  } else {
+    secondCN = secondCN - dsc;
+  }
+
+  return ( String( firstCN ).concat( secondCN ) === value.substr( -2 ) );
+
+}, "Please specify a valid CNH number" );
+
+/*
+ * Brazillian value number (Cadastrado de Pessoas Juridica).
+ * value numbers have 14 digits in total: 12 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cnpjBR", function( value, element ) {
+	"use strict";
+
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	// Removing no number
+	value = value.replace( /[^\d]+/g, "" );
+
+	// Checking value to have 14 digits only
+	if ( value.length !== 14 ) {
+		return false;
+	}
+
+	// Elimina values invalidos conhecidos
+	if ( value === "00000000000000" ||
+		value === "11111111111111" ||
+		value === "22222222222222" ||
+		value === "33333333333333" ||
+		value === "44444444444444" ||
+		value === "55555555555555" ||
+		value === "66666666666666" ||
+		value === "77777777777777" ||
+		value === "88888888888888" ||
+		value === "99999999999999" ) {
+		return false;
+	}
+
+	// Valida DVs
+	var tamanho = ( value.length - 2 );
+	var numeros = value.substring( 0, tamanho );
+	var digitos = value.substring( tamanho );
+	var soma = 0;
+	var pos = tamanho - 7;
+
+	for ( var i = tamanho; i >= 1; i-- ) {
+		soma += numeros.charAt( tamanho - i ) * pos--;
+		if ( pos < 2 ) {
+			pos = 9;
+		}
+	}
+
+	var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
+
+	if ( resultado !== parseInt( digitos.charAt( 0 ), 10 ) ) {
+		return false;
+	}
+
+	tamanho = tamanho + 1;
+	numeros = value.substring( 0, tamanho );
+	soma = 0;
+	pos = tamanho - 7;
+
+	for ( var il = tamanho; il >= 1; il-- ) {
+		soma += numeros.charAt( tamanho - il ) * pos--;
+		if ( pos < 2 ) {
+			pos = 9;
+		}
+	}
+
+	resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
+
+	if ( resultado !== parseInt( digitos.charAt( 1 ), 10 ) ) {
+		return false;
+	}
+
+	return true;
+
+}, "Please specify a CNPJ value number" );
+
+/*
+ * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
+ * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cpfBR", function( value, element ) {
+	"use strict";
+
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	// Removing special characters from value
+	value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+	// Checking value to have 11 digits only
+	if ( value.length !== 11 ) {
+		return false;
+	}
+
+	var sum = 0,
+		firstCN, secondCN, checkResult, i;
+
+	firstCN = parseInt( value.substring( 9, 10 ), 10 );
+	secondCN = parseInt( value.substring( 10, 11 ), 10 );
+
+	checkResult = function( sum, cn ) {
+		var result = ( sum * 10 ) % 11;
+		if ( ( result === 10 ) || ( result === 11 ) ) {
+			result = 0;
+		}
+		return ( result === cn );
+	};
+
+	// Checking for dump data
+	if ( value === "" ||
+		value === "00000000000" ||
+		value === "11111111111" ||
+		value === "22222222222" ||
+		value === "33333333333" ||
+		value === "44444444444" ||
+		value === "55555555555" ||
+		value === "66666666666" ||
+		value === "77777777777" ||
+		value === "88888888888" ||
+		value === "99999999999"
+	) {
+		return false;
+	}
+
+	// Step 1 - using first Check Number:
+	for ( i = 1; i <= 9; i++ ) {
+		sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );
+	}
+
+	// If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
+	if ( checkResult( sum, firstCN ) ) {
+		sum = 0;
+		for ( i = 1; i <= 10; i++ ) {
+			sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );
+		}
+		return checkResult( sum, secondCN );
+	}
+	return false;
+
+}, "Please specify a valid CPF number" );
+
+// https://jqueryvalidation.org/creditcard-method/
+// based on https://en.wikipedia.org/wiki/Luhn_algorithm
+$.validator.addMethod( "creditcard", function( value, element ) {
+	if ( this.optional( element ) ) {
+		return "dependency-mismatch";
+	}
+
+	// Accept only spaces, digits and dashes
+	if ( /[^0-9 \-]+/.test( value ) ) {
+		return false;
+	}
+
+	var nCheck = 0,
+		nDigit = 0,
+		bEven = false,
+		n, cDigit;
+
+	value = value.replace( /\D/g, "" );
+
+	// Basing min and max length on
+	// https://dev.ean.com/general-info/valid-card-types/
+	if ( value.length < 13 || value.length > 19 ) {
+		return false;
+	}
+
+	for ( n = value.length - 1; n >= 0; n-- ) {
+		cDigit = value.charAt( n );
+		nDigit = parseInt( cDigit, 10 );
+		if ( bEven ) {
+			if ( ( nDigit *= 2 ) > 9 ) {
+				nDigit -= 9;
+			}
+		}
+
+		nCheck += nDigit;
+		bEven = !bEven;
+	}
+
+	return ( nCheck % 10 ) === 0;
+}, "Please enter a valid credit card number." );
+
 /* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
- * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
+ * Redistributed under the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
  * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
  */
-$.validator.addMethod("creditcardtypes", function(value, element, param) {
-	if (/[^0-9\-]+/.test(value)) {
+$.validator.addMethod( "creditcardtypes", function( value, element, param ) {
+	if ( /[^0-9\-]+/.test( value ) ) {
 		return false;
 	}
 
-	value = value.replace(/\D/g, "");
+	value = value.replace( /\D/g, "" );
 
 	var validTypes = 0x0000;
 
-	if (param.mastercard) {
+	if ( param.mastercard ) {
 		validTypes |= 0x0001;
 	}
-	if (param.visa) {
+	if ( param.visa ) {
 		validTypes |= 0x0002;
 	}
-	if (param.amex) {
+	if ( param.amex ) {
 		validTypes |= 0x0004;
 	}
-	if (param.dinersclub) {
+	if ( param.dinersclub ) {
 		validTypes |= 0x0008;
 	}
-	if (param.enroute) {
+	if ( param.enroute ) {
 		validTypes |= 0x0010;
 	}
-	if (param.discover) {
+	if ( param.discover ) {
 		validTypes |= 0x0020;
 	}
-	if (param.jcb) {
+	if ( param.jcb ) {
 		validTypes |= 0x0040;
 	}
-	if (param.unknown) {
+	if ( param.unknown ) {
 		validTypes |= 0x0080;
 	}
-	if (param.all) {
+	if ( param.all ) {
 		validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
 	}
-	if (validTypes & 0x0001 && /^(5[12345])/.test(value)) { //mastercard
+	if ( validTypes & 0x0001 && ( /^(5[12345])/.test( value ) || /^(2[234567])/.test( value ) ) ) { // Mastercard
 		return value.length === 16;
 	}
-	if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
+	if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa
 		return value.length === 16;
 	}
-	if (validTypes & 0x0004 && /^(3[47])/.test(value)) { //amex
+	if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex
 		return value.length === 15;
 	}
-	if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) { //dinersclub
+	if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub
 		return value.length === 14;
 	}
-	if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) { //enroute
+	if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute
 		return value.length === 15;
 	}
-	if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
+	if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover
 		return value.length === 16;
 	}
-	if (validTypes & 0x0040 && /^(3)/.test(value)) { //jcb
+	if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb
 		return value.length === 16;
 	}
-	if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) { //jcb
+	if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb
 		return value.length === 15;
 	}
-	if (validTypes & 0x0080) { //unknown
+	if ( validTypes & 0x0080 ) { // Unknown
 		return true;
 	}
 	return false;
-}, "Please enter a valid credit card number.");
+}, "Please enter a valid credit card number." );
 
 /**
  * Validates currencies with any given symbols by @jameslouiz
@@ -286,23 +618,23 @@ $.validator.addMethod("creditcardtypes", function(value, element, param) {
  *     currency: "$,£,¢"
  *  }
  */
-$.validator.addMethod("currency", function(value, element, param) {
+$.validator.addMethod( "currency", function( value, element, param ) {
     var isParamString = typeof param === "string",
-        symbol = isParamString ? param : param[0],
-        soft = isParamString ? true : param[1],
+        symbol = isParamString ? param : param[ 0 ],
+        soft = isParamString ? true : param[ 1 ],
         regex;
 
-    symbol = symbol.replace(/,/g, "");
+    symbol = symbol.replace( /,/g, "" );
     symbol = soft ? symbol + "]" : symbol + "]?";
     regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
-    regex = new RegExp(regex);
-    return this.optional(element) || regex.test(value);
+    regex = new RegExp( regex );
+    return this.optional( element ) || regex.test( value );
 
-}, "Please specify a valid currency");
+}, "Please specify a valid currency" );
 
-$.validator.addMethod("dateFA", function(value, element) {
-	return this.optional(element) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(value);
-}, "Please enter a correct date");
+$.validator.addMethod( "dateFA", function( value, element ) {
+	return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );
+}, $.validator.messages.date );
 
 /**
  * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
@@ -323,17 +655,17 @@ $.validator.addMethod("dateFA", function(value, element) {
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
-$.validator.addMethod("dateITA", function(value, element) {
+$.validator.addMethod( "dateITA", function( value, element ) {
 	var check = false,
 		re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
 		adata, gg, mm, aaaa, xdata;
-	if ( re.test(value)) {
-		adata = value.split("/");
-		gg = parseInt(adata[0], 10);
-		mm = parseInt(adata[1], 10);
-		aaaa = parseInt(adata[2], 10);
-		xdata = new Date(aaaa, mm - 1, gg, 12, 0, 0, 0);
-		if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth () === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
+	if ( re.test( value ) ) {
+		adata = value.split( "/" );
+		gg = parseInt( adata[ 0 ], 10 );
+		mm = parseInt( adata[ 1 ], 10 );
+		aaaa = parseInt( adata[ 2 ], 10 );
+		xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );
+		if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
 			check = true;
 		} else {
 			check = false;
@@ -341,50 +673,83 @@ $.validator.addMethod("dateITA", function(value, element) {
 	} else {
 		check = false;
 	}
-	return this.optional(element) || check;
-}, "Please enter a correct date");
+	return this.optional( element ) || check;
+}, $.validator.messages.date );
 
-$.validator.addMethod("dateNL", function(value, element) {
-	return this.optional(element) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(value);
-}, "Please enter a correct date");
+$.validator.addMethod( "dateNL", function( value, element ) {
+	return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value );
+}, $.validator.messages.date );
 
 // Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
-$.validator.addMethod("extension", function(value, element, param) {
-	param = typeof param === "string" ? param.replace(/,/g, "|") : "png|jpe?g|gif";
-	return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
-}, $.validator.format("Please enter a value with a valid extension."));
+$.validator.addMethod( "extension", function( value, element, param ) {
+	param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif";
+	return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) );
+}, $.validator.format( "Please enter a value with a valid extension." ) );
 
 /**
  * Dutch giro account numbers (not bank numbers) have max 7 digits
  */
-$.validator.addMethod("giroaccountNL", function(value, element) {
-	return this.optional(element) || /^[0-9]{1,7}$/.test(value);
-}, "Please specify a valid giro account number");
+$.validator.addMethod( "giroaccountNL", function( value, element ) {
+	return this.optional( element ) || /^[0-9]{1,7}$/.test( value );
+}, "Please specify a valid giro account number" );
+
+$.validator.addMethod( "greaterThan", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-greaterThan-blur" ).length ) {
+        target.addClass( "validate-greaterThan-blur" ).on( "blur.validate-greaterThan", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value > target.val();
+}, "Please enter a greater value." );
+
+$.validator.addMethod( "greaterThanEqual", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-greaterThanEqual-blur" ).length ) {
+        target.addClass( "validate-greaterThanEqual-blur" ).on( "blur.validate-greaterThanEqual", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value >= target.val();
+}, "Please enter a greater value." );
 
 /**
  * IBAN is the international bank account number.
  * It has a country - specific format, that is checked here too
+ *
+ * Validation is case-insensitive. Please make sure to normalize input yourself.
  */
-$.validator.addMethod("iban", function(value, element) {
-	// some quick simple tests to prevent needless work
-	if (this.optional(element)) {
+$.validator.addMethod( "iban", function( value, element ) {
+
+	// Some quick simple tests to prevent needless work
+	if ( this.optional( element ) ) {
 		return true;
 	}
 
-	// remove spaces and to upper case
-	var iban = value.replace(/ /g, "").toUpperCase(),
+	// Remove spaces and to upper case
+	var iban = value.replace( / /g, "" ).toUpperCase(),
 		ibancheckdigits = "",
 		leadingZeroes = true,
 		cRest = "",
 		cOperator = "",
 		countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
 
-	if (!(/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(iban))) {
+	// Check for IBAN code length.
+	// It contains:
+	// country code ISO 3166-1 - two letters,
+	// two check digits,
+	// Basic Bank Account Number (BBAN) - up to 30 chars
+	var minimalIBANlength = 5;
+	if ( iban.length < minimalIBANlength ) {
 		return false;
 	}
 
-	// check the country code and find the country specific format
-	countrycode = iban.substring(0, 2);
+	// Check the country code and find the country specific format
+	countrycode = iban.substring( 0, 2 );
 	bbancountrypatterns = {
 		"AL": "\\d{8}[\\dA-Z]{16}",
 		"AD": "\\d{8}[\\dA-Z]{12}",
@@ -452,7 +817,8 @@ $.validator.addMethod("iban", function(value, element) {
 		"VG": "[\\dA-Z]{4}\\d{16}"
 	};
 
-	bbanpattern = bbancountrypatterns[countrycode];
+	bbanpattern = bbancountrypatterns[ countrycode ];
+
 	// As new countries will start using IBAN in the
 	// future, we only check if the countrycode is known.
 	// This prevents false negatives, while almost all
@@ -460,57 +826,143 @@ $.validator.addMethod("iban", function(value, element) {
 	// by the checksum validation below anyway.
 	// Strict checking should return FALSE for unknown
 	// countries.
-	if (typeof bbanpattern !== "undefined") {
-		ibanregexp = new RegExp("^[A-Z]{2}\\d{2}" + bbanpattern + "$", "");
-		if (!(ibanregexp.test(iban))) {
-			return false; // invalid country specific format
+	if ( typeof bbanpattern !== "undefined" ) {
+		ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" );
+		if ( !( ibanregexp.test( iban ) ) ) {
+			return false; // Invalid country specific format
 		}
 	}
 
-	// now check the checksum, first convert to digits
-	ibancheck = iban.substring(4, iban.length) + iban.substring(0, 4);
-	for (i = 0; i < ibancheck.length; i++) {
-		charAt = ibancheck.charAt(i);
-		if (charAt !== "0") {
+	// Now check the checksum, first convert to digits
+	ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );
+	for ( i = 0; i < ibancheck.length; i++ ) {
+		charAt = ibancheck.charAt( i );
+		if ( charAt !== "0" ) {
 			leadingZeroes = false;
 		}
-		if (!leadingZeroes) {
-			ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(charAt);
+		if ( !leadingZeroes ) {
+			ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( charAt );
 		}
 	}
 
-	// calculate the result of: ibancheckdigits % 97
-	for (p = 0; p < ibancheckdigits.length; p++) {
-		cChar = ibancheckdigits.charAt(p);
+	// Calculate the result of: ibancheckdigits % 97
+	for ( p = 0; p < ibancheckdigits.length; p++ ) {
+		cChar = ibancheckdigits.charAt( p );
 		cOperator = "" + cRest + "" + cChar;
 		cRest = cOperator % 97;
 	}
 	return cRest === 1;
-}, "Please specify a valid IBAN");
+}, "Please specify a valid IBAN" );
+
+$.validator.addMethod( "integer", function( value, element ) {
+	return this.optional( element ) || /^-?\d+$/.test( value );
+}, "A positive or negative non-decimal number please" );
+
+$.validator.addMethod( "ipv4", function( value, element ) {
+	return this.optional( element ) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test( value );
+}, "Please enter a valid IP v4 address." );
+
+$.validator.addMethod( "ipv6", function( value, element ) {
+	return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );
+}, "Please enter a valid IP v6 address." );
+
+$.validator.addMethod( "lessThan", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-lessThan-blur" ).length ) {
+        target.addClass( "validate-lessThan-blur" ).on( "blur.validate-lessThan", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value < target.val();
+}, "Please enter a lesser value." );
+
+$.validator.addMethod( "lessThanEqual", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-lessThanEqual-blur" ).length ) {
+        target.addClass( "validate-lessThanEqual-blur" ).on( "blur.validate-lessThanEqual", function() {
+            $( element ).valid();
+        } );
+    }
 
-$.validator.addMethod("integer", function(value, element) {
-	return this.optional(element) || /^-?\d+$/.test(value);
-}, "A positive or negative non-decimal number please");
+    return value <= target.val();
+}, "Please enter a lesser value." );
 
-$.validator.addMethod("ipv4", function(value, element) {
-	return this.optional(element) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value);
-}, "Please enter a valid IP v4 address.");
+$.validator.addMethod( "lettersonly", function( value, element ) {
+	return this.optional( element ) || /^[a-z]+$/i.test( value );
+}, "Letters only please" );
 
-$.validator.addMethod("ipv6", function(value, element) {
-	return this.optional(element) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);
-}, "Please enter a valid IP v6 address.");
+$.validator.addMethod( "letterswithbasicpunc", function( value, element ) {
+	return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value );
+}, "Letters or punctuation only please" );
 
-$.validator.addMethod("lettersonly", function(value, element) {
-	return this.optional(element) || /^[a-z]+$/i.test(value);
-}, "Letters only please");
+// Limit the number of files in a FileList.
+$.validator.addMethod( "maxfiles", function( value, element, param ) {
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	if ( $( element ).attr( "type" ) === "file" ) {
+		if ( element.files && element.files.length > param ) {
+			return false;
+		}
+	}
 
-$.validator.addMethod("letterswithbasicpunc", function(value, element) {
-	return this.optional(element) || /^[a-z\-.,()'"\s]+$/i.test(value);
-}, "Letters or punctuation only please");
+	return true;
+}, $.validator.format( "Please select no more than {0} files." ) );
+
+// Limit the size of each individual file in a FileList.
+$.validator.addMethod( "maxsize", function( value, element, param ) {
+	if ( this.optional( element ) ) {
+		return true;
+	}
 
-$.validator.addMethod("mobileNL", function(value, element) {
-	return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
-}, "Please specify a valid mobile number");
+	if ( $( element ).attr( "type" ) === "file" ) {
+		if ( element.files && element.files.length ) {
+			for ( var i = 0; i < element.files.length; i++ ) {
+				if ( element.files[ i ].size > param ) {
+					return false;
+				}
+			}
+		}
+	}
+
+	return true;
+}, $.validator.format( "File size must not exceed {0} bytes each." ) );
+
+// Limit the size of all files in a FileList.
+$.validator.addMethod( "maxsizetotal", function( value, element, param ) {
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	if ( $( element ).attr( "type" ) === "file" ) {
+		if ( element.files && element.files.length ) {
+			var totalSize = 0;
+
+			for ( var i = 0; i < element.files.length; i++ ) {
+				totalSize += element.files[ i ].size;
+				if ( totalSize > param ) {
+					return false;
+				}
+			}
+		}
+	}
+
+	return true;
+}, $.validator.format( "Total size of all files must not exceed {0} bytes." ) );
+
+
+$.validator.addMethod( "mobileNL", function( value, element ) {
+	return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
+}, "Please specify a valid mobile number" );
+
+$.validator.addMethod( "mobileRU", function( phone_number, element ) {
+	var ruPhone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || ruPhone_number.length > 9 && /^((\+7|7|8)+([0-9]){10})$/.test( ruPhone_number );
+}, "Please specify a valid mobile number" );
 
 /* For UK phone functions, do the following server side processing:
  * Compare original input with this RegEx pattern:
@@ -520,57 +972,70 @@ $.validator.addMethod("mobileNL", function(value, element) {
  * A number of very detailed GB telephone number RegEx patterns can also be found at:
  * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
  */
-$.validator.addMethod("mobileUK", function(phone_number, element) {
-	phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/);
-}, "Please specify a valid mobile number");
+$.validator.addMethod( "mobileUK", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ );
+}, "Please specify a valid mobile number" );
+
+$.validator.addMethod( "netmask", function( value, element ) {
+    return this.optional( element ) || /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test( value );
+}, "Please enter a valid netmask." );
 
 /*
- * The número de identidad de extranjero ( NIE )is a code used to identify the non-nationals in Spain
+ * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish
+ * authorities to any foreigner.
+ *
+ * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal
+ * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to
+ * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.
  */
-$.validator.addMethod( "nieES", function( value ) {
+$.validator.addMethod( "nieES", function( value, element ) {
 	"use strict";
 
-	value = value.toUpperCase();
+	if ( this.optional( element ) ) {
+		return true;
+	}
 
-	// Basic format test
-	if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+	var nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );
+	var validChars = "TRWAGMYFPDXBNJZSQVHLCKET",
+		letter = value.substr( value.length - 1 ).toUpperCase(),
+		number;
+
+	value = value.toString().toUpperCase();
+
+	// Quick format test
+	if ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {
 		return false;
 	}
 
-	// Test NIE
-	//T
-	if ( /^[T]{1}/.test( value ) ) {
-		return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
-	}
+	// X means same number
+	// Y means number + 10000000
+	// Z means number + 20000000
+	value = value.replace( /^[X]/, "0" )
+		.replace( /^[Y]/, "1" )
+		.replace( /^[Z]/, "2" );
 
-	//XYZ
-	if ( /^[XYZ]{1}/.test( value ) ) {
-		return (
-			value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt(
-				value.replace( "X", "0" )
-					.replace( "Y", "1" )
-					.replace( "Z", "2" )
-					.substring( 0, 8 ) % 23
-			)
-		);
-	}
+	number = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );
 
-	return false;
+	return validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;
 
 }, "Please specify a valid NIE number." );
 
 /*
  * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
  */
-$.validator.addMethod( "nifES", function( value ) {
+$.validator.addMethod( "nifES", function( value, element ) {
 	"use strict";
 
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
 	value = value.toUpperCase();
 
 	// Basic format test
-	if ( !value.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)") ) {
+	if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
 		return false;
 	}
 
@@ -578,18 +1043,104 @@ $.validator.addMethod( "nifES", function( value ) {
 	if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
 		return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
 	}
+
 	// Test specials NIF (starts with K, L or M)
 	if ( /^[KLM]{1}/.test( value ) ) {
-		return ( value[ 8 ] === String.fromCharCode( 64 ) );
+		return ( value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 1 ) % 23 ) );
 	}
 
 	return false;
 
 }, "Please specify a valid NIF number." );
 
-$.validator.addMethod("nowhitespace", function(value, element) {
-	return this.optional(element) || /^\S+$/i.test(value);
-}, "No white space please");
+/*
+ * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies
+ */
+$.validator.addMethod( "nipPL", function( value ) {
+	"use strict";
+
+	value = value.replace( /[^0-9]/g, "" );
+
+	if ( value.length !== 10 ) {
+		return false;
+	}
+
+	var arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];
+	var intSum = 0;
+	for ( var i = 0; i < 9; i++ ) {
+		intSum += arrSteps[ i ] * value[ i ];
+	}
+	var int2 = intSum % 11;
+	var intControlNr = ( int2 === 10 ) ? 0 : int2;
+
+	return ( intControlNr === parseInt( value[ 9 ], 10 ) );
+}, "Please specify a valid NIP number." );
+
+/**
+ * Created for project jquery-validation.
+ * @Description Brazillian PIS or NIS number (Número de Identificação Social Pis ou Pasep) is the equivalent of a
+ * Brazilian tax registration number NIS of PIS numbers have 11 digits in total: 10 numbers followed by 1 check numbers
+ * that are being used for validation.
+ * @copyright (c) 21/08/2018 13:14, Cleiton da Silva Mendonça
+ * @author Cleiton da Silva Mendonça <cleiton.mendonca@gmail.com>
+ * @link http://gitlab.com/csmendonca Gitlab of Cleiton da Silva Mendonça
+ * @link http://github.com/csmendonca Github of Cleiton da Silva Mendonça
+ */
+$.validator.addMethod( "nisBR", function( value ) {
+	var number;
+	var cn;
+	var sum = 0;
+	var dv;
+	var count;
+	var multiplier;
+
+	// Removing special characters from value
+	value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+	// Checking value to have 11 digits only
+	if ( value.length !== 11 ) {
+		return false;
+	}
+
+	//Get check number of value
+	cn = parseInt( value.substring( 10, 11 ), 10 );
+
+	//Get number with 10 digits of the value
+	number = parseInt( value.substring( 0, 10 ), 10 );
+
+	for ( count = 2; count < 12; count++ ) {
+		multiplier = count;
+		if ( count === 10 ) {
+			multiplier = 2;
+		}
+		if ( count === 11 ) {
+			multiplier = 3;
+		}
+		sum += ( ( number % 10 ) * multiplier );
+		number = parseInt( number / 10, 10 );
+	}
+	dv = ( sum % 11 );
+
+	if ( dv > 1 ) {
+		dv = ( 11 - dv );
+	} else {
+		dv = 0;
+	}
+
+	if ( cn === dv ) {
+		return true;
+	} else {
+		return false;
+	}
+}, "Please specify a valid NIS/PIS number" );
+
+$.validator.addMethod( "notEqualTo", function( value, element, param ) {
+	return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );
+}, "Please enter a different value, values must not be the same." );
+
+$.validator.addMethod( "nowhitespace", function( value, element ) {
+	return this.optional( element ) || /^\S+$/i.test( value );
+}, "No white space please" );
 
 /**
 * Return true if the field value matches the given format RegExp
@@ -604,22 +1155,46 @@ $.validator.addMethod("nowhitespace", function(value, element) {
 * @type Boolean
 * @cat Plugins/Validate/Methods
 */
-$.validator.addMethod("pattern", function(value, element, param) {
-	if (this.optional(element)) {
+$.validator.addMethod( "pattern", function( value, element, param ) {
+	if ( this.optional( element ) ) {
 		return true;
 	}
-	if (typeof param === "string") {
-		param = new RegExp("^(?:" + param + ")$");
+	if ( typeof param === "string" ) {
+		param = new RegExp( "^(?:" + param + ")$" );
 	}
-	return param.test(value);
-}, "Invalid format.");
+	return param.test( value );
+}, "Invalid format." );
 
 /**
  * Dutch phone numbers have 10 digits (or 11 and start with +31).
  */
-$.validator.addMethod("phoneNL", function(value, element) {
-	return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
-}, "Please specify a valid phone number.");
+$.validator.addMethod( "phoneNL", function( value, element ) {
+	return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
+}, "Please specify a valid phone number." );
+
+/**
+ * Polish telephone numbers have 9 digits.
+ *
+ * Mobile phone numbers starts with following digits:
+ * 45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79, 88.
+ *
+ * Fixed-line numbers starts with area codes:
+ * 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 29, 32, 33,
+ * 34, 41, 42, 43, 44, 46, 48, 52, 54, 55, 56, 58, 59, 61,
+ * 62, 63, 65, 67, 68, 71, 74, 75, 76, 77, 81, 82, 83, 84,
+ * 85, 86, 87, 89, 91, 94, 95.
+ *
+ * Ministry of National Defence numbers and VoIP numbers starts with 26 and 39.
+ *
+ * Excludes intelligent networks (premium rate, shared cost, free phone numbers).
+ *
+ * Poland National Numbering Plan http://www.itu.int/oth/T02020000A8/en
+ */
+$.validator.addMethod( "phonePL", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\s+/g, "" );
+	var regexp = /^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;
+	return this.optional( element ) || regexp.test( phone_number );
+}, "Please specify a valid phone number" );
 
 /* For UK phone functions, do the following server side processing:
  * Compare original input with this RegEx pattern:
@@ -629,14 +1204,30 @@ $.validator.addMethod("phoneNL", function(value, element) {
  * A number of very detailed GB telephone number RegEx patterns can also be found at:
  * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
  */
-$.validator.addMethod("phoneUK", function(phone_number, element) {
-	phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/);
-}, "Please specify a valid phone number");
+
+// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
+$.validator.addMethod( "phonesUK", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ );
+}, "Please specify a valid uk phone number" );
+
+/* For UK phone functions, do the following server side processing:
+ * Compare original input with this RegEx pattern:
+ * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
+ * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
+ * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
+ * A number of very detailed GB telephone number RegEx patterns can also be found at:
+ * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
+ */
+$.validator.addMethod( "phoneUK", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ );
+}, "Please specify a valid phone number" );
 
 /**
- * matches US phone number format
+ * Matches US phone number format
  *
  * where the area code may not start with 1 and the prefix may not start with 1
  * allows '-' or ' ' as a separator and allows parens around area code
@@ -651,26 +1242,23 @@ $.validator.addMethod("phoneUK", function(phone_number, element) {
  * and not
  * 212 123 4567
  */
-$.validator.addMethod("phoneUS", function(phone_number, element) {
-	phone_number = phone_number.replace(/\s+/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/);
-}, "Please specify a valid phone number");
+$.validator.addMethod( "phoneUS", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\s+/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/ );
+}, "Please specify a valid phone number" );
 
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-//Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
-$.validator.addMethod("phonesUK", function(phone_number, element) {
-	phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/);
-}, "Please specify a valid uk phone number");
+/*
+* Valida CEPs do brasileiros:
+*
+* Formatos aceitos:
+* 99999-999
+* 99.999-999
+* 99999999
+*/
+$.validator.addMethod( "postalcodeBR", function( cep_value, element ) {
+	return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
+}, "Informe um CEP válido." );
 
 /**
  * Matches a valid Canadian Postal Code
@@ -686,34 +1274,22 @@ $.validator.addMethod("phonesUK", function(phone_number, element) {
  * @cat Plugins/Validate/Methods
  */
 $.validator.addMethod( "postalCodeCA", function( value, element ) {
-	return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test( value );
+	return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value );
 }, "Please specify a valid postal code" );
 
-/*
-* Valida CEPs do brasileiros:
-*
-* Formatos aceitos:
-* 99999-999
-* 99.999-999
-* 99999999
-*/
-$.validator.addMethod("postalcodeBR", function(cep_value, element) {
-	return this.optional(element) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
-}, "Informe um CEP válido.");
-
 /* Matches Italian postcode (CAP) */
-$.validator.addMethod("postalcodeIT", function(value, element) {
-	return this.optional(element) || /^\d{5}$/.test(value);
-}, "Please specify a valid postal code");
+$.validator.addMethod( "postalcodeIT", function( value, element ) {
+	return this.optional( element ) || /^\d{5}$/.test( value );
+}, "Please specify a valid postal code" );
 
-$.validator.addMethod("postalcodeNL", function(value, element) {
-	return this.optional(element) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(value);
-}, "Please specify a valid postal code");
+$.validator.addMethod( "postalcodeNL", function( value, element ) {
+	return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value );
+}, "Please specify a valid postal code" );
 
 // Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
-$.validator.addMethod("postcodeUK", function(value, element) {
-	return this.optional(element) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(value);
-}, "Please specify a valid UK postcode");
+$.validator.addMethod( "postcodeUK", function( value, element ) {
+	return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value );
+}, "Please specify a valid UK postcode" );
 
 /*
  * Lets you say "at least X inputs that match selector Y must be filled."
@@ -731,27 +1307,27 @@ $.validator.addMethod("postcodeUK", function(value, element) {
  * options[0]: number of fields that must be filled in the group
  * options[1]: CSS selector that defines the group of conditionally required fields
  */
-$.validator.addMethod("require_from_group", function(value, element, options) {
-	var $fields = $(options[1], element.form),
-		$fieldsFirst = $fields.eq(0),
-		validator = $fieldsFirst.data("valid_req_grp") ? $fieldsFirst.data("valid_req_grp") : $.extend({}, this),
-		isValid = $fields.filter(function() {
-			return validator.elementValue(this);
-		}).length >= options[0];
+$.validator.addMethod( "require_from_group", function( value, element, options ) {
+	var $fields = $( options[ 1 ], element.form ),
+		$fieldsFirst = $fields.eq( 0 ),
+		validator = $fieldsFirst.data( "valid_req_grp" ) ? $fieldsFirst.data( "valid_req_grp" ) : $.extend( {}, this ),
+		isValid = $fields.filter( function() {
+			return validator.elementValue( this );
+		} ).length >= options[ 0 ];
 
 	// Store the cloned validator for future validation
-	$fieldsFirst.data("valid_req_grp", validator);
+	$fieldsFirst.data( "valid_req_grp", validator );
 
 	// If element isn't being validated, run each require_from_group field's validation rules
-	if (!$(element).data("being_validated")) {
-		$fields.data("being_validated", true);
-		$fields.each(function() {
-			validator.element(this);
-		});
-		$fields.data("being_validated", false);
+	if ( !$( element ).data( "being_validated" ) ) {
+		$fields.data( "being_validated", true );
+		$fields.each( function() {
+			validator.element( this );
+		} );
+		$fields.data( "being_validated", false );
 	}
 	return isValid;
-}, $.validator.format("Please fill at least {0} of these fields."));
+}, $.validator.format( "Please fill at least {0} of these fields." ) );
 
 /*
  * Lets you say "either at least X inputs that match selector Y must be filled,
@@ -774,28 +1350,28 @@ $.validator.addMethod("require_from_group", function(value, element, options) {
  * options[1]: CSS selector that defines the group of conditionally required fields
  *
  */
-$.validator.addMethod("skip_or_fill_minimum", function(value, element, options) {
-	var $fields = $(options[1], element.form),
-		$fieldsFirst = $fields.eq(0),
-		validator = $fieldsFirst.data("valid_skip") ? $fieldsFirst.data("valid_skip") : $.extend({}, this),
-		numberFilled = $fields.filter(function() {
-			return validator.elementValue(this);
-		}).length,
-		isValid = numberFilled === 0 || numberFilled >= options[0];
+$.validator.addMethod( "skip_or_fill_minimum", function( value, element, options ) {
+	var $fields = $( options[ 1 ], element.form ),
+		$fieldsFirst = $fields.eq( 0 ),
+		validator = $fieldsFirst.data( "valid_skip" ) ? $fieldsFirst.data( "valid_skip" ) : $.extend( {}, this ),
+		numberFilled = $fields.filter( function() {
+			return validator.elementValue( this );
+		} ).length,
+		isValid = numberFilled === 0 || numberFilled >= options[ 0 ];
 
 	// Store the cloned validator for future validation
-	$fieldsFirst.data("valid_skip", validator);
+	$fieldsFirst.data( "valid_skip", validator );
 
 	// If element isn't being validated, run each skip_or_fill_minimum field's validation rules
-	if (!$(element).data("being_validated")) {
-		$fields.data("being_validated", true);
-		$fields.each(function() {
-			validator.element(this);
-		});
-		$fields.data("being_validated", false);
+	if ( !$( element ).data( "being_validated" ) ) {
+		$fields.data( "being_validated", true );
+		$fields.each( function() {
+			validator.element( this );
+		} );
+		$fields.data( "being_validated", false );
 	}
 	return isValid;
-}, $.validator.format("Please either skip these fields or fill at least {0} of them."));
+}, $.validator.format( "Please either skip these fields or fill at least {0} of them." ) );
 
 /* Validates US States and/or Territories by @jdforsythe
  * Can be case insensitive or require capitalization - default is case insensitive
@@ -830,49 +1406,45 @@ $.validator.addMethod("skip_or_fill_minimum", function(value, element, options)
  *     includeMilitary: true
  *  }
  *
- *
- *
  */
-
-jQuery.validator.addMethod("stateUS", function(value, element, options) {
+$.validator.addMethod( "stateUS", function( value, element, options ) {
 	var isDefault = typeof options === "undefined",
 		caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
 		includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
 		includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
 		regex;
 
-	if (!includeTerritories && !includeMilitary) {
+	if ( !includeTerritories && !includeMilitary ) {
 		regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
-	} else if (includeTerritories && includeMilitary) {
+	} else if ( includeTerritories && includeMilitary ) {
 		regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
-	} else if (includeTerritories) {
+	} else if ( includeTerritories ) {
 		regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
 	} else {
 		regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
 	}
 
-	regex = caseSensitive ? new RegExp(regex) : new RegExp(regex, "i");
-	return this.optional(element) || regex.test(value);
-},
-"Please specify a valid state");
+	regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" );
+	return this.optional( element ) || regex.test( value );
+}, "Please specify a valid state" );
 
 // TODO check if value starts with <, otherwise don't try stripping anything
-$.validator.addMethod("strippedminlength", function(value, element, param) {
-	return $(value).text().length >= param;
-}, $.validator.format("Please enter at least {0} characters"));
+$.validator.addMethod( "strippedminlength", function( value, element, param ) {
+	return $( value ).text().length >= param;
+}, $.validator.format( "Please enter at least {0} characters" ) );
 
-$.validator.addMethod("time", function(value, element) {
-	return this.optional(element) || /^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(value);
-}, "Please enter a valid time, between 00:00 and 23:59");
+$.validator.addMethod( "time", function( value, element ) {
+	return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value );
+}, "Please enter a valid time, between 00:00 and 23:59" );
 
-$.validator.addMethod("time12h", function(value, element) {
-	return this.optional(element) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(value);
-}, "Please enter a valid time in 12-hour am/pm format");
+$.validator.addMethod( "time12h", function( value, element ) {
+	return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value );
+}, "Please enter a valid time in 12-hour am/pm format" );
 
-// same as url, but TLD is optional
-$.validator.addMethod("url2", function(value, element) {
-	return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
-}, $.validator.messages.url);
+// Same as url, but TLD is optional
+$.validator.addMethod( "url2", function( value, element ) {
+	return this.optional( element ) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
+}, $.validator.messages.url );
 
 /**
  * Return true, if the value is a valid vehicle identification number (VIN).
@@ -886,8 +1458,8 @@ $.validator.addMethod("url2", function(value, element) {
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
-$.validator.addMethod("vinUS", function(v) {
-	if (v.length !== 17) {
+$.validator.addMethod( "vinUS", function( v ) {
+	if ( v.length !== 17 ) {
 		return false;
 	}
 
@@ -897,21 +1469,21 @@ $.validator.addMethod("vinUS", function(v) {
 		rs = 0,
 		i, n, d, f, cd, cdv;
 
-	for (i = 0; i < 17; i++) {
-		f = FL[i];
-		d = v.slice(i, i + 1);
-		if (i === 8) {
+	for ( i = 0; i < 17; i++ ) {
+		f = FL[ i ];
+		d = v.slice( i, i + 1 );
+		if ( i === 8 ) {
 			cdv = d;
 		}
-		if (!isNaN(d)) {
+		if ( !isNaN( d ) ) {
 			d *= f;
 		} else {
-			for (n = 0; n < LL.length; n++) {
-				if (d.toUpperCase() === LL[n]) {
-					d = VL[n];
+			for ( n = 0; n < LL.length; n++ ) {
+				if ( d.toUpperCase() === LL[ n ] ) {
+					d = VL[ n ];
 					d *= f;
-					if (isNaN(cdv) && n === 8) {
-						cdv = LL[n];
+					if ( isNaN( cdv ) && n === 8 ) {
+						cdv = LL[ n ];
 					}
 					break;
 				}
@@ -920,21 +1492,21 @@ $.validator.addMethod("vinUS", function(v) {
 		rs += d;
 	}
 	cd = rs % 11;
-	if (cd === 10) {
+	if ( cd === 10 ) {
 		cd = "X";
 	}
-	if (cd === cdv) {
+	if ( cd === cdv ) {
 		return true;
 	}
 	return false;
-}, "The specified vehicle identification number (VIN) is invalid.");
-
-$.validator.addMethod("zipcodeUS", function(value, element) {
-	return this.optional(element) || /^\d{5}(-\d{4})?$/.test(value);
-}, "The specified US ZIP Code is invalid");
+}, "The specified vehicle identification number (VIN) is invalid." );
 
-$.validator.addMethod("ziprange", function(value, element) {
-	return this.optional(element) || /^90[2-5]\d\{2\}-\d{4}$/.test(value);
-}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx");
+$.validator.addMethod( "zipcodeUS", function( value, element ) {
+	return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value );
+}, "The specified US ZIP Code is invalid" );
 
+$.validator.addMethod( "ziprange", function( value, element ) {
+	return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value );
+}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx" );
+return $;
 }));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/additional-methods.min.js b/civicrm/bower_components/jquery-validation/dist/additional-methods.min.js
index 6e6f0e9af6..ae53b96101 100644
--- a/civicrm/bower_components/jquery-validation/dist/additional-methods.min.js
+++ b/civicrm/bower_components/jquery-validation/dist/additional-methods.min.js
@@ -1,4 +1,4 @@
-/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014
- * http://jqueryvalidation.org/
- * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):a(jQuery)}(function(a){!function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g="string"==typeof d?d.replace(/\s/g,"").replace(/,/g,"|"):"image/*",h=this.optional(c);if(h)return h;if("file"===a(c).attr("type")&&(g=g.replace(/\*/g,".*"),c.files&&c.files.length))for(e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(new RegExp(".?("+g+")$","i")))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;h>c;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a)},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a){"use strict";var b,c,d,e,f,g,h=[];if(a=a.toUpperCase(),!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)"))return!1;for(d=0;9>d;d++)h[d]=parseInt(a.charAt(d),10);for(c=h[2]+h[4]+h[6],e=1;8>e;e+=2)f=(2*h[e]).toString(),g=f.charAt(1),c+=parseInt(f.charAt(0),10)+(""===g?0:parseInt(g,10));return/^[ABCDEFGHJNPQRSUVW]{1}/.test(a)?(c+="",b=10-parseInt(c.charAt(c.length-1),10),a+=b,h[8].toString()===String.fromCharCode(64+b)||h[8].toString()===a.charAt(a.length-1)):!1},"Please specify a valid CIF number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:128&d?!0:!1},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=e?!0:c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},"Please enter a correct date"),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(f,e-1,d,12,0,0,0),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d?!0:!1):h=!1,this.optional(b)||h},"Please enter a correct date"),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},"Please enter a correct date"),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp(".("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="";if(!/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(l))return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[T]{1}/.test(a)?a[8]===/^[T]{1}[A-Z0-9]{8}$/.test(a):/^[XYZ]{1}/.test(a)?a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.replace("X","0").replace("Y","1").replace("Z","2").substring(0,8)%23):!1:!1},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):/^[KLM]{1}/.test(a)?a[8]===String.fromCharCode(64):!1:!1},"Please specify a valid NIF number."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return this.optional(b)?!0:("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),jQuery.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=e||"undefined"==typeof c.caseSensitive?!1:c.caseSensitive,g=e||"undefined"==typeof c.includeTerritories?!1:c.includeTerritories,h=e||"undefined"==typeof c.includeMilitary?!1:c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;17>b;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g?!0:!1},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx")});
\ No newline at end of file
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("abaRoutingNumber",function(a){var b=0,c=a.split(""),d=c.length;if(9!==d)return!1;for(var e=0;e<d;e+=3)b+=3*parseInt(c[e],10)+7*parseInt(c[e+1],10)+parseInt(c[e+2],10);return 0!==b&&b%10===0},"Please enter a valid routing number."),a.validator.addMethod("accept",function(b,c,d){var e,f,g,h="string"==typeof d?d.replace(/\s/g,""):"image/*",i=this.optional(c);if(i)return i;if("file"===a(c).attr("type")&&(h=h.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g,"\\$&").replace(/,/g,"|").replace(/\/\*/g,"/.*"),c.files&&c.files.length))for(g=new RegExp(".?("+h+")$","i"),e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(g))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;c<h;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a.toUpperCase())},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a,b){"use strict";function c(a){return a%2===0}if(this.optional(b))return!0;var d,e,f,g,h=new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi),i=a.substring(0,1),j=a.substring(1,8),k=a.substring(8,9),l=0,m=0,n=0;if(9!==a.length||!h.test(a))return!1;for(d=0;d<j.length;d++)e=parseInt(j[d],10),c(d)?(e*=2,n+=e<10?e:e-9):m+=e;return l=m+n,f=(10-l.toString().substr(-1)).toString(),f=parseInt(f,10)>9?"0":f,g="JABCDEFGHI".substr(f,1).toString(),i.match(/[ABEH]/)?k===f:i.match(/[KPQS]/)?k===g:k===f||k===g},"Please specify a valid CIF number."),a.validator.addMethod("cnhBR",function(a){if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f,g,h=0,i=0;if(b=a.charAt(0),new Array(12).join(b)===a)return!1;for(e=0,f=9,g=0;e<9;++e,--f)h+=+(a.charAt(e)*f);for(c=h%11,c>=10&&(c=0,i=2),h=0,e=0,f=1,g=0;e<9;++e,++f)h+=+(a.charAt(e)*f);return d=h%11,d>=10?d=0:d-=i,String(c).concat(d)===a.substr(-2)},"Please specify a valid CNH number"),a.validator.addMethod("cnpjBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/[^\d]+/g,""),14!==a.length)return!1;if("00000000000000"===a||"11111111111111"===a||"22222222222222"===a||"33333333333333"===a||"44444444444444"===a||"55555555555555"===a||"66666666666666"===a||"77777777777777"===a||"88888888888888"===a||"99999999999999"===a)return!1;for(var c=a.length-2,d=a.substring(0,c),e=a.substring(c),f=0,g=c-7,h=c;h>=1;h--)f+=d.charAt(c-h)*g--,g<2&&(g=9);var i=f%11<2?0:11-f%11;if(i!==parseInt(e.charAt(0),10))return!1;c+=1,d=a.substring(0,c),f=0,g=c-7;for(var j=c;j>=1;j--)f+=d.charAt(c-j)*g--,g<2&&(g=9);return i=f%11<2?0:11-f%11,i===parseInt(e.charAt(1),10)},"Please specify a CNPJ value number"),a.validator.addMethod("cpfBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var c,d,e,f,g=0;if(c=parseInt(a.substring(9,10),10),d=parseInt(a.substring(10,11),10),e=function(a,b){var c=10*a%11;return 10!==c&&11!==c||(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(f=1;f<=9;f++)g+=parseInt(a.substring(f-1,f),10)*(11-f);if(e(g,c)){for(g=0,f=1;f<=10;f++)g+=parseInt(a.substring(f-1,f),10)*(12-f);return e(g,d)}return!1},"Please specify a valid CPF number"),a.validator.addMethod("creditcard",function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},"Please enter a valid credit card number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&(/^(5[12345])/.test(a)||/^(2[234567])/.test(a))?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:!!(128&d)},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=!!e||c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("greaterThan",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThan-blur").length&&e.addClass("validate-greaterThan-blur").on("blur.validate-greaterThan",function(){a(c).valid()}),b>e.val()},"Please enter a greater value."),a.validator.addMethod("greaterThanEqual",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThanEqual-blur").length&&e.addClass("validate-greaterThanEqual-blur").on("blur.validate-greaterThanEqual",function(){a(c).valid()}),b>=e.val()},"Please enter a greater value."),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="",q=5;if(l.length<q)return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lessThan",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-lessThan-blur").length&&e.addClass("validate-lessThan-blur").on("blur.validate-lessThan",function(){a(c).valid()}),b<e.val()},"Please enter a lesser value."),a.validator.addMethod("lessThanEqual",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-lessThanEqual-blur").length&&e.addClass("validate-lessThanEqual-blur").on("blur.validate-lessThanEqual",function(){a(c).valid()}),b<=e.val()},"Please enter a lesser value."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("maxfiles",function(b,c,d){return!!this.optional(c)||!("file"===a(c).attr("type")&&c.files&&c.files.length>d)},a.validator.format("Please select no more than {0} files.")),a.validator.addMethod("maxsize",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0;e<c.files.length;e++)if(c.files[e].size>d)return!1;return!0},a.validator.format("File size must not exceed {0} bytes each.")),a.validator.addMethod("maxsizetotal",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0,f=0;f<c.files.length;f++)if(e+=c.files[f].size,e>d)return!1;return!0},a.validator.format("Total size of all files must not exceed {0} bytes.")),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileRU",function(a,b){var c=a.replace(/\(|\)|\s+|-/g,"");return this.optional(b)||c.length>9&&/^((\+7|7|8)+([0-9]){10})$/.test(c)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("netmask",function(a,b){return this.optional(b)||/^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test(a)},"Please enter a valid netmask."),a.validator.addMethod("nieES",function(a,b){"use strict";if(this.optional(b))return!0;var c,d=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),e="TRWAGMYFPDXBNJZSQVHLCKET",f=a.substr(a.length-1).toUpperCase();return a=a.toString().toUpperCase(),!(a.length>10||a.length<9||!d.test(a))&&(a=a.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),c=9===a.length?a.substr(0,8):a.substr(0,9),e.charAt(parseInt(c,10)%23)===f)},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a,b){"use strict";return!!this.optional(b)||(a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,1)%23)))},"Please specify a valid NIF number."),a.validator.addMethod("nipPL",function(a){"use strict";if(a=a.replace(/[^0-9]/g,""),10!==a.length)return!1;for(var b=[6,5,7,2,3,4,5,6,7],c=0,d=0;d<9;d++)c+=b[d]*a[d];var e=c%11,f=10===e?0:e;return f===parseInt(a[9],10)},"Please specify a valid NIP number."),a.validator.addMethod("nisBR",function(a){var b,c,d,e,f,g=0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;for(c=parseInt(a.substring(10,11),10),b=parseInt(a.substring(0,10),10),e=2;e<12;e++)f=e,10===e&&(f=2),11===e&&(f=3),g+=b%10*f,b=parseInt(b/10,10);return d=g%11,d=d>1?11-d:0,c===d},"Please specify a valid NIS/PIS number"),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonePL",function(a,b){a=a.replace(/\s+/g,"");var c=/^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;return this.optional(b)||c.test(a)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx"),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/jquery-validation-sri.json b/civicrm/bower_components/jquery-validation/dist/jquery-validation-sri.json
new file mode 100644
index 0000000000..04c622d963
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/jquery-validation-sri.json
@@ -0,0 +1,1154 @@
+{
+  "@dist/jquery.validate.js": {
+    "hashes": {
+      "sha256": "83vfPHCYD9yNhsVUj+Le81R0ZZs/lqBT6iuRU0YMHtM=",
+      "sha384": "WKaiWbhyi5GNB8avLfaulnTABCGvdxgYUjvdBm2VI2HHR10r9PkSxCicWmltAUi5",
+      "sha512": "YZ4680gzQkSJxxoo9rsp9Z5CfitwrSM7s5YRSjDwV8E2uNKXyz8Aat8/KxiHELXHPuYjxp+Qy3QsTB/WYMEByQ=="
+    },
+    "integrity": "sha256-83vfPHCYD9yNhsVUj+Le81R0ZZs/lqBT6iuRU0YMHtM= sha384-WKaiWbhyi5GNB8avLfaulnTABCGvdxgYUjvdBm2VI2HHR10r9PkSxCicWmltAUi5 sha512-YZ4680gzQkSJxxoo9rsp9Z5CfitwrSM7s5YRSjDwV8E2uNKXyz8Aat8/KxiHELXHPuYjxp+Qy3QsTB/WYMEByQ==",
+    "path": "dist/jquery.validate.js"
+  },
+  "@dist/jquery.validate.min.js": {
+    "hashes": {
+      "sha256": "sPB0F50YUDK0otDnsfNHawYmA5M0pjjUf4TvRJkGFrI=",
+      "sha384": "6UVI3atWyL/qZbDIJb7HW8PyHhFNMiX5rYNY2gAYcaYJjYk5cNIQShSQPBleGMYu",
+      "sha512": "0QDLUJ0ILnknsQdYYjG7v2j8wERkKufvjBNmng/EdR/s/SE7X8cQ9y0+wMzuQT0lfXQ/NhG+zhmHNOWTUS3kMA=="
+    },
+    "integrity": "sha256-sPB0F50YUDK0otDnsfNHawYmA5M0pjjUf4TvRJkGFrI= sha384-6UVI3atWyL/qZbDIJb7HW8PyHhFNMiX5rYNY2gAYcaYJjYk5cNIQShSQPBleGMYu sha512-0QDLUJ0ILnknsQdYYjG7v2j8wERkKufvjBNmng/EdR/s/SE7X8cQ9y0+wMzuQT0lfXQ/NhG+zhmHNOWTUS3kMA==",
+    "path": "dist/jquery.validate.min.js"
+  },
+  "@dist/additional-methods.js": {
+    "hashes": {
+      "sha256": "RN8OD8mX3LbsGWgBibEEPjwHfniMo6BVHFM9PGRth78=",
+      "sha384": "rEFNFH0NLoF2fv7w+H4iCQzy+vAZ6HfENorqteB7azkXxvfGy2jtD5WJUZBow5t+",
+      "sha512": "8XmwI3u+H53vgaZMUe/WjqOYOFoGAnVfeMoE8h53nV9sr6XutdJwAjXkCW0ShO9nCZEMFiOdujVjB8qsYBiSTg=="
+    },
+    "integrity": "sha256-RN8OD8mX3LbsGWgBibEEPjwHfniMo6BVHFM9PGRth78= sha384-rEFNFH0NLoF2fv7w+H4iCQzy+vAZ6HfENorqteB7azkXxvfGy2jtD5WJUZBow5t+ sha512-8XmwI3u+H53vgaZMUe/WjqOYOFoGAnVfeMoE8h53nV9sr6XutdJwAjXkCW0ShO9nCZEMFiOdujVjB8qsYBiSTg==",
+    "path": "dist/additional-methods.js"
+  },
+  "@dist/additional-methods.min.js": {
+    "hashes": {
+      "sha256": "vb+6VObiUIaoRuSusdLRWtXs/ewuz62LgVXg2f1ZXGo=",
+      "sha384": "+9oZBwhpg6hNnpXhuEkmAUXP1YGXnRZEH7KB6j6u73Ugx0YNlB/EdaNAs5mihho5",
+      "sha512": "/KqL6qPlIMqbgKgrc650iXf2m5Z1vHDbWcuecnn1SGC7mmyp3v1nYNj0BSn8bVFQ+FOqJ1b9qrXTIPSj2+yWYw=="
+    },
+    "integrity": "sha256-vb+6VObiUIaoRuSusdLRWtXs/ewuz62LgVXg2f1ZXGo= sha384-+9oZBwhpg6hNnpXhuEkmAUXP1YGXnRZEH7KB6j6u73Ugx0YNlB/EdaNAs5mihho5 sha512-/KqL6qPlIMqbgKgrc650iXf2m5Z1vHDbWcuecnn1SGC7mmyp3v1nYNj0BSn8bVFQ+FOqJ1b9qrXTIPSj2+yWYw==",
+    "path": "dist/additional-methods.min.js"
+  },
+  "@dist/localization/messages_ar.js": {
+    "hashes": {
+      "sha256": "JDTfgZQOSLV9mjnovj3+rlPj9/XBY859PK9148aj3MQ=",
+      "sha384": "OusKJJ8i2ThwQU+MndhJWYXYChY1oD3FaLGeXz5X4kLIPN/0cXH24yM0jb15Rr3X",
+      "sha512": "W6tZT0Wlt7v8bfwnrr8Claq9srBsCR67VOdI7lZT8J9ghe6BANDMkmEl4SHfEMrM8vn+xtsYNGs24kluTi98LA=="
+    },
+    "integrity": "sha256-JDTfgZQOSLV9mjnovj3+rlPj9/XBY859PK9148aj3MQ= sha384-OusKJJ8i2ThwQU+MndhJWYXYChY1oD3FaLGeXz5X4kLIPN/0cXH24yM0jb15Rr3X sha512-W6tZT0Wlt7v8bfwnrr8Claq9srBsCR67VOdI7lZT8J9ghe6BANDMkmEl4SHfEMrM8vn+xtsYNGs24kluTi98LA==",
+    "path": "dist/localization/messages_ar.js"
+  },
+  "@dist/localization/messages_ar.min.js": {
+    "hashes": {
+      "sha256": "EPgqOoVBNThJb8TtkiZe177cdDIaFu6CX7d5DzLCzZ4=",
+      "sha384": "MZ80Bdee3SLcarPx96xvlXAwYevHnG9PR93Qfr6GGY26fTWwaZ9laL635aQgfuSc",
+      "sha512": "HRO9Ix/zHqesUYHCMy6r79oNq9TZ4LbZAHx9gZWgEnccBLbwuClzXLKVJWbizSGva4RYiIboW6Y7jVJaPCl72g=="
+    },
+    "integrity": "sha256-EPgqOoVBNThJb8TtkiZe177cdDIaFu6CX7d5DzLCzZ4= sha384-MZ80Bdee3SLcarPx96xvlXAwYevHnG9PR93Qfr6GGY26fTWwaZ9laL635aQgfuSc sha512-HRO9Ix/zHqesUYHCMy6r79oNq9TZ4LbZAHx9gZWgEnccBLbwuClzXLKVJWbizSGva4RYiIboW6Y7jVJaPCl72g==",
+    "path": "dist/localization/messages_ar.min.js"
+  },
+  "@dist/localization/messages_az.js": {
+    "hashes": {
+      "sha256": "0pfXjEXOQLMAtqNAnyECpcc7V1CVZUxvb6p8PM1nhFQ=",
+      "sha384": "VSzvJ5QUKds5GlcHFze5F88YDNcNhKGEGL7zV7pHFj4+zXXRrVBwHGAwkidEzDdp",
+      "sha512": "4hqnVRX3B4PRVH+hsN0+G0B/Njww6RiDebAAo0mbs76YsWM3/TdyJWX+YdsshsiFpgyO/+IGieh+mH5H+FUL4A=="
+    },
+    "integrity": "sha256-0pfXjEXOQLMAtqNAnyECpcc7V1CVZUxvb6p8PM1nhFQ= sha384-VSzvJ5QUKds5GlcHFze5F88YDNcNhKGEGL7zV7pHFj4+zXXRrVBwHGAwkidEzDdp sha512-4hqnVRX3B4PRVH+hsN0+G0B/Njww6RiDebAAo0mbs76YsWM3/TdyJWX+YdsshsiFpgyO/+IGieh+mH5H+FUL4A==",
+    "path": "dist/localization/messages_az.js"
+  },
+  "@dist/localization/messages_az.min.js": {
+    "hashes": {
+      "sha256": "5AzWJuzi2gHoRhg4E2+3FIKxQC+FKWWCAMWwb4ChOfk=",
+      "sha384": "IZ7G/7JFq5kmZ6anG+5PFbGoUsGbL8PR/HPpbFdyOsV8u7G/REbqUEEGp1jtQkiQ",
+      "sha512": "+LRAzEN8ikjJSLL/0XONy8Tkw6zWqRQjbu0yxGA7b1+Kp5lLcK3kEj7JYGxbAyVGUGEYyHjjykR8jJrZ7wTQYQ=="
+    },
+    "integrity": "sha256-5AzWJuzi2gHoRhg4E2+3FIKxQC+FKWWCAMWwb4ChOfk= sha384-IZ7G/7JFq5kmZ6anG+5PFbGoUsGbL8PR/HPpbFdyOsV8u7G/REbqUEEGp1jtQkiQ sha512-+LRAzEN8ikjJSLL/0XONy8Tkw6zWqRQjbu0yxGA7b1+Kp5lLcK3kEj7JYGxbAyVGUGEYyHjjykR8jJrZ7wTQYQ==",
+    "path": "dist/localization/messages_az.min.js"
+  },
+  "@dist/localization/messages_bg.js": {
+    "hashes": {
+      "sha256": "xThJeA+Iz5mqQp/cppuoNvZvwe4bNpC4uwRRHhXsrj8=",
+      "sha384": "Dn0N6Qs7wKgt3HvR+HusnXNEYyMAFNUVGUpdlBudO/ipIcGd3i0VcnIF/GVZlfin",
+      "sha512": "Ns+f0TvBTnhAp33sDHf5sg2X6E3J3pBvzaK1kOQo4IoZopOC53j0NMC/2JTsBGIALDpKfyl5jmpo4L4MI1B/Kw=="
+    },
+    "integrity": "sha256-xThJeA+Iz5mqQp/cppuoNvZvwe4bNpC4uwRRHhXsrj8= sha384-Dn0N6Qs7wKgt3HvR+HusnXNEYyMAFNUVGUpdlBudO/ipIcGd3i0VcnIF/GVZlfin sha512-Ns+f0TvBTnhAp33sDHf5sg2X6E3J3pBvzaK1kOQo4IoZopOC53j0NMC/2JTsBGIALDpKfyl5jmpo4L4MI1B/Kw==",
+    "path": "dist/localization/messages_bg.js"
+  },
+  "@dist/localization/messages_bg.min.js": {
+    "hashes": {
+      "sha256": "MHwNPH8iSWiTkfQpK8wBh3zb3tJzMMzMmhMQMEXpXso=",
+      "sha384": "tiCyiGaF6P9rozL/g+eQRZ7/DoiV0hy978MFawSZ1b1MvouQ/hKTiZKDKAFWHVFL",
+      "sha512": "n7o+37Gx5gm33sAY8laLULI4KnzH7IAQ+Qic7D1qi1NQ49Z9sT+SIbo9pVZrPP4pwY/W1orm6KJ3Xkdr4fsHhA=="
+    },
+    "integrity": "sha256-MHwNPH8iSWiTkfQpK8wBh3zb3tJzMMzMmhMQMEXpXso= sha384-tiCyiGaF6P9rozL/g+eQRZ7/DoiV0hy978MFawSZ1b1MvouQ/hKTiZKDKAFWHVFL sha512-n7o+37Gx5gm33sAY8laLULI4KnzH7IAQ+Qic7D1qi1NQ49Z9sT+SIbo9pVZrPP4pwY/W1orm6KJ3Xkdr4fsHhA==",
+    "path": "dist/localization/messages_bg.min.js"
+  },
+  "@dist/localization/messages_bn_BD.js": {
+    "hashes": {
+      "sha256": "98GEJul0pXNNOzIjGH5iCA59SWcJTs3ZIekCgxzPIAk=",
+      "sha384": "EFrbfsKdOYrM5chq38ZrDE/RxsLZTcrYmN+TJygui5s2ubmZRj5cVn/XOAkkKxLz",
+      "sha512": "pg09FVGCrmdSoGeS0MLgwT8n07qjpdU0Nc8PtgvUFj1sd/YFNyooxIm5XQ9VasrT0wuC4QZ2FVNkrEoEeGI2cw=="
+    },
+    "integrity": "sha256-98GEJul0pXNNOzIjGH5iCA59SWcJTs3ZIekCgxzPIAk= sha384-EFrbfsKdOYrM5chq38ZrDE/RxsLZTcrYmN+TJygui5s2ubmZRj5cVn/XOAkkKxLz sha512-pg09FVGCrmdSoGeS0MLgwT8n07qjpdU0Nc8PtgvUFj1sd/YFNyooxIm5XQ9VasrT0wuC4QZ2FVNkrEoEeGI2cw==",
+    "path": "dist/localization/messages_bn_BD.js"
+  },
+  "@dist/localization/messages_bn_BD.min.js": {
+    "hashes": {
+      "sha256": "gfZbuxJ9ELr1Kp9uhjJzsoVaBqUrz8p+xz1rRnIaDTc=",
+      "sha384": "g5L9TWspVns3JB68UPS6MuqhzNqE8D77ror6Lit6txL4a6Rm8lwXrzKh96rizCib",
+      "sha512": "6F+ulnVINOhklHtxO7z4h301UiQvv7bk4Z02zikxmqy5S13RH27alzdZJYWXlW32bR087gFIDxx5DrZ/JKfdAA=="
+    },
+    "integrity": "sha256-gfZbuxJ9ELr1Kp9uhjJzsoVaBqUrz8p+xz1rRnIaDTc= sha384-g5L9TWspVns3JB68UPS6MuqhzNqE8D77ror6Lit6txL4a6Rm8lwXrzKh96rizCib sha512-6F+ulnVINOhklHtxO7z4h301UiQvv7bk4Z02zikxmqy5S13RH27alzdZJYWXlW32bR087gFIDxx5DrZ/JKfdAA==",
+    "path": "dist/localization/messages_bn_BD.min.js"
+  },
+  "@dist/localization/messages_ca.js": {
+    "hashes": {
+      "sha256": "f4sCpq1p0ldFmep5ZC3M9xaFXh+dIDl0jR8pXf54wWM=",
+      "sha384": "aBC97vPm/EmkdhL+xlCI3WhEjxITHMtGZQLGnjAt0Tutndme4pNvX2iE3E0qCb5Y",
+      "sha512": "vTttLwlMpc5+ehgIvRaGWI0gr8QAXhWFaZGN1R1vzPM8ifzgCZ8hMyJBbvEk3nzF5gGc06d/W3WeqMuJ092USQ=="
+    },
+    "integrity": "sha256-f4sCpq1p0ldFmep5ZC3M9xaFXh+dIDl0jR8pXf54wWM= sha384-aBC97vPm/EmkdhL+xlCI3WhEjxITHMtGZQLGnjAt0Tutndme4pNvX2iE3E0qCb5Y sha512-vTttLwlMpc5+ehgIvRaGWI0gr8QAXhWFaZGN1R1vzPM8ifzgCZ8hMyJBbvEk3nzF5gGc06d/W3WeqMuJ092USQ==",
+    "path": "dist/localization/messages_ca.js"
+  },
+  "@dist/localization/messages_ca.min.js": {
+    "hashes": {
+      "sha256": "WvIyrYm4xDemMPZVdwDKDFuOt51ww6gvASsyr9Ef9rg=",
+      "sha384": "iWTytl2viJMgNxooTimMzjBlhE8Z9G5NjO0H5wenK4di1FlKFav1ClgjKqpNp6im",
+      "sha512": "JKYpmPRc19jEjqQPoZSgewEAwicyaUvamJJhHpUbOq3ftxZFEzcIV/y8eUa40j2MVHQ4RBEwaAnzhw726TGt3g=="
+    },
+    "integrity": "sha256-WvIyrYm4xDemMPZVdwDKDFuOt51ww6gvASsyr9Ef9rg= sha384-iWTytl2viJMgNxooTimMzjBlhE8Z9G5NjO0H5wenK4di1FlKFav1ClgjKqpNp6im sha512-JKYpmPRc19jEjqQPoZSgewEAwicyaUvamJJhHpUbOq3ftxZFEzcIV/y8eUa40j2MVHQ4RBEwaAnzhw726TGt3g==",
+    "path": "dist/localization/messages_ca.min.js"
+  },
+  "@dist/localization/messages_cs.js": {
+    "hashes": {
+      "sha256": "bDKnU7d0LuGL7Q2PsXr9DYOHsHfj++MPxqjt6TF7Tbs=",
+      "sha384": "OkGM2okfrc30XHCBYQnlXbtofKybv4VMtwl35gcxZYVM8tLztSNOvdu5d7CsulBn",
+      "sha512": "jJ6YpDwPXDcWs4qYLlY2h0u0k2M12Eha3Rd/aO6z8GEMQkjoejl21NbXN9BDi86TaD4G8K42UmM2CTD6KN18iA=="
+    },
+    "integrity": "sha256-bDKnU7d0LuGL7Q2PsXr9DYOHsHfj++MPxqjt6TF7Tbs= sha384-OkGM2okfrc30XHCBYQnlXbtofKybv4VMtwl35gcxZYVM8tLztSNOvdu5d7CsulBn sha512-jJ6YpDwPXDcWs4qYLlY2h0u0k2M12Eha3Rd/aO6z8GEMQkjoejl21NbXN9BDi86TaD4G8K42UmM2CTD6KN18iA==",
+    "path": "dist/localization/messages_cs.js"
+  },
+  "@dist/localization/messages_cs.min.js": {
+    "hashes": {
+      "sha256": "9lj3nHvJ7+VjPoigbUQzq+5PhngTTuBsqXsStZ9oceI=",
+      "sha384": "+XW60mFP3ctjs9kAQKmkyCFpbNMunuI2zGPmaiXVSKHCAQp6dMO7PrKGX2mQaPhC",
+      "sha512": "4Z9vqkZe62oZdQHTzpY+Q4FQCQQ8KcChwFE+VrHW/0LaM3FQECmE/pIK+JMOjrDAebx1+vHbNbFbJP092C1zDQ=="
+    },
+    "integrity": "sha256-9lj3nHvJ7+VjPoigbUQzq+5PhngTTuBsqXsStZ9oceI= sha384-+XW60mFP3ctjs9kAQKmkyCFpbNMunuI2zGPmaiXVSKHCAQp6dMO7PrKGX2mQaPhC sha512-4Z9vqkZe62oZdQHTzpY+Q4FQCQQ8KcChwFE+VrHW/0LaM3FQECmE/pIK+JMOjrDAebx1+vHbNbFbJP092C1zDQ==",
+    "path": "dist/localization/messages_cs.min.js"
+  },
+  "@dist/localization/messages_da.js": {
+    "hashes": {
+      "sha256": "+srigLRSg8p2w/+GnEVRbh1kXmm4Z/fpYslG6BGESmo=",
+      "sha384": "P0BrWbJsKi0wu5IdA8g+zZDq5AAu17cU2pqLAqU91AvliY2WW5UGJuybAdMm65eW",
+      "sha512": "e+8FPQIIjliuYlagZ+8q2c7fmUSfUCzJ9ylQcaXhDCoUnxbq7s2aHxRotdxj0yUkzsErBEvt3OcgojhlPDt2Mg=="
+    },
+    "integrity": "sha256-+srigLRSg8p2w/+GnEVRbh1kXmm4Z/fpYslG6BGESmo= sha384-P0BrWbJsKi0wu5IdA8g+zZDq5AAu17cU2pqLAqU91AvliY2WW5UGJuybAdMm65eW sha512-e+8FPQIIjliuYlagZ+8q2c7fmUSfUCzJ9ylQcaXhDCoUnxbq7s2aHxRotdxj0yUkzsErBEvt3OcgojhlPDt2Mg==",
+    "path": "dist/localization/messages_da.js"
+  },
+  "@dist/localization/messages_da.min.js": {
+    "hashes": {
+      "sha256": "xdx7coIvm9fRoZy8HHxpiWR17FXemJ1hLCie6pmeod0=",
+      "sha384": "O68plA0Ww8oWbiaiDBE/wfA6ViAvvvuCuvkDCIKjDQLua7VPrA+KOsEHl3p89A7F",
+      "sha512": "9GFI2MkXCGFFFpQdmXRd/v9OVRURkEah4wSjoi9JiassiO1o2n2sKE3T+g9WaMf8tb3z6OWrnqDB+N1QpoXM0w=="
+    },
+    "integrity": "sha256-xdx7coIvm9fRoZy8HHxpiWR17FXemJ1hLCie6pmeod0= sha384-O68plA0Ww8oWbiaiDBE/wfA6ViAvvvuCuvkDCIKjDQLua7VPrA+KOsEHl3p89A7F sha512-9GFI2MkXCGFFFpQdmXRd/v9OVRURkEah4wSjoi9JiassiO1o2n2sKE3T+g9WaMf8tb3z6OWrnqDB+N1QpoXM0w==",
+    "path": "dist/localization/messages_da.min.js"
+  },
+  "@dist/localization/messages_de.js": {
+    "hashes": {
+      "sha256": "KZc0DWGSG6XZ9880cy1Nk3znl1PFUKf4Aqi0J6xoojg=",
+      "sha384": "APkaCDC7OuWWYvC36nY81B8o8LJEkPU7BC3swlJeE6HXsM9V+6inBRn2yQ1N7M3X",
+      "sha512": "q6QxY76COnNMdcLknDq/vXgxoO4MmQWR2uaxB5zaOcCt91ga13g9wlUG1QM1LDarKXQblrIU6cjcsBepDEJP6g=="
+    },
+    "integrity": "sha256-KZc0DWGSG6XZ9880cy1Nk3znl1PFUKf4Aqi0J6xoojg= sha384-APkaCDC7OuWWYvC36nY81B8o8LJEkPU7BC3swlJeE6HXsM9V+6inBRn2yQ1N7M3X sha512-q6QxY76COnNMdcLknDq/vXgxoO4MmQWR2uaxB5zaOcCt91ga13g9wlUG1QM1LDarKXQblrIU6cjcsBepDEJP6g==",
+    "path": "dist/localization/messages_de.js"
+  },
+  "@dist/localization/messages_de.min.js": {
+    "hashes": {
+      "sha256": "zK/5Gq+4AB9uf248zP+lR3jqQvVfgL0i59CJxKL9tFk=",
+      "sha384": "e7PsXYHUW3X+omQsJ/nkGiQKDfWuY/f9tb/SUGNQI8BUUDckFWuiOD4K2715An5B",
+      "sha512": "QObKKlz/BRhvq9G7EqKiBxM7D082SNWY6MJ66+/SlDOFtLFBbwlDjiloYxNuG7B9CjIRR5hp+G2O74nYy2jhDw=="
+    },
+    "integrity": "sha256-zK/5Gq+4AB9uf248zP+lR3jqQvVfgL0i59CJxKL9tFk= sha384-e7PsXYHUW3X+omQsJ/nkGiQKDfWuY/f9tb/SUGNQI8BUUDckFWuiOD4K2715An5B sha512-QObKKlz/BRhvq9G7EqKiBxM7D082SNWY6MJ66+/SlDOFtLFBbwlDjiloYxNuG7B9CjIRR5hp+G2O74nYy2jhDw==",
+    "path": "dist/localization/messages_de.min.js"
+  },
+  "@dist/localization/messages_el.js": {
+    "hashes": {
+      "sha256": "rXqe57L9Re644AOBx+gT8Fgo3puF1aJ0JviKfQRzUfQ=",
+      "sha384": "5SA8COZ/wBs1yaBPH7MpyQz+7DXf15pKL//7kfNmovjTeLWPeMuexIV01aFJHtIo",
+      "sha512": "M3jUFbOi+1NQL+b4q0JKSVro1sH+tvzA0Qn+pwWMYCGsMWzDJbD0ZWXCktdGdjmBHgeQfMRj4YlLzrOiSLvQPw=="
+    },
+    "integrity": "sha256-rXqe57L9Re644AOBx+gT8Fgo3puF1aJ0JviKfQRzUfQ= sha384-5SA8COZ/wBs1yaBPH7MpyQz+7DXf15pKL//7kfNmovjTeLWPeMuexIV01aFJHtIo sha512-M3jUFbOi+1NQL+b4q0JKSVro1sH+tvzA0Qn+pwWMYCGsMWzDJbD0ZWXCktdGdjmBHgeQfMRj4YlLzrOiSLvQPw==",
+    "path": "dist/localization/messages_el.js"
+  },
+  "@dist/localization/messages_el.min.js": {
+    "hashes": {
+      "sha256": "W/Pd64jCtUpSdYBz3/ZISofV5NQuPOMXr/ibb6UMPYk=",
+      "sha384": "Hye8K0X9q9u1xAZINyOCLccwL9wwF9kxTvINKQ5heDTurZ2rg8uXDSszj7oWOzR3",
+      "sha512": "98LgsdscLCymAKPk9a9GaFqPdrlYG9gaXi2gmEzHzHDlL3SNPwOGeaHyY2f05lK96Q/GJi90ipGBHg/hsGvuRA=="
+    },
+    "integrity": "sha256-W/Pd64jCtUpSdYBz3/ZISofV5NQuPOMXr/ibb6UMPYk= sha384-Hye8K0X9q9u1xAZINyOCLccwL9wwF9kxTvINKQ5heDTurZ2rg8uXDSszj7oWOzR3 sha512-98LgsdscLCymAKPk9a9GaFqPdrlYG9gaXi2gmEzHzHDlL3SNPwOGeaHyY2f05lK96Q/GJi90ipGBHg/hsGvuRA==",
+    "path": "dist/localization/messages_el.min.js"
+  },
+  "@dist/localization/messages_es_AR.js": {
+    "hashes": {
+      "sha256": "nW5KeQlGR7K01OKFefASPTRm9M7suT2VfPV9f9uMKzQ=",
+      "sha384": "PcqMhC6Li8r5a6edTpWuySDi6mDKp/Qf77kXpIvVP2ERlsB1o4ggGc4LXXWU2Dx9",
+      "sha512": "m3JIhgnOsA/gGfH0PEl972xWjok38dmwrfupXidV3fxaX/62Agps0D8SvBWffiD89efwX8S1ZKEkQA3aj71v+Q=="
+    },
+    "integrity": "sha256-nW5KeQlGR7K01OKFefASPTRm9M7suT2VfPV9f9uMKzQ= sha384-PcqMhC6Li8r5a6edTpWuySDi6mDKp/Qf77kXpIvVP2ERlsB1o4ggGc4LXXWU2Dx9 sha512-m3JIhgnOsA/gGfH0PEl972xWjok38dmwrfupXidV3fxaX/62Agps0D8SvBWffiD89efwX8S1ZKEkQA3aj71v+Q==",
+    "path": "dist/localization/messages_es_AR.js"
+  },
+  "@dist/localization/messages_es_AR.min.js": {
+    "hashes": {
+      "sha256": "jR74Um2nV3NZ3KqIZX68nAgkIVtu6GRyHDYpGIlmfHc=",
+      "sha384": "TD9M9uF5PpToYSUghHcJspNICJadTnol0m/vUBh2Gf6aqXzzGXgPV2W1MOIUY3rx",
+      "sha512": "YNdlGsWfCDTfDT2Z9hyjZ+UoEpwgRKsYLpFQ76Pns3acHnX4WC9vIDxKZX8Zn4Asiwwut3rSvumn586XgMy9OA=="
+    },
+    "integrity": "sha256-jR74Um2nV3NZ3KqIZX68nAgkIVtu6GRyHDYpGIlmfHc= sha384-TD9M9uF5PpToYSUghHcJspNICJadTnol0m/vUBh2Gf6aqXzzGXgPV2W1MOIUY3rx sha512-YNdlGsWfCDTfDT2Z9hyjZ+UoEpwgRKsYLpFQ76Pns3acHnX4WC9vIDxKZX8Zn4Asiwwut3rSvumn586XgMy9OA==",
+    "path": "dist/localization/messages_es_AR.min.js"
+  },
+  "@dist/localization/messages_es_PE.js": {
+    "hashes": {
+      "sha256": "6Z4px6talUo7+2elXm4i7UpQSBI1Fzr5wxArkkj3W7s=",
+      "sha384": "me2bViOw85pViuYmJHtegb168ZD8dFTxNL0CulJwgOXmO9HVwem3oOk+2n3cZjVU",
+      "sha512": "DlD59jN6hUya6U9Vs6Ni+tyA1/JxKbMHA4Zl01zv/XNsVt8/yKnVoPitGnfSw1I4r5J7VPuqddyN/S6A/qQz5g=="
+    },
+    "integrity": "sha256-6Z4px6talUo7+2elXm4i7UpQSBI1Fzr5wxArkkj3W7s= sha384-me2bViOw85pViuYmJHtegb168ZD8dFTxNL0CulJwgOXmO9HVwem3oOk+2n3cZjVU sha512-DlD59jN6hUya6U9Vs6Ni+tyA1/JxKbMHA4Zl01zv/XNsVt8/yKnVoPitGnfSw1I4r5J7VPuqddyN/S6A/qQz5g==",
+    "path": "dist/localization/messages_es_PE.js"
+  },
+  "@dist/localization/messages_es_PE.min.js": {
+    "hashes": {
+      "sha256": "WGe9wpRE5tTs1npu6As9N9X9bkgf5t4fvBKgslbIGiM=",
+      "sha384": "W3kwMUplIC7HY5yOV+4bKaC4PnweNYs/A7CH9+d7Jv74aFtLjnxJ66oCmiWjCzqK",
+      "sha512": "F0et9F+fLsDcSygf7YRTO+dnbfBhO9Pj/PTF8ihmRxDg26/tX7Y90/mvXHR2DkNE8AAQXkj6KivSQF5I/5Xt7Q=="
+    },
+    "integrity": "sha256-WGe9wpRE5tTs1npu6As9N9X9bkgf5t4fvBKgslbIGiM= sha384-W3kwMUplIC7HY5yOV+4bKaC4PnweNYs/A7CH9+d7Jv74aFtLjnxJ66oCmiWjCzqK sha512-F0et9F+fLsDcSygf7YRTO+dnbfBhO9Pj/PTF8ihmRxDg26/tX7Y90/mvXHR2DkNE8AAQXkj6KivSQF5I/5Xt7Q==",
+    "path": "dist/localization/messages_es_PE.min.js"
+  },
+  "@dist/localization/messages_es.js": {
+    "hashes": {
+      "sha256": "vNuiIh9l56fZcPJRM7p5tsYttlS3lJVeStZhHqy0COw=",
+      "sha384": "v3yAI5QxqGyxkc+waYJSCELR3CsDPXZllh8nXp4NKAivke3SS937YQ452B/ZBWJi",
+      "sha512": "BelqBWmr2S/7J15TdoH8K5/uTBVrJLz1j0LfEO3OhLeH4adb2nFFGLCB2SS48yNqBOWYIAbd3nBvqp1VodyqWQ=="
+    },
+    "integrity": "sha256-vNuiIh9l56fZcPJRM7p5tsYttlS3lJVeStZhHqy0COw= sha384-v3yAI5QxqGyxkc+waYJSCELR3CsDPXZllh8nXp4NKAivke3SS937YQ452B/ZBWJi sha512-BelqBWmr2S/7J15TdoH8K5/uTBVrJLz1j0LfEO3OhLeH4adb2nFFGLCB2SS48yNqBOWYIAbd3nBvqp1VodyqWQ==",
+    "path": "dist/localization/messages_es.js"
+  },
+  "@dist/localization/messages_es.min.js": {
+    "hashes": {
+      "sha256": "akAAwyH6SS/AiI1bBy5WIm++y17XUlzpiAHbSGccKS0=",
+      "sha384": "Rfj/Bd7ZRR8ME3xUbLDkgKYyTmUKLvHwN2SucGUgQ2imzKyXFIxRZoGAooGzZym1",
+      "sha512": "9Eqb6cM5OD1G7+j8rM6IXlTohdchjHx4T2fDSoqGjATCaQ5Ha86LYyIrZvsQXVDHXwifRjp9aQZbHD91De6WRw=="
+    },
+    "integrity": "sha256-akAAwyH6SS/AiI1bBy5WIm++y17XUlzpiAHbSGccKS0= sha384-Rfj/Bd7ZRR8ME3xUbLDkgKYyTmUKLvHwN2SucGUgQ2imzKyXFIxRZoGAooGzZym1 sha512-9Eqb6cM5OD1G7+j8rM6IXlTohdchjHx4T2fDSoqGjATCaQ5Ha86LYyIrZvsQXVDHXwifRjp9aQZbHD91De6WRw==",
+    "path": "dist/localization/messages_es.min.js"
+  },
+  "@dist/localization/messages_et.js": {
+    "hashes": {
+      "sha256": "bcAM5jTrlrBebY1TOBu1pVvTv6HUkwceqszHI4G+trs=",
+      "sha384": "DZpb57v+SYAlS/1SrRrqPWAQC0scLiKSMRdAPHhKlluuODNVV+29Enkd/FrKZ/4z",
+      "sha512": "yu8WrFFSZIGx9zWP2xC6sSrPqi4b30sRKZloHZUTZ8ixcF67eJTaaNKdFPrb071JIQIU2Nix35r7GzZ4+AuhBA=="
+    },
+    "integrity": "sha256-bcAM5jTrlrBebY1TOBu1pVvTv6HUkwceqszHI4G+trs= sha384-DZpb57v+SYAlS/1SrRrqPWAQC0scLiKSMRdAPHhKlluuODNVV+29Enkd/FrKZ/4z sha512-yu8WrFFSZIGx9zWP2xC6sSrPqi4b30sRKZloHZUTZ8ixcF67eJTaaNKdFPrb071JIQIU2Nix35r7GzZ4+AuhBA==",
+    "path": "dist/localization/messages_et.js"
+  },
+  "@dist/localization/messages_et.min.js": {
+    "hashes": {
+      "sha256": "33n56meJxdvJGiOtAkZUSXlU8/HsS93s9cxeVenI3j0=",
+      "sha384": "AiBhk+g91SHq9GqudlvJYKacvSncsVfYzvSOiAWkjyvVL07erbdyCS/25bsl1ozx",
+      "sha512": "ZXx1eYQnof1nvLwq0/0LsWBR9vyIFNSoWpbu/nSSnhRIoqoX15S/SPmZrgll13BWm3bg8zY6td9Ey+3JLqrFRg=="
+    },
+    "integrity": "sha256-33n56meJxdvJGiOtAkZUSXlU8/HsS93s9cxeVenI3j0= sha384-AiBhk+g91SHq9GqudlvJYKacvSncsVfYzvSOiAWkjyvVL07erbdyCS/25bsl1ozx sha512-ZXx1eYQnof1nvLwq0/0LsWBR9vyIFNSoWpbu/nSSnhRIoqoX15S/SPmZrgll13BWm3bg8zY6td9Ey+3JLqrFRg==",
+    "path": "dist/localization/messages_et.min.js"
+  },
+  "@dist/localization/messages_eu.js": {
+    "hashes": {
+      "sha256": "CKVhPnfEwofKtBUa0hodggf+e/bK9Of6Q1tFiLnJdqk=",
+      "sha384": "RO7hWAQUB/LzN91h/c7a/UvlX/Wh4USLj34MHrdc7bgyNYoMADQdzvsyWIKzQKmT",
+      "sha512": "D+J8M9LZwwEu60c5gbB4LixXbzLqY4Ltaz2l1bHYJPs4msdx+PLrQFNf5F/V+ylwTyttH7SlGTC1IInIXFBcig=="
+    },
+    "integrity": "sha256-CKVhPnfEwofKtBUa0hodggf+e/bK9Of6Q1tFiLnJdqk= sha384-RO7hWAQUB/LzN91h/c7a/UvlX/Wh4USLj34MHrdc7bgyNYoMADQdzvsyWIKzQKmT sha512-D+J8M9LZwwEu60c5gbB4LixXbzLqY4Ltaz2l1bHYJPs4msdx+PLrQFNf5F/V+ylwTyttH7SlGTC1IInIXFBcig==",
+    "path": "dist/localization/messages_eu.js"
+  },
+  "@dist/localization/messages_eu.min.js": {
+    "hashes": {
+      "sha256": "N1+eWFz5IK+3mAtaBZLqeO2COVvE0vjfk0ZDTy3Zf5c=",
+      "sha384": "ciaKoabJec8ArgqqR41hlIyHUTlh1v2E2Riz6NO/KHxpTSXScr9/Il9Q6tu/rOj+",
+      "sha512": "osJYlB+4X7+p/yMvRvYUopmM84nhE8OdQzWW9Uiuw/bOEZO62rij2dvSUEztIIqlKAg64kbttpvf14uJNqbqmQ=="
+    },
+    "integrity": "sha256-N1+eWFz5IK+3mAtaBZLqeO2COVvE0vjfk0ZDTy3Zf5c= sha384-ciaKoabJec8ArgqqR41hlIyHUTlh1v2E2Riz6NO/KHxpTSXScr9/Il9Q6tu/rOj+ sha512-osJYlB+4X7+p/yMvRvYUopmM84nhE8OdQzWW9Uiuw/bOEZO62rij2dvSUEztIIqlKAg64kbttpvf14uJNqbqmQ==",
+    "path": "dist/localization/messages_eu.min.js"
+  },
+  "@dist/localization/messages_fa.js": {
+    "hashes": {
+      "sha256": "HuGujC17rZozO4ShLFw2v/j+SdSpd0KK4nmBxSA1ZFE=",
+      "sha384": "P7BDv5aJ7MAw1uU+g0KzRTYcJURKv0uaqOR1HvHNV75HpjhfUqZvaWH6+BY6Zhon",
+      "sha512": "ToaBdgibhGPJr+C0TPGfCAopnGkpOh8GBoK7vM+5TeIdg3PtU/Q9ztskjk8aLhW8dFujXM/9sNVCfDEABlvEQA=="
+    },
+    "integrity": "sha256-HuGujC17rZozO4ShLFw2v/j+SdSpd0KK4nmBxSA1ZFE= sha384-P7BDv5aJ7MAw1uU+g0KzRTYcJURKv0uaqOR1HvHNV75HpjhfUqZvaWH6+BY6Zhon sha512-ToaBdgibhGPJr+C0TPGfCAopnGkpOh8GBoK7vM+5TeIdg3PtU/Q9ztskjk8aLhW8dFujXM/9sNVCfDEABlvEQA==",
+    "path": "dist/localization/messages_fa.js"
+  },
+  "@dist/localization/messages_fa.min.js": {
+    "hashes": {
+      "sha256": "euwEH7FuYOFC7hT8MJH/nyuVar49wxQRJ4Kha7W4fqM=",
+      "sha384": "CwjIKFKOZgQnbYtVvCoClYsaNn2GpWQ3+VAxQA8Z/2XOvvvB6vev9bMQTyqAD9yI",
+      "sha512": "dib5mY8ADC2cWAfh+/11Atle58GsZS8PW3OCds6Y7oLPer8jE9z1gorGExSCj+ZsjFawmzTqdYz2znkOYy9sTg=="
+    },
+    "integrity": "sha256-euwEH7FuYOFC7hT8MJH/nyuVar49wxQRJ4Kha7W4fqM= sha384-CwjIKFKOZgQnbYtVvCoClYsaNn2GpWQ3+VAxQA8Z/2XOvvvB6vev9bMQTyqAD9yI sha512-dib5mY8ADC2cWAfh+/11Atle58GsZS8PW3OCds6Y7oLPer8jE9z1gorGExSCj+ZsjFawmzTqdYz2znkOYy9sTg==",
+    "path": "dist/localization/messages_fa.min.js"
+  },
+  "@dist/localization/messages_fi.js": {
+    "hashes": {
+      "sha256": "Dng6duYt+NNdPWTDhPYvkJ2J7ls93P3m6jsQXMUfNdo=",
+      "sha384": "fCctSTZKhiDLHzr174/XJr2rpA0EGzhUAc8iLZp2t9FAiIDDWwDmSFsylVjVa2bv",
+      "sha512": "KX2u5XOjRTSDJBPA/8y+jQMddZXsR8wkIjr8BoxiDPCU3W3nTUSgvsCR/MiziO+AYK/h8TfXt9kK3iI6oMzYWQ=="
+    },
+    "integrity": "sha256-Dng6duYt+NNdPWTDhPYvkJ2J7ls93P3m6jsQXMUfNdo= sha384-fCctSTZKhiDLHzr174/XJr2rpA0EGzhUAc8iLZp2t9FAiIDDWwDmSFsylVjVa2bv sha512-KX2u5XOjRTSDJBPA/8y+jQMddZXsR8wkIjr8BoxiDPCU3W3nTUSgvsCR/MiziO+AYK/h8TfXt9kK3iI6oMzYWQ==",
+    "path": "dist/localization/messages_fi.js"
+  },
+  "@dist/localization/messages_fi.min.js": {
+    "hashes": {
+      "sha256": "mi5LYprIc8W1s6uSWhN96wJWH9OTlI6oss4OSde9Wd0=",
+      "sha384": "k8RwGIsx6qPPXuKrtP+0dUa0oViQ/KLu/cNaxao3MqgR6DBlryfYlVWlCVRvcvnd",
+      "sha512": "a5+cjFfY72ZzdvmscE5wulXbrwzxWZd/x0RuVVxJVgsMYoEkTdSjKIJcRL9mPBbtl5B7sd+pZ9CTHOrp3+MuPA=="
+    },
+    "integrity": "sha256-mi5LYprIc8W1s6uSWhN96wJWH9OTlI6oss4OSde9Wd0= sha384-k8RwGIsx6qPPXuKrtP+0dUa0oViQ/KLu/cNaxao3MqgR6DBlryfYlVWlCVRvcvnd sha512-a5+cjFfY72ZzdvmscE5wulXbrwzxWZd/x0RuVVxJVgsMYoEkTdSjKIJcRL9mPBbtl5B7sd+pZ9CTHOrp3+MuPA==",
+    "path": "dist/localization/messages_fi.min.js"
+  },
+  "@dist/localization/messages_fr.js": {
+    "hashes": {
+      "sha256": "IlFc5ejSXufyn+YBjLKmcnyZsxkh25K2ma8QoYsGJHY=",
+      "sha384": "hUMNrDMe2q6Eb2hhVBsOtf8Yvvp5RtD0mX4xrYfYJNDDB10TnIugnfWbX2WKZxot",
+      "sha512": "Y01h9v3hbplFvMvernOIYSc2Ybz7yqbAq88+YQl+H5+KuaioqlYyjgO0pqGzKHjnDgsPTxdrejiTYdR/asBgUw=="
+    },
+    "integrity": "sha256-IlFc5ejSXufyn+YBjLKmcnyZsxkh25K2ma8QoYsGJHY= sha384-hUMNrDMe2q6Eb2hhVBsOtf8Yvvp5RtD0mX4xrYfYJNDDB10TnIugnfWbX2WKZxot sha512-Y01h9v3hbplFvMvernOIYSc2Ybz7yqbAq88+YQl+H5+KuaioqlYyjgO0pqGzKHjnDgsPTxdrejiTYdR/asBgUw==",
+    "path": "dist/localization/messages_fr.js"
+  },
+  "@dist/localization/messages_fr.min.js": {
+    "hashes": {
+      "sha256": "S3JqDKzFk/ubOibmpSkRy5ublbmS7ptnNCbh4n46jz4=",
+      "sha384": "xOIfEwEa5KIp9oHjdyq7H2frOWGFGf8UCTjrl1n6IuULUUHkNyZeiXGf0gnNU33c",
+      "sha512": "JOar5IcaT3It8b3qU86LziUcb+fHpojnkR/2CZporxs284sHFCLSl1odqXjpEOZ4aw5FRRZNG2ttogVbLEh5Qw=="
+    },
+    "integrity": "sha256-S3JqDKzFk/ubOibmpSkRy5ublbmS7ptnNCbh4n46jz4= sha384-xOIfEwEa5KIp9oHjdyq7H2frOWGFGf8UCTjrl1n6IuULUUHkNyZeiXGf0gnNU33c sha512-JOar5IcaT3It8b3qU86LziUcb+fHpojnkR/2CZporxs284sHFCLSl1odqXjpEOZ4aw5FRRZNG2ttogVbLEh5Qw==",
+    "path": "dist/localization/messages_fr.min.js"
+  },
+  "@dist/localization/messages_ge.js": {
+    "hashes": {
+      "sha256": "MJ5cJcLpOQwsGmFpe44aiopmfL87IvVpMvSJU+wwcss=",
+      "sha384": "Es/teRa5A+9LTEYJwSiZtwRO0p4l1FA2A9YGo5iy2xx9uPYFkWfUspbAkxw4noIU",
+      "sha512": "MeIekkdHP78L3LB1oLUA0xfRVlAbVSHm1ObRJNzSKU1u5gOWIoVsxw5V9Io/Hgc4hwRlTHLTXTkYsffEB6kGYg=="
+    },
+    "integrity": "sha256-MJ5cJcLpOQwsGmFpe44aiopmfL87IvVpMvSJU+wwcss= sha384-Es/teRa5A+9LTEYJwSiZtwRO0p4l1FA2A9YGo5iy2xx9uPYFkWfUspbAkxw4noIU sha512-MeIekkdHP78L3LB1oLUA0xfRVlAbVSHm1ObRJNzSKU1u5gOWIoVsxw5V9Io/Hgc4hwRlTHLTXTkYsffEB6kGYg==",
+    "path": "dist/localization/messages_ge.js"
+  },
+  "@dist/localization/messages_ge.min.js": {
+    "hashes": {
+      "sha256": "mBKo9fl+qdA392vbDZTgpaAFHfqcH9L6Xg2NAmApcOA=",
+      "sha384": "SIYrsBS51kqaZvuXIjxZTey9OHhtKf+hxTq4g07t7aTFbKKeZUz4w6QbZhGoC8Qi",
+      "sha512": "OPR3IUC6ol82bi0hjTBbYN8KYVAH0zfdptm/yfIs26m33ra4sCbwoPmKr8rP85nHR0GPKcLJUo5CC9ZPMzTYsw=="
+    },
+    "integrity": "sha256-mBKo9fl+qdA392vbDZTgpaAFHfqcH9L6Xg2NAmApcOA= sha384-SIYrsBS51kqaZvuXIjxZTey9OHhtKf+hxTq4g07t7aTFbKKeZUz4w6QbZhGoC8Qi sha512-OPR3IUC6ol82bi0hjTBbYN8KYVAH0zfdptm/yfIs26m33ra4sCbwoPmKr8rP85nHR0GPKcLJUo5CC9ZPMzTYsw==",
+    "path": "dist/localization/messages_ge.min.js"
+  },
+  "@dist/localization/messages_gl.js": {
+    "hashes": {
+      "sha256": "2giWh7VZ+i61lCsYp0ebkuf7P313GoErMSDCqv1TKDY=",
+      "sha384": "vXguNWrpTneUFsTbAFHyhHzrH9VosjAOHOF+7VWpmcZw4yULXf90klIX8G3yh19d",
+      "sha512": "nsHgWjcFuFJQHdD8wW8XN/3W2/7xc3uCMRNgbJi5LOgIPxj+hteVpXT8CmMZPsQezBOC2o8h/fogYq89Azbf0Q=="
+    },
+    "integrity": "sha256-2giWh7VZ+i61lCsYp0ebkuf7P313GoErMSDCqv1TKDY= sha384-vXguNWrpTneUFsTbAFHyhHzrH9VosjAOHOF+7VWpmcZw4yULXf90klIX8G3yh19d sha512-nsHgWjcFuFJQHdD8wW8XN/3W2/7xc3uCMRNgbJi5LOgIPxj+hteVpXT8CmMZPsQezBOC2o8h/fogYq89Azbf0Q==",
+    "path": "dist/localization/messages_gl.js"
+  },
+  "@dist/localization/messages_gl.min.js": {
+    "hashes": {
+      "sha256": "KT23C+X4L6aTRaRs2ubUb64Fw/DzIremrGT5JMuNYks=",
+      "sha384": "WxCmtO69npmGer316gt2f7FWveQKgtPvh0vgNDCEdMSRiQ2qKjY+LDcRbGL664+2",
+      "sha512": "V/Ya3x1qPDCPel68YEW2RVjToziHy2gQwqnpk1Rpex9QucqBS7Pc/83mFnThNf+SgewWj9sATEJicANkIr39Jw=="
+    },
+    "integrity": "sha256-KT23C+X4L6aTRaRs2ubUb64Fw/DzIremrGT5JMuNYks= sha384-WxCmtO69npmGer316gt2f7FWveQKgtPvh0vgNDCEdMSRiQ2qKjY+LDcRbGL664+2 sha512-V/Ya3x1qPDCPel68YEW2RVjToziHy2gQwqnpk1Rpex9QucqBS7Pc/83mFnThNf+SgewWj9sATEJicANkIr39Jw==",
+    "path": "dist/localization/messages_gl.min.js"
+  },
+  "@dist/localization/messages_he.js": {
+    "hashes": {
+      "sha256": "21/aJep9HbqpuDhg0v04OuA6bVNvh8zfH62lK+bh7MU=",
+      "sha384": "JQ5PgcaQcugNFc9Re9F/Oe0SZuk12n8/9xxxTHzXvuBZ86rsxzf8EEhPoYcHsAq/",
+      "sha512": "DNPzJ6CPpjFQjotFyxNw1ShWtFYFdyDkM71UBK1unFuxWOzoJ0IlgAF+e2pe7lo9YkkiiyV+80DNgOtP8EYvnA=="
+    },
+    "integrity": "sha256-21/aJep9HbqpuDhg0v04OuA6bVNvh8zfH62lK+bh7MU= sha384-JQ5PgcaQcugNFc9Re9F/Oe0SZuk12n8/9xxxTHzXvuBZ86rsxzf8EEhPoYcHsAq/ sha512-DNPzJ6CPpjFQjotFyxNw1ShWtFYFdyDkM71UBK1unFuxWOzoJ0IlgAF+e2pe7lo9YkkiiyV+80DNgOtP8EYvnA==",
+    "path": "dist/localization/messages_he.js"
+  },
+  "@dist/localization/messages_he.min.js": {
+    "hashes": {
+      "sha256": "ZS7jXvlcBdyRx2W5vEa+eTacTmypRBHxWwL7vid6B9M=",
+      "sha384": "/9c/K8w7hJpLEWMzHcXV1QIZRO7DcskfB2AD7HLzw3SJDPiInF0KI1QZZz9JkDdN",
+      "sha512": "yYaPTJs/ggZkksJJZp8DEEy3n7UjXNTThcYn6w1gc23Ysiv8I0+MxAjB3HSZSgD2nrbOqDrC/AiZlIWG06uziw=="
+    },
+    "integrity": "sha256-ZS7jXvlcBdyRx2W5vEa+eTacTmypRBHxWwL7vid6B9M= sha384-/9c/K8w7hJpLEWMzHcXV1QIZRO7DcskfB2AD7HLzw3SJDPiInF0KI1QZZz9JkDdN sha512-yYaPTJs/ggZkksJJZp8DEEy3n7UjXNTThcYn6w1gc23Ysiv8I0+MxAjB3HSZSgD2nrbOqDrC/AiZlIWG06uziw==",
+    "path": "dist/localization/messages_he.min.js"
+  },
+  "@dist/localization/messages_hr.js": {
+    "hashes": {
+      "sha256": "YcrxRQKNEN0qhY0qasFAvp7HqpbxtZhtRGd0Q90+l6Q=",
+      "sha384": "CTPIg0+3X29fxzQ9dCJX4Bh7i2vS7oDF8GyaLiXGRZc5no7/GXloo8gnyY1J+kjO",
+      "sha512": "Dueb4rxZG83Z2xm6KfpKgifnv8i4AxgSG7hfxVZ+92IG6S4t662g5xWuQ1jX7HQX8VdDiecwUC4Eyco+UjiZrg=="
+    },
+    "integrity": "sha256-YcrxRQKNEN0qhY0qasFAvp7HqpbxtZhtRGd0Q90+l6Q= sha384-CTPIg0+3X29fxzQ9dCJX4Bh7i2vS7oDF8GyaLiXGRZc5no7/GXloo8gnyY1J+kjO sha512-Dueb4rxZG83Z2xm6KfpKgifnv8i4AxgSG7hfxVZ+92IG6S4t662g5xWuQ1jX7HQX8VdDiecwUC4Eyco+UjiZrg==",
+    "path": "dist/localization/messages_hr.js"
+  },
+  "@dist/localization/messages_hr.min.js": {
+    "hashes": {
+      "sha256": "0B6tPlQplFR3Lx9AGdxNJMOfWRJof+5ADE/TXTCovVI=",
+      "sha384": "rmjF2yOWiWkQTMkGPzWOzJoWpLmrehQZcPvcJzZ9MZn8xdaXcV96l8Dmxt61reOO",
+      "sha512": "qFupi1/pHc4NiXJ8Nlxepqz5EABmYtzB06dXTwd/qvifhWL4UdXqIj/IxKOjSszxCgtN1FO/5UwTM0dcaE0oXQ=="
+    },
+    "integrity": "sha256-0B6tPlQplFR3Lx9AGdxNJMOfWRJof+5ADE/TXTCovVI= sha384-rmjF2yOWiWkQTMkGPzWOzJoWpLmrehQZcPvcJzZ9MZn8xdaXcV96l8Dmxt61reOO sha512-qFupi1/pHc4NiXJ8Nlxepqz5EABmYtzB06dXTwd/qvifhWL4UdXqIj/IxKOjSszxCgtN1FO/5UwTM0dcaE0oXQ==",
+    "path": "dist/localization/messages_hr.min.js"
+  },
+  "@dist/localization/messages_hu.js": {
+    "hashes": {
+      "sha256": "CoR3lMEZ/h+xsbdDrke4ybSOSkj3GAET+FsF2UyTWwc=",
+      "sha384": "QHtVsCZhgO9n+0dli9Rd2amGCLxO07M2VZWJmenPoI2r5HH9vCuiBbTSrnqQOY6+",
+      "sha512": "nb0j9av82p6/ywEIpKWRs68VfyerGELUNVk5PVLZ3ojmxhHOCkhjpnMof9zAYxpjl4H8oEVvYILsSOXQkjKfDw=="
+    },
+    "integrity": "sha256-CoR3lMEZ/h+xsbdDrke4ybSOSkj3GAET+FsF2UyTWwc= sha384-QHtVsCZhgO9n+0dli9Rd2amGCLxO07M2VZWJmenPoI2r5HH9vCuiBbTSrnqQOY6+ sha512-nb0j9av82p6/ywEIpKWRs68VfyerGELUNVk5PVLZ3ojmxhHOCkhjpnMof9zAYxpjl4H8oEVvYILsSOXQkjKfDw==",
+    "path": "dist/localization/messages_hu.js"
+  },
+  "@dist/localization/messages_hu.min.js": {
+    "hashes": {
+      "sha256": "sxWqwPb6qutDlRRP6m6G5SnChAQZmaut+qLu7+IOkTk=",
+      "sha384": "PBrMcbGbJ7Lxqppp5CDgtC01I859a6fzKyu3HxpI7TZHn7Y1DGZH7Dg3do8f8S3q",
+      "sha512": "sG3798b2fMPDMBbMs8S/HN1dOCVU8EY3Y+M/LFQT+K0wpJjDiEawiA8t6brU0IJ01jipHA3V9U2bHxjIVfdlaQ=="
+    },
+    "integrity": "sha256-sxWqwPb6qutDlRRP6m6G5SnChAQZmaut+qLu7+IOkTk= sha384-PBrMcbGbJ7Lxqppp5CDgtC01I859a6fzKyu3HxpI7TZHn7Y1DGZH7Dg3do8f8S3q sha512-sG3798b2fMPDMBbMs8S/HN1dOCVU8EY3Y+M/LFQT+K0wpJjDiEawiA8t6brU0IJ01jipHA3V9U2bHxjIVfdlaQ==",
+    "path": "dist/localization/messages_hu.min.js"
+  },
+  "@dist/localization/messages_hy_AM.js": {
+    "hashes": {
+      "sha256": "pRMuq/+JPWMP5RzsJtreiNiqUjPbWjaRyoGvI3Y9JHs=",
+      "sha384": "Sa7DbBellS0CJz88Nlei8FO2GjF4KrF3xmu5LkC5/ui8VIIk3IP6+lI2fG375s4S",
+      "sha512": "JJJH17U6iYc+jWobegfbKsW4Gh0R3EKuNr6j/3ZUJfGfX9ZXjFSl25pmhVUd4oeDIl3MdjvVDiHfGp+RckBduQ=="
+    },
+    "integrity": "sha256-pRMuq/+JPWMP5RzsJtreiNiqUjPbWjaRyoGvI3Y9JHs= sha384-Sa7DbBellS0CJz88Nlei8FO2GjF4KrF3xmu5LkC5/ui8VIIk3IP6+lI2fG375s4S sha512-JJJH17U6iYc+jWobegfbKsW4Gh0R3EKuNr6j/3ZUJfGfX9ZXjFSl25pmhVUd4oeDIl3MdjvVDiHfGp+RckBduQ==",
+    "path": "dist/localization/messages_hy_AM.js"
+  },
+  "@dist/localization/messages_hy_AM.min.js": {
+    "hashes": {
+      "sha256": "X2/HJlE3LCZ15Z0O04Wp6sJEJ2SZ1JACKWv7cyuFAdA=",
+      "sha384": "wockg4yM7rb29yjqNGtPW4ln7IxITu8ATes+w9Kh/1oQYuwyXDCZPCj1kkTiCEA4",
+      "sha512": "VRRlWYumpYzoJYp/DSxqzd8wrVkUO0Egm5bOQrTiZlH9o5tgldEZV781Tj1QxkDzQtlsG+ytyDDbQG0ycQyQpw=="
+    },
+    "integrity": "sha256-X2/HJlE3LCZ15Z0O04Wp6sJEJ2SZ1JACKWv7cyuFAdA= sha384-wockg4yM7rb29yjqNGtPW4ln7IxITu8ATes+w9Kh/1oQYuwyXDCZPCj1kkTiCEA4 sha512-VRRlWYumpYzoJYp/DSxqzd8wrVkUO0Egm5bOQrTiZlH9o5tgldEZV781Tj1QxkDzQtlsG+ytyDDbQG0ycQyQpw==",
+    "path": "dist/localization/messages_hy_AM.min.js"
+  },
+  "@dist/localization/messages_id.js": {
+    "hashes": {
+      "sha256": "+AzsPAMBKDXI/84BWpnt/yxB8Kh/o+S1las4FoWom10=",
+      "sha384": "AsrGA5w3LumOjc3lRswhNTrAdh14WNxFmnstXNMsPRYg756wV4epLvdltaO5VQpp",
+      "sha512": "PSte/pv27o4mhkjqZjpm07SO27iUjkigQxEbpAtMKi+9vkMgALGcm4tQXXk11+PHN7JmvBy7EqNxAhsIUor7JA=="
+    },
+    "integrity": "sha256-+AzsPAMBKDXI/84BWpnt/yxB8Kh/o+S1las4FoWom10= sha384-AsrGA5w3LumOjc3lRswhNTrAdh14WNxFmnstXNMsPRYg756wV4epLvdltaO5VQpp sha512-PSte/pv27o4mhkjqZjpm07SO27iUjkigQxEbpAtMKi+9vkMgALGcm4tQXXk11+PHN7JmvBy7EqNxAhsIUor7JA==",
+    "path": "dist/localization/messages_id.js"
+  },
+  "@dist/localization/messages_id.min.js": {
+    "hashes": {
+      "sha256": "73KMaV9Jt+ic9fRDNTymUncWvfUoknQgPGF/p+K2EG8=",
+      "sha384": "OiaXQ+pVneEfU0a7EffhHrbmUCUVRlRUJxh1uIdKZ70Of7XstfU1ytTAwyz4Blhu",
+      "sha512": "dP70xrYvB0Eo9r+6cFo1CNjl/B/HoaoIPIRip83N5OafCRuZOasZRZF3mrR2w/NdQdEOzdc777imqpZhQcfyCg=="
+    },
+    "integrity": "sha256-73KMaV9Jt+ic9fRDNTymUncWvfUoknQgPGF/p+K2EG8= sha384-OiaXQ+pVneEfU0a7EffhHrbmUCUVRlRUJxh1uIdKZ70Of7XstfU1ytTAwyz4Blhu sha512-dP70xrYvB0Eo9r+6cFo1CNjl/B/HoaoIPIRip83N5OafCRuZOasZRZF3mrR2w/NdQdEOzdc777imqpZhQcfyCg==",
+    "path": "dist/localization/messages_id.min.js"
+  },
+  "@dist/localization/messages_is.js": {
+    "hashes": {
+      "sha256": "c7BOHijobnzDY4JFwbZKHlO7v2Pk25ZndfAdZ795PJk=",
+      "sha384": "NtKtJJmSCwZOR91aR71kc+xUxeekdfjfJKiD5IiLVqQXKQkryvjW5OresX5EKC/p",
+      "sha512": "o96OEMCYkmXQ9wWq/R88OpFjSSYIaQ2YY8oEUzR9o1qchSXDIO0IppYUEW97MgfsuPUY5MO0ez6WUxnw9nD/OA=="
+    },
+    "integrity": "sha256-c7BOHijobnzDY4JFwbZKHlO7v2Pk25ZndfAdZ795PJk= sha384-NtKtJJmSCwZOR91aR71kc+xUxeekdfjfJKiD5IiLVqQXKQkryvjW5OresX5EKC/p sha512-o96OEMCYkmXQ9wWq/R88OpFjSSYIaQ2YY8oEUzR9o1qchSXDIO0IppYUEW97MgfsuPUY5MO0ez6WUxnw9nD/OA==",
+    "path": "dist/localization/messages_is.js"
+  },
+  "@dist/localization/messages_is.min.js": {
+    "hashes": {
+      "sha256": "KzBpy+do4EGOsMaZnsrJF1Sq5GMPddd/bdINYd4em+M=",
+      "sha384": "POdBM+YpjV6JSDSe7Z+mVpXXni4RDx8V83lszIB25q+2wAca0OAXxyvufcppH+Wn",
+      "sha512": "LDLIzej3fqUbFw+obPEqdbLCj+Ve5qN3oCS8hgwRHoKhyZihFNY57cfH6FJjntnSQktYRpBGYx7OKeacXhE7hw=="
+    },
+    "integrity": "sha256-KzBpy+do4EGOsMaZnsrJF1Sq5GMPddd/bdINYd4em+M= sha384-POdBM+YpjV6JSDSe7Z+mVpXXni4RDx8V83lszIB25q+2wAca0OAXxyvufcppH+Wn sha512-LDLIzej3fqUbFw+obPEqdbLCj+Ve5qN3oCS8hgwRHoKhyZihFNY57cfH6FJjntnSQktYRpBGYx7OKeacXhE7hw==",
+    "path": "dist/localization/messages_is.min.js"
+  },
+  "@dist/localization/messages_it.js": {
+    "hashes": {
+      "sha256": "A8VyJk0pe2Wb6FlSMwdDE/PtrvMB0/djWuKGF+kfvNU=",
+      "sha384": "JFwjsS9GMjOPeW7QQ05pNDY3e9e/99naYQqW5uia8O6lzcXNFnNGPLcTnI+0F2JF",
+      "sha512": "kaFDZLfjIrLB2ywzZ8XW+V3bbg7aeD6u5EEPKgppVcOh4aIyUQcjJWUOU78SaBsvYBMTS6yPeGbwjxVdMY8eIg=="
+    },
+    "integrity": "sha256-A8VyJk0pe2Wb6FlSMwdDE/PtrvMB0/djWuKGF+kfvNU= sha384-JFwjsS9GMjOPeW7QQ05pNDY3e9e/99naYQqW5uia8O6lzcXNFnNGPLcTnI+0F2JF sha512-kaFDZLfjIrLB2ywzZ8XW+V3bbg7aeD6u5EEPKgppVcOh4aIyUQcjJWUOU78SaBsvYBMTS6yPeGbwjxVdMY8eIg==",
+    "path": "dist/localization/messages_it.js"
+  },
+  "@dist/localization/messages_it.min.js": {
+    "hashes": {
+      "sha256": "ngSr9oLqa7tV3dzyZWqEspqrEHLKzoSQXVU45GwUSkg=",
+      "sha384": "R456GQK7M0HvCFutMO/ethJAX8oe1YvZfQ2hf9uf1IAZ2PbJZQ2Z+KD6sYC5rFCs",
+      "sha512": "4GMIev7hJnErOg2a8ZMCiQIZpupAOv4VBkKA2rVeXnah+Io5JAWhDW9cpnVqDej3G7UR5D9JTFBUDADS+Bh95g=="
+    },
+    "integrity": "sha256-ngSr9oLqa7tV3dzyZWqEspqrEHLKzoSQXVU45GwUSkg= sha384-R456GQK7M0HvCFutMO/ethJAX8oe1YvZfQ2hf9uf1IAZ2PbJZQ2Z+KD6sYC5rFCs sha512-4GMIev7hJnErOg2a8ZMCiQIZpupAOv4VBkKA2rVeXnah+Io5JAWhDW9cpnVqDej3G7UR5D9JTFBUDADS+Bh95g==",
+    "path": "dist/localization/messages_it.min.js"
+  },
+  "@dist/localization/messages_ja.js": {
+    "hashes": {
+      "sha256": "Z7TCHQEtkUXavGY3hwdnhtqGLrmKLMDYnM6rsZfNDj0=",
+      "sha384": "ZKZoaW4pGfR9+jlymhHVLlmutAaLsH6A9Not8nEEkG/peHRabHDmOnT4h7Q1o7Xa",
+      "sha512": "Xzr69u42sYYeVKLrudYZUadPtpKXUe+M+0r4HXbpcV9tWdMAlc8gpOCOhb+sNmfdLF0e1qpeOuunrVetE/Kwog=="
+    },
+    "integrity": "sha256-Z7TCHQEtkUXavGY3hwdnhtqGLrmKLMDYnM6rsZfNDj0= sha384-ZKZoaW4pGfR9+jlymhHVLlmutAaLsH6A9Not8nEEkG/peHRabHDmOnT4h7Q1o7Xa sha512-Xzr69u42sYYeVKLrudYZUadPtpKXUe+M+0r4HXbpcV9tWdMAlc8gpOCOhb+sNmfdLF0e1qpeOuunrVetE/Kwog==",
+    "path": "dist/localization/messages_ja.js"
+  },
+  "@dist/localization/messages_ja.min.js": {
+    "hashes": {
+      "sha256": "9Oh6FBu0qEeQRnVkWLLADLhxkhMgXi9y6PpuRcNKsi0=",
+      "sha384": "sAv8qqMWlL/PljbFr4Gyy+Mo9A8/gKlt/M+a3ccfy1Xf2iU0AqyxyI/OwPRYOzsz",
+      "sha512": "cag0iARd9qXbLdszZR01ypi7v4rqdnNWqfyF7xHOE6JyEp86595356M97wLHSppLCGMBH/bManDo9OH68WSpxg=="
+    },
+    "integrity": "sha256-9Oh6FBu0qEeQRnVkWLLADLhxkhMgXi9y6PpuRcNKsi0= sha384-sAv8qqMWlL/PljbFr4Gyy+Mo9A8/gKlt/M+a3ccfy1Xf2iU0AqyxyI/OwPRYOzsz sha512-cag0iARd9qXbLdszZR01ypi7v4rqdnNWqfyF7xHOE6JyEp86595356M97wLHSppLCGMBH/bManDo9OH68WSpxg==",
+    "path": "dist/localization/messages_ja.min.js"
+  },
+  "@dist/localization/messages_ka.js": {
+    "hashes": {
+      "sha256": "jSHuAeJ5IPCQTwewt/tskDONnc03ITfg3g2A2AufmdM=",
+      "sha384": "zv/XZ0xBPp5d7lpe/ormw5L8ukoyKJeU2Dijz541PNfb0t/eSpHX5xfpoyxnec3W",
+      "sha512": "oKAuzQ4T4YZI65gl6E8R8E9Ij793APIraTCOBXriqRBQb4IaXyF5QS7xMiRslP/rFXrCzxJVW/tJEfS+ifPhYA=="
+    },
+    "integrity": "sha256-jSHuAeJ5IPCQTwewt/tskDONnc03ITfg3g2A2AufmdM= sha384-zv/XZ0xBPp5d7lpe/ormw5L8ukoyKJeU2Dijz541PNfb0t/eSpHX5xfpoyxnec3W sha512-oKAuzQ4T4YZI65gl6E8R8E9Ij793APIraTCOBXriqRBQb4IaXyF5QS7xMiRslP/rFXrCzxJVW/tJEfS+ifPhYA==",
+    "path": "dist/localization/messages_ka.js"
+  },
+  "@dist/localization/messages_ka.min.js": {
+    "hashes": {
+      "sha256": "fNXSfeGNWFIfrnJCfPBfBQCE0tYeRtN4lFcngCzx53E=",
+      "sha384": "2ZLP+bLvnRzzw1UmWxGfeDp+/UPH8EfuYPrY/brMw3b1ELPc6oX+FoSnx2hsq5Ra",
+      "sha512": "FzUsvN7K3bYoQ6mxA8AvlIVFB6WxgBvRit5h8GGcQScM8Qv4L+OhOOseb4koCy7hRbxa4llQaK6PGwRn+wRftA=="
+    },
+    "integrity": "sha256-fNXSfeGNWFIfrnJCfPBfBQCE0tYeRtN4lFcngCzx53E= sha384-2ZLP+bLvnRzzw1UmWxGfeDp+/UPH8EfuYPrY/brMw3b1ELPc6oX+FoSnx2hsq5Ra sha512-FzUsvN7K3bYoQ6mxA8AvlIVFB6WxgBvRit5h8GGcQScM8Qv4L+OhOOseb4koCy7hRbxa4llQaK6PGwRn+wRftA==",
+    "path": "dist/localization/messages_ka.min.js"
+  },
+  "@dist/localization/messages_kk.js": {
+    "hashes": {
+      "sha256": "eITjpDN0OSCOyYu+9q4mJ+fcSAtKaHlhllVr80wykV4=",
+      "sha384": "H4uEkPtytmp9PNuzCxJDeDGPI5EpM8M5DZUnHEGOTsv5VE72UhEeXvxRmQBLtlom",
+      "sha512": "y4fudkkv+VPweUTQMb/SfRJAW2cNqxD4D/JWgcKv7dvHOr5E7COV61/iKxhvZMwCjpQqsXz1/qMirEp43CO6YQ=="
+    },
+    "integrity": "sha256-eITjpDN0OSCOyYu+9q4mJ+fcSAtKaHlhllVr80wykV4= sha384-H4uEkPtytmp9PNuzCxJDeDGPI5EpM8M5DZUnHEGOTsv5VE72UhEeXvxRmQBLtlom sha512-y4fudkkv+VPweUTQMb/SfRJAW2cNqxD4D/JWgcKv7dvHOr5E7COV61/iKxhvZMwCjpQqsXz1/qMirEp43CO6YQ==",
+    "path": "dist/localization/messages_kk.js"
+  },
+  "@dist/localization/messages_kk.min.js": {
+    "hashes": {
+      "sha256": "5aPNMtrDEzT23dmmXv+iGEZkLuPbnwU8++SKQcYjLWk=",
+      "sha384": "7Isqs09zzgwbk2tWdvnoAqgTFj0r/l4nk/9w74a3UUGj8WIsn8zfYBYkIrWKoD8v",
+      "sha512": "PGfHK+rYYy9WFUvNWcYEPAR0ZBV4m0OMWkobUCAfyQUJqt6hvXlU2d8I+0HqQsToKqaeCGd4F6UlaUNI97WLXQ=="
+    },
+    "integrity": "sha256-5aPNMtrDEzT23dmmXv+iGEZkLuPbnwU8++SKQcYjLWk= sha384-7Isqs09zzgwbk2tWdvnoAqgTFj0r/l4nk/9w74a3UUGj8WIsn8zfYBYkIrWKoD8v sha512-PGfHK+rYYy9WFUvNWcYEPAR0ZBV4m0OMWkobUCAfyQUJqt6hvXlU2d8I+0HqQsToKqaeCGd4F6UlaUNI97WLXQ==",
+    "path": "dist/localization/messages_kk.min.js"
+  },
+  "@dist/localization/messages_ko.js": {
+    "hashes": {
+      "sha256": "ZwiKT3tjyP/MVJcGuPLZzTaH4DtaARev73THKVGkJWc=",
+      "sha384": "uRyMNFBkk6u6M3eouTG3cu2DSv+xDCBz/sLG2+JnGPu9fSR7aA/QUwbsnC1mriC3",
+      "sha512": "2dJy6OhzhcqOxPyPjN6wzqVVC0BaXorQDevWPM+xsFrV2sxW9vRAFeJXKEDhPWWlFJzEsSE4R8mgDE8SMZUHNQ=="
+    },
+    "integrity": "sha256-ZwiKT3tjyP/MVJcGuPLZzTaH4DtaARev73THKVGkJWc= sha384-uRyMNFBkk6u6M3eouTG3cu2DSv+xDCBz/sLG2+JnGPu9fSR7aA/QUwbsnC1mriC3 sha512-2dJy6OhzhcqOxPyPjN6wzqVVC0BaXorQDevWPM+xsFrV2sxW9vRAFeJXKEDhPWWlFJzEsSE4R8mgDE8SMZUHNQ==",
+    "path": "dist/localization/messages_ko.js"
+  },
+  "@dist/localization/messages_ko.min.js": {
+    "hashes": {
+      "sha256": "2MPaDIgwuO0zMFW6Rlrc857sIWkxu1mP23Lv+t0L6Rs=",
+      "sha384": "XWNiqocFPMuYG/biW8zoELA2lbSg8LuoS35Qdsttf+gjSp80jFWDEf6tQyqry/Ym",
+      "sha512": "vLjy+N1d4zzCA4Z2rDNGjGHmeR7ShJo/bPX2BPWNimtPdeOGH5bR/7+PU0j/v7EqVNpX9UGsM5ePq3gie1KKgA=="
+    },
+    "integrity": "sha256-2MPaDIgwuO0zMFW6Rlrc857sIWkxu1mP23Lv+t0L6Rs= sha384-XWNiqocFPMuYG/biW8zoELA2lbSg8LuoS35Qdsttf+gjSp80jFWDEf6tQyqry/Ym sha512-vLjy+N1d4zzCA4Z2rDNGjGHmeR7ShJo/bPX2BPWNimtPdeOGH5bR/7+PU0j/v7EqVNpX9UGsM5ePq3gie1KKgA==",
+    "path": "dist/localization/messages_ko.min.js"
+  },
+  "@dist/localization/messages_lt.js": {
+    "hashes": {
+      "sha256": "gPHw4RsSBhMQLnP62r3SJV/BHu2WjBLUt6DQDheRkes=",
+      "sha384": "80eNrvRZLJcqP5ymuCyQaVylV8eC2ZSEZPCWMyHovQxv31td4TP1sAt+753cMxCL",
+      "sha512": "Peku162BI3nLhptKuXqVesFYKTwtUwYLYAiv3CzJg9AHibM3iXbW2FeJ+lAElEnInwFX3gTUjruBiXiy4rLdYQ=="
+    },
+    "integrity": "sha256-gPHw4RsSBhMQLnP62r3SJV/BHu2WjBLUt6DQDheRkes= sha384-80eNrvRZLJcqP5ymuCyQaVylV8eC2ZSEZPCWMyHovQxv31td4TP1sAt+753cMxCL sha512-Peku162BI3nLhptKuXqVesFYKTwtUwYLYAiv3CzJg9AHibM3iXbW2FeJ+lAElEnInwFX3gTUjruBiXiy4rLdYQ==",
+    "path": "dist/localization/messages_lt.js"
+  },
+  "@dist/localization/messages_lt.min.js": {
+    "hashes": {
+      "sha256": "R+yBGIIYX8EwSwxfbXpdXSQNDnMAnoY1g3Rne877hHM=",
+      "sha384": "kCVwv9TzBxGqLLeWKg8aSyGrSgliY7cfXG/auDyHUxDHgJPw0bNc5JTUY1qYpDhr",
+      "sha512": "bk/L6T1LQoYSLuhi+KkE6GmaIhf6joPrCzDJAtvawsOkDHiPzWxItdU1lk2Oid54FiPvOarfwMvcU8mafEwHsQ=="
+    },
+    "integrity": "sha256-R+yBGIIYX8EwSwxfbXpdXSQNDnMAnoY1g3Rne877hHM= sha384-kCVwv9TzBxGqLLeWKg8aSyGrSgliY7cfXG/auDyHUxDHgJPw0bNc5JTUY1qYpDhr sha512-bk/L6T1LQoYSLuhi+KkE6GmaIhf6joPrCzDJAtvawsOkDHiPzWxItdU1lk2Oid54FiPvOarfwMvcU8mafEwHsQ==",
+    "path": "dist/localization/messages_lt.min.js"
+  },
+  "@dist/localization/messages_lv.js": {
+    "hashes": {
+      "sha256": "zW8ZRlA+EFSgbn7GSiL0G0GEmz11QzD0WaYDpNDnOxg=",
+      "sha384": "RvYsL+XvZSF5pn0u24RQnvLzkE7sB2Zx2QW/O6A49Sg7DR3K5nV1pofyXN8nE/at",
+      "sha512": "DgVAKajznLbaLq6a9Cmp4aGhJiY5sWiIcOboaIrIsTuHUwxHt8/4gHyf4QiXPRfK2JQc1QXisjyNJfvIp75P5Q=="
+    },
+    "integrity": "sha256-zW8ZRlA+EFSgbn7GSiL0G0GEmz11QzD0WaYDpNDnOxg= sha384-RvYsL+XvZSF5pn0u24RQnvLzkE7sB2Zx2QW/O6A49Sg7DR3K5nV1pofyXN8nE/at sha512-DgVAKajznLbaLq6a9Cmp4aGhJiY5sWiIcOboaIrIsTuHUwxHt8/4gHyf4QiXPRfK2JQc1QXisjyNJfvIp75P5Q==",
+    "path": "dist/localization/messages_lv.js"
+  },
+  "@dist/localization/messages_lv.min.js": {
+    "hashes": {
+      "sha256": "lIDxk2v+B/qvY+cL+cFXI0PYXRYN4KC/H/UHndjNzz8=",
+      "sha384": "C8L/+uQC5Bd8SKqZn2CLP0WfhusemKs0wV0ACoQHxUfgxGfP0lvtfs590Z+8ns11",
+      "sha512": "xg3pEfCqtUGmtqkm6jG2zpeLrU78XDV5eFe6FXhobUFnduayPHS7y8sakEDnyKDghceH1h2V/tOA9pZHBYFq3w=="
+    },
+    "integrity": "sha256-lIDxk2v+B/qvY+cL+cFXI0PYXRYN4KC/H/UHndjNzz8= sha384-C8L/+uQC5Bd8SKqZn2CLP0WfhusemKs0wV0ACoQHxUfgxGfP0lvtfs590Z+8ns11 sha512-xg3pEfCqtUGmtqkm6jG2zpeLrU78XDV5eFe6FXhobUFnduayPHS7y8sakEDnyKDghceH1h2V/tOA9pZHBYFq3w==",
+    "path": "dist/localization/messages_lv.min.js"
+  },
+  "@dist/localization/messages_mk.js": {
+    "hashes": {
+      "sha256": "Fo830Lf77yRsKaZpiy82s8liO3lw4g21F3Lpsqxv6N0=",
+      "sha384": "oaXcekviNq0lmptbIDhwj3E2P3fOcyBPDf5c9heP5IA75wczVDlrcS8lHJebjltB",
+      "sha512": "t8NJlhkANjqYwprTWVIVWSibAEQXMJ2pPvfHcU8TnElkjRjg52ZvjiNxuC3M3VkeDL9VnAVum+CMg42ZkAfDGg=="
+    },
+    "integrity": "sha256-Fo830Lf77yRsKaZpiy82s8liO3lw4g21F3Lpsqxv6N0= sha384-oaXcekviNq0lmptbIDhwj3E2P3fOcyBPDf5c9heP5IA75wczVDlrcS8lHJebjltB sha512-t8NJlhkANjqYwprTWVIVWSibAEQXMJ2pPvfHcU8TnElkjRjg52ZvjiNxuC3M3VkeDL9VnAVum+CMg42ZkAfDGg==",
+    "path": "dist/localization/messages_mk.js"
+  },
+  "@dist/localization/messages_mk.min.js": {
+    "hashes": {
+      "sha256": "P7f1XZIeb63IIQcY9riDKaK3zgVC36yXUJNxip2BtGI=",
+      "sha384": "VH60zopXoXsriI7l50HPTWd8PmL5/sQvC8X7eHhRF6Z9YBd99FHlT8gS/GERGU/6",
+      "sha512": "GKrhCAj6VEKJA533qFR/iSv41crGgIryk4zbCwTRX1kywyLGpa54p4KK7bylGfZjuaXuDM3HJ/83trWx+1Mnsw=="
+    },
+    "integrity": "sha256-P7f1XZIeb63IIQcY9riDKaK3zgVC36yXUJNxip2BtGI= sha384-VH60zopXoXsriI7l50HPTWd8PmL5/sQvC8X7eHhRF6Z9YBd99FHlT8gS/GERGU/6 sha512-GKrhCAj6VEKJA533qFR/iSv41crGgIryk4zbCwTRX1kywyLGpa54p4KK7bylGfZjuaXuDM3HJ/83trWx+1Mnsw==",
+    "path": "dist/localization/messages_mk.min.js"
+  },
+  "@dist/localization/messages_my.js": {
+    "hashes": {
+      "sha256": "tuPvghMmCOGzHRdTsmhDOOxz4ZiNhOMPyWyKx2qf0a0=",
+      "sha384": "ODcyTN1ToPlsxOk4QVGD3a58G81guf5jMjPLzi/h/5m/ax/e0S1efvX61hW7NGU9",
+      "sha512": "95EPk5pTIjdNg6LR02Axj6GJX4qa+VhdLmgkoumb95A2HgItTqDVbFVWKaUSUCY4u4KuJdoTiuCrkT3ECtEiyg=="
+    },
+    "integrity": "sha256-tuPvghMmCOGzHRdTsmhDOOxz4ZiNhOMPyWyKx2qf0a0= sha384-ODcyTN1ToPlsxOk4QVGD3a58G81guf5jMjPLzi/h/5m/ax/e0S1efvX61hW7NGU9 sha512-95EPk5pTIjdNg6LR02Axj6GJX4qa+VhdLmgkoumb95A2HgItTqDVbFVWKaUSUCY4u4KuJdoTiuCrkT3ECtEiyg==",
+    "path": "dist/localization/messages_my.js"
+  },
+  "@dist/localization/messages_my.min.js": {
+    "hashes": {
+      "sha256": "a8bFnv7/pTHl26TY2aWByfh+hOpH2SZZa3WVcQiT02w=",
+      "sha384": "7poxQ+CCU4r3LhLSKxZuwYDOCpQN+cH+8kQLYxCVljwpZTVi5qyLV5Fg0dcQndjC",
+      "sha512": "T+4nqWv2VdRIAk885Ouw7ntQqxNcVBZjI1H8divWE4MJiU+iKo2ECOA7lhF+rOdMVcM2LE9YSRCUofZqawq62g=="
+    },
+    "integrity": "sha256-a8bFnv7/pTHl26TY2aWByfh+hOpH2SZZa3WVcQiT02w= sha384-7poxQ+CCU4r3LhLSKxZuwYDOCpQN+cH+8kQLYxCVljwpZTVi5qyLV5Fg0dcQndjC sha512-T+4nqWv2VdRIAk885Ouw7ntQqxNcVBZjI1H8divWE4MJiU+iKo2ECOA7lhF+rOdMVcM2LE9YSRCUofZqawq62g==",
+    "path": "dist/localization/messages_my.min.js"
+  },
+  "@dist/localization/messages_nl.js": {
+    "hashes": {
+      "sha256": "/0TPWSSFz8lgmqJA+b4V3MA8qtY2X2rfOTIfLN67qq0=",
+      "sha384": "UzofKBMERQyYX8rdkRFAbfKbJna9OGJu+Pzg5fXe2atUHRvqjqLp2Zlie+g5YQcn",
+      "sha512": "pXGvjSjhyL+uxlB/eNknhcB46D+bvsxMDgjEvjRopM0vFoC7+paK1YxvOTyG50XAzyTpi7LqNuHwCnENWWko0g=="
+    },
+    "integrity": "sha256-/0TPWSSFz8lgmqJA+b4V3MA8qtY2X2rfOTIfLN67qq0= sha384-UzofKBMERQyYX8rdkRFAbfKbJna9OGJu+Pzg5fXe2atUHRvqjqLp2Zlie+g5YQcn sha512-pXGvjSjhyL+uxlB/eNknhcB46D+bvsxMDgjEvjRopM0vFoC7+paK1YxvOTyG50XAzyTpi7LqNuHwCnENWWko0g==",
+    "path": "dist/localization/messages_nl.js"
+  },
+  "@dist/localization/messages_nl.min.js": {
+    "hashes": {
+      "sha256": "kUyTxllse9AvIxY/J4HlBtpznpMAlG7vb2oS71QO/1A=",
+      "sha384": "cVM2o+7NH1kXpPCZ0mKwNoNuwOnZNCaANoH2LakznaxvBtJMA9VE7sSgkP9i3leN",
+      "sha512": "jotApuafFwhCUZdov6fevbdqEHH3mRRAftMCyofI/am++3da4E28UlpnTzZK+voEcvLdwZfCcwz1yS3cz0HpCw=="
+    },
+    "integrity": "sha256-kUyTxllse9AvIxY/J4HlBtpznpMAlG7vb2oS71QO/1A= sha384-cVM2o+7NH1kXpPCZ0mKwNoNuwOnZNCaANoH2LakznaxvBtJMA9VE7sSgkP9i3leN sha512-jotApuafFwhCUZdov6fevbdqEHH3mRRAftMCyofI/am++3da4E28UlpnTzZK+voEcvLdwZfCcwz1yS3cz0HpCw==",
+    "path": "dist/localization/messages_nl.min.js"
+  },
+  "@dist/localization/messages_no.js": {
+    "hashes": {
+      "sha256": "sZ0WKH6yJNZIU3ZKUwsEH/L2zPtu0nJQjKBSBDdNc3Y=",
+      "sha384": "NrY7zO4/huQheTwlNM3wlFWWNKo5FAR2RUDLyN0jKN8j22hDf0TbR0pyu+y+xtF/",
+      "sha512": "vvPhPab3oEb9Oyj/eCjD8SRItbpzO6o9/MW2OMXjs4l8SmhbYkjzA2u0LlIdq6/R9+XsSLjcQFBX/rY5N3gHbA=="
+    },
+    "integrity": "sha256-sZ0WKH6yJNZIU3ZKUwsEH/L2zPtu0nJQjKBSBDdNc3Y= sha384-NrY7zO4/huQheTwlNM3wlFWWNKo5FAR2RUDLyN0jKN8j22hDf0TbR0pyu+y+xtF/ sha512-vvPhPab3oEb9Oyj/eCjD8SRItbpzO6o9/MW2OMXjs4l8SmhbYkjzA2u0LlIdq6/R9+XsSLjcQFBX/rY5N3gHbA==",
+    "path": "dist/localization/messages_no.js"
+  },
+  "@dist/localization/messages_no.min.js": {
+    "hashes": {
+      "sha256": "D+2cyqqhAyRKwTQiABD8F+B3f2UspLfXJhk2XPU2nMY=",
+      "sha384": "gFbx46siTxjRhODHzkWAQepYorSAWHc7PcM8JR3iG2pWJ1sbTRq/tG8yKhMNo4Zy",
+      "sha512": "Q4DtQqrzqFVHfs5oxF5TKK35fi7T3+FO9SUEn535bccZihPjpw1mozfeMwpSBGAJDRtJmjm7T4euIN822iDE0g=="
+    },
+    "integrity": "sha256-D+2cyqqhAyRKwTQiABD8F+B3f2UspLfXJhk2XPU2nMY= sha384-gFbx46siTxjRhODHzkWAQepYorSAWHc7PcM8JR3iG2pWJ1sbTRq/tG8yKhMNo4Zy sha512-Q4DtQqrzqFVHfs5oxF5TKK35fi7T3+FO9SUEn535bccZihPjpw1mozfeMwpSBGAJDRtJmjm7T4euIN822iDE0g==",
+    "path": "dist/localization/messages_no.min.js"
+  },
+  "@dist/localization/messages_pl.js": {
+    "hashes": {
+      "sha256": "3uNJoqhzpQVwtM/PFgIsvsMSrh0ODBh4WZ64TQ6s/+M=",
+      "sha384": "zGRmUaKuAK53VUqhuYQyd80NklCkTFIxn7wF4EUoewrr5sjKf3cbmZVWpAyHBEzh",
+      "sha512": "t5n1L0yJjXw8O3ibva9xetiGCNGyQYNgVG56J9Jn/uv0BMOnRTGwu7GW5IrfSesmKm6prpOEmpyFW3ZxwpBhpw=="
+    },
+    "integrity": "sha256-3uNJoqhzpQVwtM/PFgIsvsMSrh0ODBh4WZ64TQ6s/+M= sha384-zGRmUaKuAK53VUqhuYQyd80NklCkTFIxn7wF4EUoewrr5sjKf3cbmZVWpAyHBEzh sha512-t5n1L0yJjXw8O3ibva9xetiGCNGyQYNgVG56J9Jn/uv0BMOnRTGwu7GW5IrfSesmKm6prpOEmpyFW3ZxwpBhpw==",
+    "path": "dist/localization/messages_pl.js"
+  },
+  "@dist/localization/messages_pl.min.js": {
+    "hashes": {
+      "sha256": "dBjdiP5KbMpHWhMtrAZIL8MU3Rxz09JA+z8VS650njc=",
+      "sha384": "fW0kib7v+qBrCf8X90sHahSQpeLDnxKUzWbRjjsM1emxGh2VrWCeaRE1cf/XsEAl",
+      "sha512": "CWTMLsLIDQ1wv2WutWePJRByKf2+c7oey9VcVmCOVv9nGacaxuMAu75Y+0GJu14Mm3vSRUSE58a9J2FeWTLuDA=="
+    },
+    "integrity": "sha256-dBjdiP5KbMpHWhMtrAZIL8MU3Rxz09JA+z8VS650njc= sha384-fW0kib7v+qBrCf8X90sHahSQpeLDnxKUzWbRjjsM1emxGh2VrWCeaRE1cf/XsEAl sha512-CWTMLsLIDQ1wv2WutWePJRByKf2+c7oey9VcVmCOVv9nGacaxuMAu75Y+0GJu14Mm3vSRUSE58a9J2FeWTLuDA==",
+    "path": "dist/localization/messages_pl.min.js"
+  },
+  "@dist/localization/messages_pt_BR.js": {
+    "hashes": {
+      "sha256": "kFvq5wJ6gMb2EUK2+x2aBUkACzAgzxuR6+Ym/j79BRg=",
+      "sha384": "8h/TJSg9TUqDskLXbYYYVTAn3JYwz75vdLZK/5nATrLYDC4Bf4ZD6LFDeQDlqoO7",
+      "sha512": "VkFbkx4EqRSpK78GHvNwgkLXwUHm10iPHBGxAEIrhpYuaCYnbD1n8s8g6aBXOLElYPCsyI1dya+0aD15+zH4HA=="
+    },
+    "integrity": "sha256-kFvq5wJ6gMb2EUK2+x2aBUkACzAgzxuR6+Ym/j79BRg= sha384-8h/TJSg9TUqDskLXbYYYVTAn3JYwz75vdLZK/5nATrLYDC4Bf4ZD6LFDeQDlqoO7 sha512-VkFbkx4EqRSpK78GHvNwgkLXwUHm10iPHBGxAEIrhpYuaCYnbD1n8s8g6aBXOLElYPCsyI1dya+0aD15+zH4HA==",
+    "path": "dist/localization/messages_pt_BR.js"
+  },
+  "@dist/localization/messages_pt_BR.min.js": {
+    "hashes": {
+      "sha256": "XPVq9FOi0rZTuUUM1OBNwLj/HPADmvgTT+KSuoDqjjw=",
+      "sha384": "NYDAklKnyEW3Yz+7dRDVt9hqzRR2a+FnFRqsNiMwJfyvueoEPbzSD33eYCe61V9L",
+      "sha512": "3lkrZ8U8ZtVDI7Af6CjYz0oc9w1aWKNhad7VUXBfCoK4YdUgReIUNqnINuwUkIDhyNKWWV+Ho9gZuUGbu8GJTQ=="
+    },
+    "integrity": "sha256-XPVq9FOi0rZTuUUM1OBNwLj/HPADmvgTT+KSuoDqjjw= sha384-NYDAklKnyEW3Yz+7dRDVt9hqzRR2a+FnFRqsNiMwJfyvueoEPbzSD33eYCe61V9L sha512-3lkrZ8U8ZtVDI7Af6CjYz0oc9w1aWKNhad7VUXBfCoK4YdUgReIUNqnINuwUkIDhyNKWWV+Ho9gZuUGbu8GJTQ==",
+    "path": "dist/localization/messages_pt_BR.min.js"
+  },
+  "@dist/localization/messages_pt_PT.js": {
+    "hashes": {
+      "sha256": "09v9HI3pENpmPbWYOczi7HQE9ONHYilzJnD2yqTDPPo=",
+      "sha384": "qgQL4NLB8aLjOOpag93VMymazLCSLATgBwJekJbjxjQpBRsTQJxOAnUNvd+0UORj",
+      "sha512": "lGkA/5BX+DUv8lOUCaUBhY233pDcVvDrTMuZj8IaSGMOghhxgswqYeF8/or1KBEZecvMB1uo7dB0qFZ3z7s9Mg=="
+    },
+    "integrity": "sha256-09v9HI3pENpmPbWYOczi7HQE9ONHYilzJnD2yqTDPPo= sha384-qgQL4NLB8aLjOOpag93VMymazLCSLATgBwJekJbjxjQpBRsTQJxOAnUNvd+0UORj sha512-lGkA/5BX+DUv8lOUCaUBhY233pDcVvDrTMuZj8IaSGMOghhxgswqYeF8/or1KBEZecvMB1uo7dB0qFZ3z7s9Mg==",
+    "path": "dist/localization/messages_pt_PT.js"
+  },
+  "@dist/localization/messages_pt_PT.min.js": {
+    "hashes": {
+      "sha256": "JAB4A0tiJkS4PnA8kSlFYasEbArz2y55SA+AiLYj5b8=",
+      "sha384": "KTgDG6TYlNiZMGua9jGemO+VqtqNndBOkktZZQ2rpG2o+cBXg+lhEylQKgRNyl7v",
+      "sha512": "YS/35waCM46BezhcRG+iKvMe3kKZdWzLUbAORNUsxBIPNE1PGLaoE2z9fSLSE5IGuDoiXD+ltcxQCohlAiNXSA=="
+    },
+    "integrity": "sha256-JAB4A0tiJkS4PnA8kSlFYasEbArz2y55SA+AiLYj5b8= sha384-KTgDG6TYlNiZMGua9jGemO+VqtqNndBOkktZZQ2rpG2o+cBXg+lhEylQKgRNyl7v sha512-YS/35waCM46BezhcRG+iKvMe3kKZdWzLUbAORNUsxBIPNE1PGLaoE2z9fSLSE5IGuDoiXD+ltcxQCohlAiNXSA==",
+    "path": "dist/localization/messages_pt_PT.min.js"
+  },
+  "@dist/localization/messages_ro.js": {
+    "hashes": {
+      "sha256": "LuGNl1ZbKfOq1IvlKUiK0NQiOqakoCtSSMc02H+lTW8=",
+      "sha384": "XFb5/l31S25xu3t/ra1yvxbuhgfD0Jun2+1VebvY86Px1gHgK2Dd0X55g57WmqgZ",
+      "sha512": "pmnza30tjfXwynXSSRbxu2DbHGkknxfQfQMWz3pWRTkk6QO4fwCwFs6WrzEsW14IrRGH/ctTrlWva75nsVhWIA=="
+    },
+    "integrity": "sha256-LuGNl1ZbKfOq1IvlKUiK0NQiOqakoCtSSMc02H+lTW8= sha384-XFb5/l31S25xu3t/ra1yvxbuhgfD0Jun2+1VebvY86Px1gHgK2Dd0X55g57WmqgZ sha512-pmnza30tjfXwynXSSRbxu2DbHGkknxfQfQMWz3pWRTkk6QO4fwCwFs6WrzEsW14IrRGH/ctTrlWva75nsVhWIA==",
+    "path": "dist/localization/messages_ro.js"
+  },
+  "@dist/localization/messages_ro.min.js": {
+    "hashes": {
+      "sha256": "YeTrPWaRv04qRsd8rAF4BwmU05ckWTOQTjcKZ8DR71o=",
+      "sha384": "9cb0ODUz1H25jvxQbm2rhJh9aXYzcupOKe1mlLECW6/ppAb3UCJBGpIcCr5DJQyq",
+      "sha512": "N5XGV/5/0oGipf0ViajwjC5QCXZFTFWxA8xhArYdwzsuXCXCqucNHP/zqgt1TTv+ExiU3U99paCwopZlerq1kA=="
+    },
+    "integrity": "sha256-YeTrPWaRv04qRsd8rAF4BwmU05ckWTOQTjcKZ8DR71o= sha384-9cb0ODUz1H25jvxQbm2rhJh9aXYzcupOKe1mlLECW6/ppAb3UCJBGpIcCr5DJQyq sha512-N5XGV/5/0oGipf0ViajwjC5QCXZFTFWxA8xhArYdwzsuXCXCqucNHP/zqgt1TTv+ExiU3U99paCwopZlerq1kA==",
+    "path": "dist/localization/messages_ro.min.js"
+  },
+  "@dist/localization/messages_ru.js": {
+    "hashes": {
+      "sha256": "XbVL65VzdRMAtE6InWwUMw/DAQMnn+i65Z4cA1Nz1bk=",
+      "sha384": "2yN/Kkx17xWYa+TSOi3ao5weKris5ID2U3R0L6dFam73OMR32yZKMMiO1iv1JG1S",
+      "sha512": "HtHVEJl8uAubqNZgH+ticHNQ8keD7FrFVBRIOhMcynhKs7Wt8q/tzd1lfADOJj1tsZcc/Hr8ELXJdcMHiiMUOQ=="
+    },
+    "integrity": "sha256-XbVL65VzdRMAtE6InWwUMw/DAQMnn+i65Z4cA1Nz1bk= sha384-2yN/Kkx17xWYa+TSOi3ao5weKris5ID2U3R0L6dFam73OMR32yZKMMiO1iv1JG1S sha512-HtHVEJl8uAubqNZgH+ticHNQ8keD7FrFVBRIOhMcynhKs7Wt8q/tzd1lfADOJj1tsZcc/Hr8ELXJdcMHiiMUOQ==",
+    "path": "dist/localization/messages_ru.js"
+  },
+  "@dist/localization/messages_ru.min.js": {
+    "hashes": {
+      "sha256": "/zc0l5Lz9N5yjcmhOS9Tgg3STtUQTpZqTBdxqUGGheY=",
+      "sha384": "qmMqrvzyMi3mv1y4cpPDjtuvGwTlPZ6LMFd1g4+sRoQmrqu9EdOquLvqt9cRsM7Q",
+      "sha512": "c8kY1WYTIVERnc3HqfpwiZ1BaOliPgdOnEnm+bo42nXBPDBBTSz/BiyJ03nG6Qx3Y7B3ivTYGWwcfOW9hZ/nJA=="
+    },
+    "integrity": "sha256-/zc0l5Lz9N5yjcmhOS9Tgg3STtUQTpZqTBdxqUGGheY= sha384-qmMqrvzyMi3mv1y4cpPDjtuvGwTlPZ6LMFd1g4+sRoQmrqu9EdOquLvqt9cRsM7Q sha512-c8kY1WYTIVERnc3HqfpwiZ1BaOliPgdOnEnm+bo42nXBPDBBTSz/BiyJ03nG6Qx3Y7B3ivTYGWwcfOW9hZ/nJA==",
+    "path": "dist/localization/messages_ru.min.js"
+  },
+  "@dist/localization/messages_sd.js": {
+    "hashes": {
+      "sha256": "1qzMnZzEZXnvOGktzlWtHCjc+B32iclSs6XNhzsR31Y=",
+      "sha384": "IPJ0Gj02+fzL328PfJG3zX0DL1PTMNwPbl29ill9Dj3Kvuv6K2dVucCo/Fyp2jMe",
+      "sha512": "T8uFcNbgze8DStxERRJ5WD9xcRuvrJ7qvPwtIrd/7CUjVf1jw6llxjCrqTKtyftzP/V/IZQBATiFzazE0+C43g=="
+    },
+    "integrity": "sha256-1qzMnZzEZXnvOGktzlWtHCjc+B32iclSs6XNhzsR31Y= sha384-IPJ0Gj02+fzL328PfJG3zX0DL1PTMNwPbl29ill9Dj3Kvuv6K2dVucCo/Fyp2jMe sha512-T8uFcNbgze8DStxERRJ5WD9xcRuvrJ7qvPwtIrd/7CUjVf1jw6llxjCrqTKtyftzP/V/IZQBATiFzazE0+C43g==",
+    "path": "dist/localization/messages_sd.js"
+  },
+  "@dist/localization/messages_sd.min.js": {
+    "hashes": {
+      "sha256": "cQ+QITl0SU8UhmZktjzbUxKu89tT6W1OQsxIQrm3D2U=",
+      "sha384": "pJ/0d98y3BaifF+fjDwvXvkPcJUUi7gDwKphWAOtaiZ3Ow11Xm1uUh/N+tRoBxL4",
+      "sha512": "PTcWKzRBogIfE9yarriPb9ofGSvlW18EpOA1LYO5RHLLQrcE96Dgng/umHwJZ25stbGcLznHczTC8U43O1Bhxw=="
+    },
+    "integrity": "sha256-cQ+QITl0SU8UhmZktjzbUxKu89tT6W1OQsxIQrm3D2U= sha384-pJ/0d98y3BaifF+fjDwvXvkPcJUUi7gDwKphWAOtaiZ3Ow11Xm1uUh/N+tRoBxL4 sha512-PTcWKzRBogIfE9yarriPb9ofGSvlW18EpOA1LYO5RHLLQrcE96Dgng/umHwJZ25stbGcLznHczTC8U43O1Bhxw==",
+    "path": "dist/localization/messages_sd.min.js"
+  },
+  "@dist/localization/messages_si.js": {
+    "hashes": {
+      "sha256": "KJILi9Fvv8U1Nhu3v66jOLaUie2ODS6iUkK5aWg2LIM=",
+      "sha384": "E5SdgizjnUq+8CJAPmHW7CrvlJNAt77UPXlWaqxn6HeZ9obOXSRqzJdZ0VV3Skos",
+      "sha512": "wYLKrET2iY0fENOq+D4AL2XKhPpbyVKtmC6h44rUKZB916MBiaBJ6JFx+qJbeWd57omP6Sa+hN8jWGsnORsAAw=="
+    },
+    "integrity": "sha256-KJILi9Fvv8U1Nhu3v66jOLaUie2ODS6iUkK5aWg2LIM= sha384-E5SdgizjnUq+8CJAPmHW7CrvlJNAt77UPXlWaqxn6HeZ9obOXSRqzJdZ0VV3Skos sha512-wYLKrET2iY0fENOq+D4AL2XKhPpbyVKtmC6h44rUKZB916MBiaBJ6JFx+qJbeWd57omP6Sa+hN8jWGsnORsAAw==",
+    "path": "dist/localization/messages_si.js"
+  },
+  "@dist/localization/messages_si.min.js": {
+    "hashes": {
+      "sha256": "y4+ncAeveXb4+JBGwLrXhcqITNSQ4OkASBa0k5gd6YA=",
+      "sha384": "66z2Co8RrAtZiYxF7sFdo/EG2Z7Y1NVnoH6z3dqvoHFaMToeLwk09yw7Xz27u4xT",
+      "sha512": "vV/t1H9slajTkSrJXq48bNpgWCbE27dTnvjSoUmtbMGQzl/mgNlNAzhw1plB6osirZZs0BFXyZC4I0qiAmjmzg=="
+    },
+    "integrity": "sha256-y4+ncAeveXb4+JBGwLrXhcqITNSQ4OkASBa0k5gd6YA= sha384-66z2Co8RrAtZiYxF7sFdo/EG2Z7Y1NVnoH6z3dqvoHFaMToeLwk09yw7Xz27u4xT sha512-vV/t1H9slajTkSrJXq48bNpgWCbE27dTnvjSoUmtbMGQzl/mgNlNAzhw1plB6osirZZs0BFXyZC4I0qiAmjmzg==",
+    "path": "dist/localization/messages_si.min.js"
+  },
+  "@dist/localization/messages_sk.js": {
+    "hashes": {
+      "sha256": "+2GVfyS82+Nt/BPF4Euyv8BcsDZff+uuoJbWOh08Oxo=",
+      "sha384": "xHuDG8l/s68bQkMaiiO2Nz0WsvmQynAmVAUmMAXVOHtMQCnmXF5oh0mpaofxKCDI",
+      "sha512": "oi62V8y18cr+IUybAB8lsMtmSGVSwIXoCic8gi9hwJJwh2MPBUnscLp9O6/qabug0o3DHxU5UkukiAMXn4fpVQ=="
+    },
+    "integrity": "sha256-+2GVfyS82+Nt/BPF4Euyv8BcsDZff+uuoJbWOh08Oxo= sha384-xHuDG8l/s68bQkMaiiO2Nz0WsvmQynAmVAUmMAXVOHtMQCnmXF5oh0mpaofxKCDI sha512-oi62V8y18cr+IUybAB8lsMtmSGVSwIXoCic8gi9hwJJwh2MPBUnscLp9O6/qabug0o3DHxU5UkukiAMXn4fpVQ==",
+    "path": "dist/localization/messages_sk.js"
+  },
+  "@dist/localization/messages_sk.min.js": {
+    "hashes": {
+      "sha256": "wsKWgrfUmdyzSNtp/I4uIoJK/+J704WWhvC49MjlV2o=",
+      "sha384": "gvdqRcBRzhE3TqsM3eL8+9cnhZx9Xj9CUHeDsOLRAFzAZxj7dJq2F/kesgG3mRML",
+      "sha512": "3x7WAIw1LiKxaJnvDp3O3rEJxp5Red3gnFTg9qP+DrP7Lc2YcHB0oK1QtwVQzWVqz7/z+71zwar+GEmzrrPD2g=="
+    },
+    "integrity": "sha256-wsKWgrfUmdyzSNtp/I4uIoJK/+J704WWhvC49MjlV2o= sha384-gvdqRcBRzhE3TqsM3eL8+9cnhZx9Xj9CUHeDsOLRAFzAZxj7dJq2F/kesgG3mRML sha512-3x7WAIw1LiKxaJnvDp3O3rEJxp5Red3gnFTg9qP+DrP7Lc2YcHB0oK1QtwVQzWVqz7/z+71zwar+GEmzrrPD2g==",
+    "path": "dist/localization/messages_sk.min.js"
+  },
+  "@dist/localization/messages_sl.js": {
+    "hashes": {
+      "sha256": "M1hfH9w1DI9pSvuvPhI87fgp0vWwEq5k0rptiib+OBw=",
+      "sha384": "orhG65ZD5gupm29b7z+M5fOjrZ40Y5MUkPz2lzCHnXxTrqwLtKvdEUS2C/HtxG/o",
+      "sha512": "jXYskDJhgeoH+v4Od65KGyIHhXz6i3UjGJXdh6odiOev9Xh0RhRQKlKZ6jsDGVL9gXmt4R+csrpGv5RImnk1zg=="
+    },
+    "integrity": "sha256-M1hfH9w1DI9pSvuvPhI87fgp0vWwEq5k0rptiib+OBw= sha384-orhG65ZD5gupm29b7z+M5fOjrZ40Y5MUkPz2lzCHnXxTrqwLtKvdEUS2C/HtxG/o sha512-jXYskDJhgeoH+v4Od65KGyIHhXz6i3UjGJXdh6odiOev9Xh0RhRQKlKZ6jsDGVL9gXmt4R+csrpGv5RImnk1zg==",
+    "path": "dist/localization/messages_sl.js"
+  },
+  "@dist/localization/messages_sl.min.js": {
+    "hashes": {
+      "sha256": "+VfTmCGwXGiLW9k0rbO8GM+7hWVtUZneRxa38Fqlnk8=",
+      "sha384": "TlZA8CNo5ZFP++Fe97UCVKbV0v3tIZRI4rRr12cXyq89xfyRU0/bfngMf5dYItKB",
+      "sha512": "pM+CO5Mn5XT3YKuKQxhFRNvqkVeym9KkzU9RPuuuxH/+hqeucKj6jiSpBfTSrTR5n7osTXrERQkS2gI1eKeYzQ=="
+    },
+    "integrity": "sha256-+VfTmCGwXGiLW9k0rbO8GM+7hWVtUZneRxa38Fqlnk8= sha384-TlZA8CNo5ZFP++Fe97UCVKbV0v3tIZRI4rRr12cXyq89xfyRU0/bfngMf5dYItKB sha512-pM+CO5Mn5XT3YKuKQxhFRNvqkVeym9KkzU9RPuuuxH/+hqeucKj6jiSpBfTSrTR5n7osTXrERQkS2gI1eKeYzQ==",
+    "path": "dist/localization/messages_sl.min.js"
+  },
+  "@dist/localization/messages_sr_lat.js": {
+    "hashes": {
+      "sha256": "XjqujreW0ttp7cDNFzR15XvdTm3mv7Y6GnKkA1ivpm8=",
+      "sha384": "BU15Nn8NsPhQmqWOEQU6SBu2QAkV9FuX8B/+izSUh8nX9VeO4lNtJTmuPfbzEBWM",
+      "sha512": "qUGDftoZoFwTvwfYKGUDuhQ8e2Ut1UrEiX2lbqnDi0ZDS7r5BqbdLhtYgiDUYFIPKjdiE+zi6OKTAZfyKBqsHA=="
+    },
+    "integrity": "sha256-XjqujreW0ttp7cDNFzR15XvdTm3mv7Y6GnKkA1ivpm8= sha384-BU15Nn8NsPhQmqWOEQU6SBu2QAkV9FuX8B/+izSUh8nX9VeO4lNtJTmuPfbzEBWM sha512-qUGDftoZoFwTvwfYKGUDuhQ8e2Ut1UrEiX2lbqnDi0ZDS7r5BqbdLhtYgiDUYFIPKjdiE+zi6OKTAZfyKBqsHA==",
+    "path": "dist/localization/messages_sr_lat.js"
+  },
+  "@dist/localization/messages_sr_lat.min.js": {
+    "hashes": {
+      "sha256": "bDz5m7LJHEX09KDvHnOAucdFm09u+hQijL3QdDIa+ZQ=",
+      "sha384": "TXeOW9WLtUK/SmcTIoUbZEA63DcMoXt8xa16It2I8xnmk9dzPQQyvhYsmP5QX6wY",
+      "sha512": "WwrjFWVm3oDx3wq+vCnmpztdiKasYL5hABo2sTg2ecjaEMvSe5zCHYqptnpV4oZ+LYVwmtJc7V1MRXhtjQnbCA=="
+    },
+    "integrity": "sha256-bDz5m7LJHEX09KDvHnOAucdFm09u+hQijL3QdDIa+ZQ= sha384-TXeOW9WLtUK/SmcTIoUbZEA63DcMoXt8xa16It2I8xnmk9dzPQQyvhYsmP5QX6wY sha512-WwrjFWVm3oDx3wq+vCnmpztdiKasYL5hABo2sTg2ecjaEMvSe5zCHYqptnpV4oZ+LYVwmtJc7V1MRXhtjQnbCA==",
+    "path": "dist/localization/messages_sr_lat.min.js"
+  },
+  "@dist/localization/messages_sr.js": {
+    "hashes": {
+      "sha256": "IYCHqQotAuuNZ8PI+2wUis8SFppJ7wR3QNJleq0PFxA=",
+      "sha384": "FCn/uRcHnvFXW7q0/qkdVW9DI9MkfieB2PDQF+sKdXI2NxCf+lu01jQEW8wP4/US",
+      "sha512": "RB/cRRPgznyCvBsJqxP5WilS+jC99mXq1kodQ0Yt+eG/IdzAGLOSRjBgRVedqTsW/nvf3JCJmC/NS6atgt9WaA=="
+    },
+    "integrity": "sha256-IYCHqQotAuuNZ8PI+2wUis8SFppJ7wR3QNJleq0PFxA= sha384-FCn/uRcHnvFXW7q0/qkdVW9DI9MkfieB2PDQF+sKdXI2NxCf+lu01jQEW8wP4/US sha512-RB/cRRPgznyCvBsJqxP5WilS+jC99mXq1kodQ0Yt+eG/IdzAGLOSRjBgRVedqTsW/nvf3JCJmC/NS6atgt9WaA==",
+    "path": "dist/localization/messages_sr.js"
+  },
+  "@dist/localization/messages_sr.min.js": {
+    "hashes": {
+      "sha256": "RMsGDKuzO/qOE72g+jjWxt3ktH2HI7oJBdF39jxRKpc=",
+      "sha384": "nVmUNo9oGi/piIeUHYZjLed2vemkbteIvgJGQJQbs0haalUz0PtIiHtZFlrXSbcs",
+      "sha512": "IRA2Ugb+UjuqoxMXlgtUuO+wIw8+SsARs1oqlLQo+48Wv4jl3S7BgoBUqRzixu/IRfGrNIXA4OcR1tThuOU31g=="
+    },
+    "integrity": "sha256-RMsGDKuzO/qOE72g+jjWxt3ktH2HI7oJBdF39jxRKpc= sha384-nVmUNo9oGi/piIeUHYZjLed2vemkbteIvgJGQJQbs0haalUz0PtIiHtZFlrXSbcs sha512-IRA2Ugb+UjuqoxMXlgtUuO+wIw8+SsARs1oqlLQo+48Wv4jl3S7BgoBUqRzixu/IRfGrNIXA4OcR1tThuOU31g==",
+    "path": "dist/localization/messages_sr.min.js"
+  },
+  "@dist/localization/messages_sv.js": {
+    "hashes": {
+      "sha256": "9Pa8fSBDcIX/ja9U1/5iv3Mlg/bcueTQlecoSxFjNFk=",
+      "sha384": "Jw1rznd/2JeqzA6qfkoWdSHF+zhELlwP5XPzmAiVjFpMZ9aVE//NurSHYllsJNWB",
+      "sha512": "5UlZ4Kfc3IpmIXXGxswOrCoJApMm7Kzr5PQz07VQg/uf+a++drTjSldT5Ev8JOx4BtbbxW6CUg6nb6sGpdnWdA=="
+    },
+    "integrity": "sha256-9Pa8fSBDcIX/ja9U1/5iv3Mlg/bcueTQlecoSxFjNFk= sha384-Jw1rznd/2JeqzA6qfkoWdSHF+zhELlwP5XPzmAiVjFpMZ9aVE//NurSHYllsJNWB sha512-5UlZ4Kfc3IpmIXXGxswOrCoJApMm7Kzr5PQz07VQg/uf+a++drTjSldT5Ev8JOx4BtbbxW6CUg6nb6sGpdnWdA==",
+    "path": "dist/localization/messages_sv.js"
+  },
+  "@dist/localization/messages_sv.min.js": {
+    "hashes": {
+      "sha256": "wEOw7DPGJf8aIDfq37ZmyGSd6sJYSZ+FR6xqgxLp0ho=",
+      "sha384": "mi/XlxcWehcN2f54W8WcoFiDR5ejrbgr3fiO20jrvK8A6KYAztm8NzwvBDpn6Od8",
+      "sha512": "CJWjCSHnKZGCV1Ued5nwC+HABUGqQ1ZbzHT77aq0vIcFwKtX9MKGnmFTRX7eh0QIq9HmIhBa6v5SH8RBB45+dw=="
+    },
+    "integrity": "sha256-wEOw7DPGJf8aIDfq37ZmyGSd6sJYSZ+FR6xqgxLp0ho= sha384-mi/XlxcWehcN2f54W8WcoFiDR5ejrbgr3fiO20jrvK8A6KYAztm8NzwvBDpn6Od8 sha512-CJWjCSHnKZGCV1Ued5nwC+HABUGqQ1ZbzHT77aq0vIcFwKtX9MKGnmFTRX7eh0QIq9HmIhBa6v5SH8RBB45+dw==",
+    "path": "dist/localization/messages_sv.min.js"
+  },
+  "@dist/localization/messages_th.js": {
+    "hashes": {
+      "sha256": "dKuPHuL6davkh74j7BFyr0gNw9nPWYRGiOMqaVAt9Go=",
+      "sha384": "y7BWeDohWFb+u0/Lgjn1wEnL094zFdjLuZ2HGqhdcMaABSx2VhsO23kVn7G3X/Km",
+      "sha512": "LoCO2OaNlg2QjKcDi5WBqmzs+cuZFGXv5bi1+Irgo7NSe1VdCBaar7DI2Z9ti/hzmCM/ANhdt7x8ZpjQbJYLSg=="
+    },
+    "integrity": "sha256-dKuPHuL6davkh74j7BFyr0gNw9nPWYRGiOMqaVAt9Go= sha384-y7BWeDohWFb+u0/Lgjn1wEnL094zFdjLuZ2HGqhdcMaABSx2VhsO23kVn7G3X/Km sha512-LoCO2OaNlg2QjKcDi5WBqmzs+cuZFGXv5bi1+Irgo7NSe1VdCBaar7DI2Z9ti/hzmCM/ANhdt7x8ZpjQbJYLSg==",
+    "path": "dist/localization/messages_th.js"
+  },
+  "@dist/localization/messages_th.min.js": {
+    "hashes": {
+      "sha256": "IxRzVLRpwcU0981vlGnK8MOKsR4+4Now1MzgYBeyAvk=",
+      "sha384": "j0wNXdeXRu7AIEsndd96jcRI8D73qaAakgc69rd0CTg11w2VFOLF2FoZ9TKPxXzH",
+      "sha512": "KvEBNmvUSNAfixFuDe/35q0AiRttDqRDWXyIyi79+y2riO9gTCJYPYsBhoyi1d1UbMZ6Ma0KsNePASHOxZuyXA=="
+    },
+    "integrity": "sha256-IxRzVLRpwcU0981vlGnK8MOKsR4+4Now1MzgYBeyAvk= sha384-j0wNXdeXRu7AIEsndd96jcRI8D73qaAakgc69rd0CTg11w2VFOLF2FoZ9TKPxXzH sha512-KvEBNmvUSNAfixFuDe/35q0AiRttDqRDWXyIyi79+y2riO9gTCJYPYsBhoyi1d1UbMZ6Ma0KsNePASHOxZuyXA==",
+    "path": "dist/localization/messages_th.min.js"
+  },
+  "@dist/localization/messages_tj.js": {
+    "hashes": {
+      "sha256": "8KTMRXrAdb/gKsfWfuIBJKaQXgfGDclSfA7ey0SB0g8=",
+      "sha384": "RDkqG/xOGmelicE4gF0oG8cw1PUbuOznTDWFJO6RZlR2IvCIGq0m8JPVcP2uxxYZ",
+      "sha512": "jQRcUsFPvvkSDf/rFCepWmqZIb3exT4XOOSbMwWQJhavmyqPuML828XaGxBa7Fs+CMnOVYrdJzK5C51ViFWTLg=="
+    },
+    "integrity": "sha256-8KTMRXrAdb/gKsfWfuIBJKaQXgfGDclSfA7ey0SB0g8= sha384-RDkqG/xOGmelicE4gF0oG8cw1PUbuOznTDWFJO6RZlR2IvCIGq0m8JPVcP2uxxYZ sha512-jQRcUsFPvvkSDf/rFCepWmqZIb3exT4XOOSbMwWQJhavmyqPuML828XaGxBa7Fs+CMnOVYrdJzK5C51ViFWTLg==",
+    "path": "dist/localization/messages_tj.js"
+  },
+  "@dist/localization/messages_tj.min.js": {
+    "hashes": {
+      "sha256": "wnDQKiKMyFXjNRFZCBhgYpbwDwBdpqG40ftG+C77uqE=",
+      "sha384": "vBAFGUAUZkMnagNQltYiKKW9MQYNI4QN5ye/K9wGtivea64rziwgeX1BNYhOPsnU",
+      "sha512": "G5cOjOQwY0Y0WQ0ZnjV8LANUbWyUm7DBCVTQcwTQHiZDd1zTLiTi7aI6FaCbotLiUSouFZmihIajKDaR4CQnRw=="
+    },
+    "integrity": "sha256-wnDQKiKMyFXjNRFZCBhgYpbwDwBdpqG40ftG+C77uqE= sha384-vBAFGUAUZkMnagNQltYiKKW9MQYNI4QN5ye/K9wGtivea64rziwgeX1BNYhOPsnU sha512-G5cOjOQwY0Y0WQ0ZnjV8LANUbWyUm7DBCVTQcwTQHiZDd1zTLiTi7aI6FaCbotLiUSouFZmihIajKDaR4CQnRw==",
+    "path": "dist/localization/messages_tj.min.js"
+  },
+  "@dist/localization/messages_tr.js": {
+    "hashes": {
+      "sha256": "R/avL79SZTT5nrFLhVS5/CvdrJfu1oGCgneaO82+xUg=",
+      "sha384": "Uswmyg5hfnveJpbO2Hioj4815uIja7HwUGvAEMoE6O/ckv9WUOgrTPvv5JI+Jhgm",
+      "sha512": "k+gpJOD9wnHGqCYo3g8GnupF30Gyy/JgfevpaE81X8oNDMh7zuJrDalvivLbkYhUSeV3uh1ngmrMQU0G2iYMyA=="
+    },
+    "integrity": "sha256-R/avL79SZTT5nrFLhVS5/CvdrJfu1oGCgneaO82+xUg= sha384-Uswmyg5hfnveJpbO2Hioj4815uIja7HwUGvAEMoE6O/ckv9WUOgrTPvv5JI+Jhgm sha512-k+gpJOD9wnHGqCYo3g8GnupF30Gyy/JgfevpaE81X8oNDMh7zuJrDalvivLbkYhUSeV3uh1ngmrMQU0G2iYMyA==",
+    "path": "dist/localization/messages_tr.js"
+  },
+  "@dist/localization/messages_tr.min.js": {
+    "hashes": {
+      "sha256": "HoTG27eUfwSS2PWatN00Y4o5CqwnHSYTzqbG4p2M7iM=",
+      "sha384": "/aRT6SayFDtVmszee4XvRBjkmPWSC0T3yGaliggZDxOVfeM63EiOoOEeyugFqzpI",
+      "sha512": "P3jY0g07EMPlqJc3QxVVnYJ9prGYrFcUhwVNV4y9Xcr1MXUvvZYnhsDURuTpnFRzadyFIpe4YtKxQu9gNXRiTw=="
+    },
+    "integrity": "sha256-HoTG27eUfwSS2PWatN00Y4o5CqwnHSYTzqbG4p2M7iM= sha384-/aRT6SayFDtVmszee4XvRBjkmPWSC0T3yGaliggZDxOVfeM63EiOoOEeyugFqzpI sha512-P3jY0g07EMPlqJc3QxVVnYJ9prGYrFcUhwVNV4y9Xcr1MXUvvZYnhsDURuTpnFRzadyFIpe4YtKxQu9gNXRiTw==",
+    "path": "dist/localization/messages_tr.min.js"
+  },
+  "@dist/localization/messages_uk.js": {
+    "hashes": {
+      "sha256": "HKDcVYiUQmyuB2gH2QuvGeAlDRH949e2qHtySIz7vd8=",
+      "sha384": "LadmevyWSl8JqCw2iETJMKaRS6UW/LDv5VR8YuMX/FMVHI3r//GidlJJX8UDBj45",
+      "sha512": "VLce2XM90aktJrREvf9K/46aC0YTVGxH9QTTZ6AHC9+6ubrQhgpk8tX4FGdwKOfvW+GFl1j98RS4ej3pD8MUmA=="
+    },
+    "integrity": "sha256-HKDcVYiUQmyuB2gH2QuvGeAlDRH949e2qHtySIz7vd8= sha384-LadmevyWSl8JqCw2iETJMKaRS6UW/LDv5VR8YuMX/FMVHI3r//GidlJJX8UDBj45 sha512-VLce2XM90aktJrREvf9K/46aC0YTVGxH9QTTZ6AHC9+6ubrQhgpk8tX4FGdwKOfvW+GFl1j98RS4ej3pD8MUmA==",
+    "path": "dist/localization/messages_uk.js"
+  },
+  "@dist/localization/messages_uk.min.js": {
+    "hashes": {
+      "sha256": "6JL0VfFr7YCvNSIJId2rqvI5oOZKWm8ypSXxpEeeJFk=",
+      "sha384": "Y5kIP6eDaM59m7QWGnm927ImlpAToI73Ltnu3U6cWMqW4hfuEZWlLD7UP643kfDa",
+      "sha512": "LVWRTl2WBFv79CYZeWeiMFWfp3T5CyYDc24TX8J2Qill8yOaZ223e8LQ9TNzRRIA0zM+fGfVHk5m+6Xm6bzFsw=="
+    },
+    "integrity": "sha256-6JL0VfFr7YCvNSIJId2rqvI5oOZKWm8ypSXxpEeeJFk= sha384-Y5kIP6eDaM59m7QWGnm927ImlpAToI73Ltnu3U6cWMqW4hfuEZWlLD7UP643kfDa sha512-LVWRTl2WBFv79CYZeWeiMFWfp3T5CyYDc24TX8J2Qill8yOaZ223e8LQ9TNzRRIA0zM+fGfVHk5m+6Xm6bzFsw==",
+    "path": "dist/localization/messages_uk.min.js"
+  },
+  "@dist/localization/messages_ur.js": {
+    "hashes": {
+      "sha256": "QZXnK++khZ4xoU7C9NFN0c8claQ7XLmNYgYLcr3CNDM=",
+      "sha384": "OVUxjoKyjFcSXsGyXz0Kcs1xZdQGTQbz/gDNTljXAQip5X2tImYWvFYNaIz3X1ll",
+      "sha512": "snXPjQePltMVyIIR50eRoqYPMImUtnc2oxVsVZyOEXzk5TOQfqq+g4upNmjvo3R6awzDrgd18lD8qHygCo9V2A=="
+    },
+    "integrity": "sha256-QZXnK++khZ4xoU7C9NFN0c8claQ7XLmNYgYLcr3CNDM= sha384-OVUxjoKyjFcSXsGyXz0Kcs1xZdQGTQbz/gDNTljXAQip5X2tImYWvFYNaIz3X1ll sha512-snXPjQePltMVyIIR50eRoqYPMImUtnc2oxVsVZyOEXzk5TOQfqq+g4upNmjvo3R6awzDrgd18lD8qHygCo9V2A==",
+    "path": "dist/localization/messages_ur.js"
+  },
+  "@dist/localization/messages_ur.min.js": {
+    "hashes": {
+      "sha256": "9KVYCu0otEkDHOzkHN6kIyt3LdLizkANojdMqeNGeLg=",
+      "sha384": "pqMZSpnoCQ6NLdlN5/NvCHhBYIdx/uf5J98/fx4YRhSrCdfyHrIsqi7RFAiHRrqh",
+      "sha512": "EPRJPyYn7D2RQwmEw6L7hIOH6hrAGK6HYtBWAPpY9+4kr8jFBmaqcVCNiiRravW6Te9zcU8yu/G1ghWeuUlAzQ=="
+    },
+    "integrity": "sha256-9KVYCu0otEkDHOzkHN6kIyt3LdLizkANojdMqeNGeLg= sha384-pqMZSpnoCQ6NLdlN5/NvCHhBYIdx/uf5J98/fx4YRhSrCdfyHrIsqi7RFAiHRrqh sha512-EPRJPyYn7D2RQwmEw6L7hIOH6hrAGK6HYtBWAPpY9+4kr8jFBmaqcVCNiiRravW6Te9zcU8yu/G1ghWeuUlAzQ==",
+    "path": "dist/localization/messages_ur.min.js"
+  },
+  "@dist/localization/messages_vi.js": {
+    "hashes": {
+      "sha256": "rggcsgHIeGWf7wiNiMgcUhZvVl1gszik03ns6UFCagg=",
+      "sha384": "QtIdiGnFGrUwJ9HdTEiytuJ3TxPQqILKGTgZShIROT5G2mRhoSvGBhWHHExuUAAA",
+      "sha512": "VfOTw452dRXf1Tlu4km/6JhdmbqIl27Z0NC8Pyexcqr2b79GUPxVcQbXSTX39o4c8naoJNKM5pIkqOqMY9vB8g=="
+    },
+    "integrity": "sha256-rggcsgHIeGWf7wiNiMgcUhZvVl1gszik03ns6UFCagg= sha384-QtIdiGnFGrUwJ9HdTEiytuJ3TxPQqILKGTgZShIROT5G2mRhoSvGBhWHHExuUAAA sha512-VfOTw452dRXf1Tlu4km/6JhdmbqIl27Z0NC8Pyexcqr2b79GUPxVcQbXSTX39o4c8naoJNKM5pIkqOqMY9vB8g==",
+    "path": "dist/localization/messages_vi.js"
+  },
+  "@dist/localization/messages_vi.min.js": {
+    "hashes": {
+      "sha256": "uWirS5WiGEtyqNWddch8ng1dInMgwhpcSX5uCEdJ0EA=",
+      "sha384": "zdyyec8E7o/78pNHGQNbpllPvjZowQ49HFO2SjDF4DItLbL6+rJyl4BOxNZB2hKk",
+      "sha512": "XvwnzRiJCXo1LidbwEtqUSizXqMAeHHh5Q2mhBSGBE9x9b0yDfJBbrDXE85FWDHhWfmdXMXtUYgA9VYTyS3mKA=="
+    },
+    "integrity": "sha256-uWirS5WiGEtyqNWddch8ng1dInMgwhpcSX5uCEdJ0EA= sha384-zdyyec8E7o/78pNHGQNbpllPvjZowQ49HFO2SjDF4DItLbL6+rJyl4BOxNZB2hKk sha512-XvwnzRiJCXo1LidbwEtqUSizXqMAeHHh5Q2mhBSGBE9x9b0yDfJBbrDXE85FWDHhWfmdXMXtUYgA9VYTyS3mKA==",
+    "path": "dist/localization/messages_vi.min.js"
+  },
+  "@dist/localization/messages_zh_TW.js": {
+    "hashes": {
+      "sha256": "SjYRGTYqaw2Ytiienx4xgl1W1XW2GP/6/UkmPueci1E=",
+      "sha384": "ebOj6jQgbTh71n/dB+WGmftqMRNf3vCLJfHnFJTe1wZW8sw6/o7uFM/+qUQniEsZ",
+      "sha512": "PLQBPgJBVOgsi7ZYjS3M1nuxluThnk7wWGICV4BE3dbNRSzPd2PvpqLYO3tFS0b0mNWHaPqtpf0cWuO03+Kl6g=="
+    },
+    "integrity": "sha256-SjYRGTYqaw2Ytiienx4xgl1W1XW2GP/6/UkmPueci1E= sha384-ebOj6jQgbTh71n/dB+WGmftqMRNf3vCLJfHnFJTe1wZW8sw6/o7uFM/+qUQniEsZ sha512-PLQBPgJBVOgsi7ZYjS3M1nuxluThnk7wWGICV4BE3dbNRSzPd2PvpqLYO3tFS0b0mNWHaPqtpf0cWuO03+Kl6g==",
+    "path": "dist/localization/messages_zh_TW.js"
+  },
+  "@dist/localization/messages_zh_TW.min.js": {
+    "hashes": {
+      "sha256": "kk2an1Xz1DOPbFg8J+ITkGWQxFnNZvtFcWoBQz8lTyw=",
+      "sha384": "jpVMDRC0Y+m1qTY/unwGpKWnB4SHUr2r7Lv8oGXazcXEx5CIoawG7UF7dYcKgFzV",
+      "sha512": "8wd9wvNgpyADC4btR/3CdmslqyrST0L1fJAq9qcMvT5PjgNrRnwc3COKMNdknEov9SuK99Gn4CggsJwPzDX2tg=="
+    },
+    "integrity": "sha256-kk2an1Xz1DOPbFg8J+ITkGWQxFnNZvtFcWoBQz8lTyw= sha384-jpVMDRC0Y+m1qTY/unwGpKWnB4SHUr2r7Lv8oGXazcXEx5CIoawG7UF7dYcKgFzV sha512-8wd9wvNgpyADC4btR/3CdmslqyrST0L1fJAq9qcMvT5PjgNrRnwc3COKMNdknEov9SuK99Gn4CggsJwPzDX2tg==",
+    "path": "dist/localization/messages_zh_TW.min.js"
+  },
+  "@dist/localization/messages_zh.js": {
+    "hashes": {
+      "sha256": "VY0UQNu40BDMAihXIm45TxRKaMl8wpzws+IGIe/4nnY=",
+      "sha384": "UgZs/w0wFcUYXx8e8+m9KRmfPT8lldOcGRnNkaapd4vwuayFTkVI82J191DTSyUT",
+      "sha512": "h1ZkqCUBhcEDuZCTDEYshQotE+nPr/bO8DEIeC2e+YLDJhc80l965M42hhYrbGg59BPcbleXLxXUIA/1olGj8Q=="
+    },
+    "integrity": "sha256-VY0UQNu40BDMAihXIm45TxRKaMl8wpzws+IGIe/4nnY= sha384-UgZs/w0wFcUYXx8e8+m9KRmfPT8lldOcGRnNkaapd4vwuayFTkVI82J191DTSyUT sha512-h1ZkqCUBhcEDuZCTDEYshQotE+nPr/bO8DEIeC2e+YLDJhc80l965M42hhYrbGg59BPcbleXLxXUIA/1olGj8Q==",
+    "path": "dist/localization/messages_zh.js"
+  },
+  "@dist/localization/messages_zh.min.js": {
+    "hashes": {
+      "sha256": "5n1RPdULeEAdbm30f9PCcdOHYyuNqFIr+pv58jBitPY=",
+      "sha384": "5NVTHpVUv65u2Krs86ToSDjvacWdu9Gnm24/9cAj6BsidEfZaBM0+RRL0qEhvqiS",
+      "sha512": "+kZ2ud/52s1sopzbY5/S5RJaMeqJTpS0g1IWbWYR/VizJ0dBimuE2tqQkkO7/UTivzbFKweI9DcISY74iUUvYg=="
+    },
+    "integrity": "sha256-5n1RPdULeEAdbm30f9PCcdOHYyuNqFIr+pv58jBitPY= sha384-5NVTHpVUv65u2Krs86ToSDjvacWdu9Gnm24/9cAj6BsidEfZaBM0+RRL0qEhvqiS sha512-+kZ2ud/52s1sopzbY5/S5RJaMeqJTpS0g1IWbWYR/VizJ0dBimuE2tqQkkO7/UTivzbFKweI9DcISY74iUUvYg==",
+    "path": "dist/localization/messages_zh.min.js"
+  },
+  "@dist/localization/methods_de.js": {
+    "hashes": {
+      "sha256": "AWWv05vPUy+TPp86ZRjmVQd8CZRU1TzWJDLblrrXgLo=",
+      "sha384": "lmZOf7sjam/XYzeCnCDZ0uYEtrIQBy0P29X22UFZwmwCePcw5BTIJawlyZwH3/VZ",
+      "sha512": "jge59WuD/za9b32rgCAY77qInOhKpqjDBu86hC1zQyIM39AGAyYxkpxQ+4FWNcghYByXG5g3yqrMcylxkuVrPw=="
+    },
+    "integrity": "sha256-AWWv05vPUy+TPp86ZRjmVQd8CZRU1TzWJDLblrrXgLo= sha384-lmZOf7sjam/XYzeCnCDZ0uYEtrIQBy0P29X22UFZwmwCePcw5BTIJawlyZwH3/VZ sha512-jge59WuD/za9b32rgCAY77qInOhKpqjDBu86hC1zQyIM39AGAyYxkpxQ+4FWNcghYByXG5g3yqrMcylxkuVrPw==",
+    "path": "dist/localization/methods_de.js"
+  },
+  "@dist/localization/methods_de.min.js": {
+    "hashes": {
+      "sha256": "+jS2soIGhXTg6Guaap8h0l6h5IDK9gi1AOW5oNuQadY=",
+      "sha384": "nZmSH2hJ8q9dNX62hdipAh0mGX/5l5G0tqEZlls8+kCp5cwFklr/4idH+omidnPF",
+      "sha512": "VxK/CyX4r8gKtzd7XBwbkENqzBMbhNBB8Zvzbs6rWM6ouXynFiAdFhl/TS1qxW5UyUQiePijSnRjBj+oX7bjFQ=="
+    },
+    "integrity": "sha256-+jS2soIGhXTg6Guaap8h0l6h5IDK9gi1AOW5oNuQadY= sha384-nZmSH2hJ8q9dNX62hdipAh0mGX/5l5G0tqEZlls8+kCp5cwFklr/4idH+omidnPF sha512-VxK/CyX4r8gKtzd7XBwbkENqzBMbhNBB8Zvzbs6rWM6ouXynFiAdFhl/TS1qxW5UyUQiePijSnRjBj+oX7bjFQ==",
+    "path": "dist/localization/methods_de.min.js"
+  },
+  "@dist/localization/methods_es_CL.js": {
+    "hashes": {
+      "sha256": "cVHbZi8C/zlz2+Hsi47KeQ4LFhvv4PkV2ZIJRdeS9OY=",
+      "sha384": "txqcVLvMhe3V/sxpDpuRbw30hrqEZWo23GU9zpPhIIO6Xfm1IG3BM6IohUJvB/V+",
+      "sha512": "g/XucfHnfQwvxkFc7883gwZpA2OlMm1Xf6U/uxKJYx+/d5FLvTMOfsKq9PfEM2ot2qUvaTapz6U/9VwKVL1CxA=="
+    },
+    "integrity": "sha256-cVHbZi8C/zlz2+Hsi47KeQ4LFhvv4PkV2ZIJRdeS9OY= sha384-txqcVLvMhe3V/sxpDpuRbw30hrqEZWo23GU9zpPhIIO6Xfm1IG3BM6IohUJvB/V+ sha512-g/XucfHnfQwvxkFc7883gwZpA2OlMm1Xf6U/uxKJYx+/d5FLvTMOfsKq9PfEM2ot2qUvaTapz6U/9VwKVL1CxA==",
+    "path": "dist/localization/methods_es_CL.js"
+  },
+  "@dist/localization/methods_es_CL.min.js": {
+    "hashes": {
+      "sha256": "qAvA/QvoIYxX7rH3pCpP2zlzrHwjPc7b30gBnzsEy/M=",
+      "sha384": "GaGV58WkanFHgdyLtrN90dBuncaAQ+OjsGZWGAAppwmntRW2ufYoHRWsxfJUGR3z",
+      "sha512": "R0zADb15VxWUKlpArBvbXaCD2bUSxYxWHt5fHib6M14kc5QxnMskX7ZcvP1wJfYIxNi1rJB5chi1+v5edwYxpg=="
+    },
+    "integrity": "sha256-qAvA/QvoIYxX7rH3pCpP2zlzrHwjPc7b30gBnzsEy/M= sha384-GaGV58WkanFHgdyLtrN90dBuncaAQ+OjsGZWGAAppwmntRW2ufYoHRWsxfJUGR3z sha512-R0zADb15VxWUKlpArBvbXaCD2bUSxYxWHt5fHib6M14kc5QxnMskX7ZcvP1wJfYIxNi1rJB5chi1+v5edwYxpg==",
+    "path": "dist/localization/methods_es_CL.min.js"
+  },
+  "@dist/localization/methods_fi.js": {
+    "hashes": {
+      "sha256": "Lk9tDJfxwbP4/XMqf0nNdyQAKFYSZKlWMnnJ35lCp9M=",
+      "sha384": "ELceO2RNyhH/SpPfnaHm2HgPSeUGvD0TZCb6xGXSjf1hdGgo/L8kSadr+DlgbEZV",
+      "sha512": "YC0q4puzUpuClxv9Y9T56pwcug0bMb89eNYnwhSfB9hA5zphsg7hod5c4PV0UovzeBM7DjwbE3MjZ9EyH7VpYQ=="
+    },
+    "integrity": "sha256-Lk9tDJfxwbP4/XMqf0nNdyQAKFYSZKlWMnnJ35lCp9M= sha384-ELceO2RNyhH/SpPfnaHm2HgPSeUGvD0TZCb6xGXSjf1hdGgo/L8kSadr+DlgbEZV sha512-YC0q4puzUpuClxv9Y9T56pwcug0bMb89eNYnwhSfB9hA5zphsg7hod5c4PV0UovzeBM7DjwbE3MjZ9EyH7VpYQ==",
+    "path": "dist/localization/methods_fi.js"
+  },
+  "@dist/localization/methods_fi.min.js": {
+    "hashes": {
+      "sha256": "zv3yyzkTYdgoOXBBdelfh+AbJBOCx/w3SQIxmp2A11Y=",
+      "sha384": "V4tyHJmxGgbb/z+laCeDnKLXKU77AEzxCOgywaXfvZAUDfSv/WZlXtHzSJ71j63I",
+      "sha512": "5CMlnO7Mi5Y6f39+kHBMZeldbn54/UlNkNRJzRrutlBVWFDP/nXjVjpuFJilTSWyJCEqSBIhP2cevAmkfa8IMg=="
+    },
+    "integrity": "sha256-zv3yyzkTYdgoOXBBdelfh+AbJBOCx/w3SQIxmp2A11Y= sha384-V4tyHJmxGgbb/z+laCeDnKLXKU77AEzxCOgywaXfvZAUDfSv/WZlXtHzSJ71j63I sha512-5CMlnO7Mi5Y6f39+kHBMZeldbn54/UlNkNRJzRrutlBVWFDP/nXjVjpuFJilTSWyJCEqSBIhP2cevAmkfa8IMg==",
+    "path": "dist/localization/methods_fi.min.js"
+  },
+  "@dist/localization/methods_it.js": {
+    "hashes": {
+      "sha256": "NFmcmTI7I5jQrIq+8u4TgXLILtakbCorhml09UVfasY=",
+      "sha384": "yvTpbbL/gu7gZQNyQJrQK5xc2I4siv1CyHUwddKS9fY6iWCE7t7ArjWgsQe9oRRx",
+      "sha512": "K/ZJ5i98D68e2gaUw3dRuS7EfW786Rm5LNUIjDAvRsYg/87gl3ebWaUn6ghYTxVaL7d0W9nHvHkQbk1pHalxWw=="
+    },
+    "integrity": "sha256-NFmcmTI7I5jQrIq+8u4TgXLILtakbCorhml09UVfasY= sha384-yvTpbbL/gu7gZQNyQJrQK5xc2I4siv1CyHUwddKS9fY6iWCE7t7ArjWgsQe9oRRx sha512-K/ZJ5i98D68e2gaUw3dRuS7EfW786Rm5LNUIjDAvRsYg/87gl3ebWaUn6ghYTxVaL7d0W9nHvHkQbk1pHalxWw==",
+    "path": "dist/localization/methods_it.js"
+  },
+  "@dist/localization/methods_it.min.js": {
+    "hashes": {
+      "sha256": "qAvA/QvoIYxX7rH3pCpP2zlzrHwjPc7b30gBnzsEy/M=",
+      "sha384": "GaGV58WkanFHgdyLtrN90dBuncaAQ+OjsGZWGAAppwmntRW2ufYoHRWsxfJUGR3z",
+      "sha512": "R0zADb15VxWUKlpArBvbXaCD2bUSxYxWHt5fHib6M14kc5QxnMskX7ZcvP1wJfYIxNi1rJB5chi1+v5edwYxpg=="
+    },
+    "integrity": "sha256-qAvA/QvoIYxX7rH3pCpP2zlzrHwjPc7b30gBnzsEy/M= sha384-GaGV58WkanFHgdyLtrN90dBuncaAQ+OjsGZWGAAppwmntRW2ufYoHRWsxfJUGR3z sha512-R0zADb15VxWUKlpArBvbXaCD2bUSxYxWHt5fHib6M14kc5QxnMskX7ZcvP1wJfYIxNi1rJB5chi1+v5edwYxpg==",
+    "path": "dist/localization/methods_it.min.js"
+  },
+  "@dist/localization/methods_nl.js": {
+    "hashes": {
+      "sha256": "i6j6AbWewWvxh3N+nYEdKmi4BSJfdQ3YPliMr+XGL0M=",
+      "sha384": "8wZXSjYsAhziEat2hrTO0mnpTwmXQCfKE0GVQoWhgkLOGvhhpcizofBf8SiAIjSf",
+      "sha512": "CJzyiYlglucayWU1lpdRSaFb1PMnijr6YjwK8Idp2y8lyik8Y485DVucK6IDymvViD67vdUvHBu1C6eL52OVHg=="
+    },
+    "integrity": "sha256-i6j6AbWewWvxh3N+nYEdKmi4BSJfdQ3YPliMr+XGL0M= sha384-8wZXSjYsAhziEat2hrTO0mnpTwmXQCfKE0GVQoWhgkLOGvhhpcizofBf8SiAIjSf sha512-CJzyiYlglucayWU1lpdRSaFb1PMnijr6YjwK8Idp2y8lyik8Y485DVucK6IDymvViD67vdUvHBu1C6eL52OVHg==",
+    "path": "dist/localization/methods_nl.js"
+  },
+  "@dist/localization/methods_nl.min.js": {
+    "hashes": {
+      "sha256": "f1cqzdqKFarPRp3MmIhP5plngTSOorf/IIoIfwjR6Wo=",
+      "sha384": "LBCvoSyWZKILhWxCq3bxYAWpeyHMsqz32d+Tj7zFrY6L+DvPzW5ll+xnkTEJYhO7",
+      "sha512": "rjn/cPzGGCEg04VDOsSEgOSO1Cq+SDOc5AcsOwKeNtqjrFLnyB+/7G93epj3GDejszIjHfW+KMWFQibPIHhGrQ=="
+    },
+    "integrity": "sha256-f1cqzdqKFarPRp3MmIhP5plngTSOorf/IIoIfwjR6Wo= sha384-LBCvoSyWZKILhWxCq3bxYAWpeyHMsqz32d+Tj7zFrY6L+DvPzW5ll+xnkTEJYhO7 sha512-rjn/cPzGGCEg04VDOsSEgOSO1Cq+SDOc5AcsOwKeNtqjrFLnyB+/7G93epj3GDejszIjHfW+KMWFQibPIHhGrQ==",
+    "path": "dist/localization/methods_nl.min.js"
+  },
+  "@dist/localization/methods_pt.js": {
+    "hashes": {
+      "sha256": "6XkaxaFNR9VOIpAgGzIfR9jQmYU0eJJDctSbrPP89yc=",
+      "sha384": "7bmpZ0QkiAL7WlJS+JyairjzcZn7yTTJVm/QDiDK5yCXsa8/sbsuiKhBx9oILHlM",
+      "sha512": "M9nEuaF9NYn4YN8F/j8ZNTv0Dhnm0Xyk/uQBrVbHC87HLqp+FwfupJQUAICYtSgNGgNopn3uTPhWQtIubccDuA=="
+    },
+    "integrity": "sha256-6XkaxaFNR9VOIpAgGzIfR9jQmYU0eJJDctSbrPP89yc= sha384-7bmpZ0QkiAL7WlJS+JyairjzcZn7yTTJVm/QDiDK5yCXsa8/sbsuiKhBx9oILHlM sha512-M9nEuaF9NYn4YN8F/j8ZNTv0Dhnm0Xyk/uQBrVbHC87HLqp+FwfupJQUAICYtSgNGgNopn3uTPhWQtIubccDuA==",
+    "path": "dist/localization/methods_pt.js"
+  },
+  "@dist/localization/methods_pt.min.js": {
+    "hashes": {
+      "sha256": "bdzpA4zopzocThBEfCXTPD2Klad9PstPh/Hbetd+7WA=",
+      "sha384": "QuFqJh2nwnhm0KY/TLe4p5ryz8GCrBHczShyGCyN+SuDJyGv9Nj6gwCV1juVHcGT",
+      "sha512": "rcmV5nl4IcSegGM0gJFt1GMXWKlyOz0xMkoTTDggxRA45wqrMhZKBeueatgqb3NaJSABekGCaKlZ3Ouvu1xbLQ=="
+    },
+    "integrity": "sha256-bdzpA4zopzocThBEfCXTPD2Klad9PstPh/Hbetd+7WA= sha384-QuFqJh2nwnhm0KY/TLe4p5ryz8GCrBHczShyGCyN+SuDJyGv9Nj6gwCV1juVHcGT sha512-rcmV5nl4IcSegGM0gJFt1GMXWKlyOz0xMkoTTDggxRA45wqrMhZKBeueatgqb3NaJSABekGCaKlZ3Ouvu1xbLQ==",
+    "path": "dist/localization/methods_pt.min.js"
+  }
+}
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/jquery.validate.js b/civicrm/bower_components/jquery-validation/dist/jquery.validate.js
index b8d8a7a1cd..d025319db4 100644
--- a/civicrm/bower_components/jquery-validation/dist/jquery.validate.js
+++ b/civicrm/bower_components/jquery-validation/dist/jquery.validate.js
@@ -1,24 +1,27 @@
 /*!
- * jQuery Validation Plugin v1.13.1
+ * jQuery Validation Plugin v1.19.1
  *
- * http://jqueryvalidation.org/
+ * https://jqueryvalidation.org/
  *
- * Copyright (c) 2014 Jörn Zaefferer
+ * Copyright (c) 2019 Jörn Zaefferer
  * Released under the MIT license
  */
 (function( factory ) {
 	if ( typeof define === "function" && define.amd ) {
 		define( ["jquery"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
 	} else {
 		factory( jQuery );
 	}
 }(function( $ ) {
 
-$.extend($.fn, {
-	// http://jqueryvalidation.org/validate/
+$.extend( $.fn, {
+
+	// https://jqueryvalidation.org/validate/
 	validate: function( options ) {
 
-		// if nothing is selected, return nothing; can't chain anyway
+		// If nothing is selected, return nothing; can't chain anyway
 		if ( !this.length ) {
 			if ( options && options.debug && window.console ) {
 				console.warn( "Nothing selected, can't validate, returning nothing." );
@@ -26,7 +29,7 @@ $.extend($.fn, {
 			return;
 		}
 
-		// check if a validator for this form was already created
+		// Check if a validator for this form was already created
 		var validator = $.data( this[ 0 ], "validator" );
 		if ( validator ) {
 			return validator;
@@ -40,40 +43,51 @@ $.extend($.fn, {
 
 		if ( validator.settings.onsubmit ) {
 
-			this.validateDelegate( ":submit", "click", function( event ) {
-				if ( validator.settings.submitHandler ) {
-					validator.submitButton = event.target;
-				}
-				// allow suppressing validation by adding a cancel class to the submit button
-				if ( $( event.target ).hasClass( "cancel" ) ) {
+			this.on( "click.validate", ":submit", function( event ) {
+
+				// Track the used submit button to properly handle scripted
+				// submits later.
+				validator.submitButton = event.currentTarget;
+
+				// Allow suppressing validation by adding a cancel class to the submit button
+				if ( $( this ).hasClass( "cancel" ) ) {
 					validator.cancelSubmit = true;
 				}
 
-				// allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
-				if ( $( event.target ).attr( "formnovalidate" ) !== undefined ) {
+				// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
+				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
 					validator.cancelSubmit = true;
 				}
-			});
+			} );
 
-			// validate the form on submit
-			this.submit( function( event ) {
+			// Validate the form on submit
+			this.on( "submit.validate", function( event ) {
 				if ( validator.settings.debug ) {
-					// prevent form submit to be able to see console output
+
+					// Prevent form submit to be able to see console output
 					event.preventDefault();
 				}
+
 				function handle() {
 					var hidden, result;
-					if ( validator.settings.submitHandler ) {
-						if ( validator.submitButton ) {
-							// insert a hidden input as a replacement for the missing submit button
-							hidden = $( "<input type='hidden'/>" )
-								.attr( "name", validator.submitButton.name )
-								.val( $( validator.submitButton ).val() )
-								.appendTo( validator.currentForm );
-						}
+
+					// Insert a hidden input as a replacement for the missing submit button
+					// The hidden input is inserted in two cases:
+					//   - A user defined a `submitHandler`
+					//   - There was a pending request due to `remote` method and `stopRequest()`
+					//     was called to submit the form in case it's valid
+					if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
+						hidden = $( "<input type='hidden'/>" )
+							.attr( "name", validator.submitButton.name )
+							.val( $( validator.submitButton ).val() )
+							.appendTo( validator.currentForm );
+					}
+
+					if ( validator.settings.submitHandler && !validator.settings.debug ) {
 						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
-						if ( validator.submitButton ) {
-							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
+						if ( hidden ) {
+
+							// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
 							hidden.remove();
 						}
 						if ( result !== undefined ) {
@@ -84,7 +98,7 @@ $.extend($.fn, {
 					return true;
 				}
 
-				// prevent submit for invalid forms or custom submit handlers
+				// Prevent submit for invalid forms or custom submit handlers
 				if ( validator.cancelSubmit ) {
 					validator.cancelSubmit = false;
 					return handle();
@@ -99,41 +113,53 @@ $.extend($.fn, {
 					validator.focusInvalid();
 					return false;
 				}
-			});
+			} );
 		}
 
 		return validator;
 	},
-	// http://jqueryvalidation.org/valid/
+
+	// https://jqueryvalidation.org/valid/
 	valid: function() {
-		var valid, validator;
+		var valid, validator, errorList;
 
 		if ( $( this[ 0 ] ).is( "form" ) ) {
 			valid = this.validate().form();
 		} else {
+			errorList = [];
 			valid = true;
 			validator = $( this[ 0 ].form ).validate();
 			this.each( function() {
 				valid = validator.element( this ) && valid;
-			});
+				if ( !valid ) {
+					errorList = errorList.concat( validator.errorList );
+				}
+			} );
+			validator.errorList = errorList;
 		}
 		return valid;
 	},
-	// attributes: space separated list of attributes to retrieve and remove
-	removeAttrs: function( attributes ) {
-		var result = {},
-			$element = this;
-		$.each( attributes.split( /\s/ ), function( index, value ) {
-			result[ value ] = $element.attr( value );
-			$element.removeAttr( value );
-		});
-		return result;
-	},
-	// http://jqueryvalidation.org/rules/
+
+	// https://jqueryvalidation.org/rules/
 	rules: function( command, argument ) {
 		var element = this[ 0 ],
+			isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
 			settings, staticRules, existingRules, data, param, filtered;
 
+		// If nothing is selected, return empty object; can't chain anyway
+		if ( element == null ) {
+			return;
+		}
+
+		if ( !element.form && isContentEditable ) {
+			element.form = this.closest( "form" )[ 0 ];
+			element.name = this.attr( "name" );
+		}
+
+		if ( element.form == null ) {
+			return;
+		}
+
 		if ( command ) {
 			settings = $.data( element.form, "validator" ).settings;
 			staticRules = settings.rules;
@@ -141,7 +167,8 @@ $.extend($.fn, {
 			switch ( command ) {
 			case "add":
 				$.extend( existingRules, $.validator.normalizeRule( argument ) );
-				// remove messages from rules, but allow them to be set separately
+
+				// Remove messages from rules, but allow them to be set separately
 				delete existingRules.messages;
 				staticRules[ element.name ] = existingRules;
 				if ( argument.messages ) {
@@ -157,10 +184,7 @@ $.extend($.fn, {
 				$.each( argument.split( /\s/ ), function( index, method ) {
 					filtered[ method ] = existingRules[ method ];
 					delete existingRules[ method ];
-					if ( method === "required" ) {
-						$( element ).removeAttr( "aria-required" );
-					}
-				});
+				} );
 				return filtered;
 			}
 		}
@@ -174,49 +198,52 @@ $.extend($.fn, {
 			$.validator.staticRules( element )
 		), element );
 
-		// make sure required is at front
+		// Make sure required is at front
 		if ( data.required ) {
 			param = data.required;
 			delete data.required;
 			data = $.extend( { required: param }, data );
-			$( element ).attr( "aria-required", "true" );
 		}
 
-		// make sure remote is at back
+		// Make sure remote is at back
 		if ( data.remote ) {
 			param = data.remote;
 			delete data.remote;
-			data = $.extend( data, { remote: param });
+			data = $.extend( data, { remote: param } );
 		}
 
 		return data;
 	}
-});
+} );
 
 // Custom selectors
-$.extend( $.expr[ ":" ], {
-	// http://jqueryvalidation.org/blank-selector/
+$.extend( $.expr.pseudos || $.expr[ ":" ], {		// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
+
+	// https://jqueryvalidation.org/blank-selector/
 	blank: function( a ) {
 		return !$.trim( "" + $( a ).val() );
 	},
-	// http://jqueryvalidation.org/filled-selector/
+
+	// https://jqueryvalidation.org/filled-selector/
 	filled: function( a ) {
-		return !!$.trim( "" + $( a ).val() );
+		var val = $( a ).val();
+		return val !== null && !!$.trim( "" + val );
 	},
-	// http://jqueryvalidation.org/unchecked-selector/
+
+	// https://jqueryvalidation.org/unchecked-selector/
 	unchecked: function( a ) {
 		return !$( a ).prop( "checked" );
 	}
-});
+} );
 
-// constructor for validator
+// Constructor for validator
 $.validator = function( options, form ) {
 	this.settings = $.extend( true, {}, $.validator.defaults, options );
 	this.currentForm = form;
 	this.init();
 };
 
-// http://jqueryvalidation.org/jQuery.validator.format/
+// https://jqueryvalidation.org/jQuery.validator.format/
 $.validator.format = function( source, params ) {
 	if ( arguments.length === 1 ) {
 		return function() {
@@ -225,6 +252,9 @@ $.validator.format = function( source, params ) {
 			return $.validator.format.apply( this, args );
 		};
 	}
+	if ( params === undefined ) {
+		return source;
+	}
 	if ( arguments.length > 2 && params.constructor !== Array  ) {
 		params = $.makeArray( arguments ).slice( 1 );
 	}
@@ -234,8 +264,8 @@ $.validator.format = function( source, params ) {
 	$.each( params, function( i, n ) {
 		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
 			return n;
-		});
-	});
+		} );
+	} );
 	return source;
 };
 
@@ -246,6 +276,7 @@ $.extend( $.validator, {
 		groups: {},
 		rules: {},
 		errorClass: "error",
+		pendingClass: "pending",
 		validClass: "valid",
 		errorElement: "label",
 		focusCleanup: false,
@@ -272,18 +303,39 @@ $.extend( $.validator, {
 			}
 		},
 		onkeyup: function( element, event ) {
-			if ( event.which === 9 && this.elementValue( element ) === "" ) {
+
+			// Avoid revalidate the field when pressing one of the following keys
+			// Shift       => 16
+			// Ctrl        => 17
+			// Alt         => 18
+			// Caps lock   => 20
+			// End         => 35
+			// Home        => 36
+			// Left arrow  => 37
+			// Up arrow    => 38
+			// Right arrow => 39
+			// Down arrow  => 40
+			// Insert      => 45
+			// Num lock    => 144
+			// AltGr key   => 225
+			var excludedKeys = [
+				16, 17, 18, 20, 35, 36, 37,
+				38, 39, 40, 45, 144, 225
+			];
+
+			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
 				return;
-			} else if ( element.name in this.submitted || element === this.lastElement ) {
+			} else if ( element.name in this.submitted || element.name in this.invalid ) {
 				this.element( element );
 			}
 		},
 		onclick: function( element ) {
-			// click on selects, radiobuttons and checkboxes
+
+			// Click on selects, radiobuttons and checkboxes
 			if ( element.name in this.submitted ) {
 				this.element( element );
 
-			// or option elements, check parent select in that case
+			// Or option elements, check parent select in that case
 			} else if ( element.parentNode.name in this.submitted ) {
 				this.element( element.parentNode );
 			}
@@ -304,7 +356,7 @@ $.extend( $.validator, {
 		}
 	},
 
-	// http://jqueryvalidation.org/jQuery.validator.setDefaults/
+	// https://jqueryvalidation.org/jQuery.validator.setDefaults/
 	setDefaults: function( settings ) {
 		$.extend( $.validator.defaults, settings );
 	},
@@ -315,17 +367,17 @@ $.extend( $.validator, {
 		email: "Please enter a valid email address.",
 		url: "Please enter a valid URL.",
 		date: "Please enter a valid date.",
-		dateISO: "Please enter a valid date ( ISO ).",
+		dateISO: "Please enter a valid date (ISO).",
 		number: "Please enter a valid number.",
 		digits: "Please enter only digits.",
-		creditcard: "Please enter a valid credit card number.",
 		equalTo: "Please enter the same value again.",
 		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
 		minlength: $.validator.format( "Please enter at least {0} characters." ),
 		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
 		range: $.validator.format( "Please enter a value between {0} and {1}." ),
 		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
-		min: $.validator.format( "Please enter a value greater than or equal to {0}." )
+		min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
+		step: $.validator.format( "Please enter a multiple of {0}." )
 	},
 
 	autoCreateRanges: false,
@@ -343,7 +395,8 @@ $.extend( $.validator, {
 			this.invalid = {};
 			this.reset();
 
-			var groups = ( this.groups = {} ),
+			var currentForm = this.currentForm,
+				groups = ( this.groups = {} ),
 				rules;
 			$.each( this.settings.groups, function( key, value ) {
 				if ( typeof value === "string" ) {
@@ -351,48 +404,59 @@ $.extend( $.validator, {
 				}
 				$.each( value, function( index, name ) {
 					groups[ name ] = key;
-				});
-			});
+				} );
+			} );
 			rules = this.settings.rules;
 			$.each( rules, function( key, value ) {
 				rules[ key ] = $.validator.normalizeRule( value );
-			});
+			} );
 
 			function delegate( event ) {
-				var validator = $.data( this[ 0 ].form, "validator" ),
+				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
+
+				// Set form expando on contenteditable
+				if ( !this.form && isContentEditable ) {
+					this.form = $( this ).closest( "form" )[ 0 ];
+					this.name = $( this ).attr( "name" );
+				}
+
+				// Ignore the element if it belongs to another form. This will happen mainly
+				// when setting the `form` attribute of an input to the id of another form.
+				if ( currentForm !== this.form ) {
+					return;
+				}
+
+				var validator = $.data( this.form, "validator" ),
 					eventType = "on" + event.type.replace( /^validate/, "" ),
 					settings = validator.settings;
-				if ( settings[ eventType ] && !this.is( settings.ignore ) ) {
-					settings[ eventType ].call( validator, this[ 0 ], event );
+				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
+					settings[ eventType ].call( validator, this, event );
 				}
 			}
+
 			$( this.currentForm )
-				.validateDelegate( ":text, [type='password'], [type='file'], select, textarea, " +
-					"[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
-					"[type='email'], [type='datetime'], [type='date'], [type='month'], " +
-					"[type='week'], [type='time'], [type='datetime-local'], " +
-					"[type='range'], [type='color'], [type='radio'], [type='checkbox']",
-					"focusin focusout keyup", delegate)
+				.on( "focusin.validate focusout.validate keyup.validate",
+					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
+					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
+					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
+					"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
+
 				// Support: Chrome, oldIE
 				// "select" is provided as event.target when clicking a option
-				.validateDelegate("select, option, [type='radio'], [type='checkbox']", "click", delegate);
+				.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
 
 			if ( this.settings.invalidHandler ) {
-				$( this.currentForm ).bind( "invalid-form.validate", this.settings.invalidHandler );
+				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
 			}
-
-			// Add aria-required to any Static/Data/Class required fields before first validation
-			// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
-			$( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
 		},
 
-		// http://jqueryvalidation.org/Validator.form/
+		// https://jqueryvalidation.org/Validator.form/
 		form: function() {
 			this.checkForm();
 			$.extend( this.submitted, this.errorMap );
-			this.invalid = $.extend({}, this.errorMap );
+			this.invalid = $.extend( {}, this.errorMap );
 			if ( !this.valid() ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
+				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
 			}
 			this.showErrors();
 			return this.valid();
@@ -406,13 +470,13 @@ $.extend( $.validator, {
 			return this.valid();
 		},
 
-		// http://jqueryvalidation.org/Validator.element/
+		// https://jqueryvalidation.org/Validator.element/
 		element: function( element ) {
 			var cleanElement = this.clean( element ),
 				checkElement = this.validationTargetFor( cleanElement ),
-				result = true;
-
-			this.lastElement = checkElement;
+				v = this,
+				result = true,
+				rs, group;
 
 			if ( checkElement === undefined ) {
 				delete this.invalid[ cleanElement.name ];
@@ -420,40 +484,61 @@ $.extend( $.validator, {
 				this.prepareElement( checkElement );
 				this.currentElements = $( checkElement );
 
-				result = this.check( checkElement ) !== false;
-				if ( result ) {
-					delete this.invalid[ checkElement.name ];
+				// If this element is grouped, then validate all group elements already
+				// containing a value
+				group = this.groups[ checkElement.name ];
+				if ( group ) {
+					$.each( this.groups, function( name, testgroup ) {
+						if ( testgroup === group && name !== checkElement.name ) {
+							cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
+							if ( cleanElement && cleanElement.name in v.invalid ) {
+								v.currentElements.push( cleanElement );
+								result = v.check( cleanElement ) && result;
+							}
+						}
+					} );
+				}
+
+				rs = this.check( checkElement ) !== false;
+				result = result && rs;
+				if ( rs ) {
+					this.invalid[ checkElement.name ] = false;
 				} else {
 					this.invalid[ checkElement.name ] = true;
 				}
-			}
-			// Add aria-invalid status for screen readers
-			$( element ).attr( "aria-invalid", !result );
 
-			if ( !this.numberOfInvalids() ) {
-				// Hide error containers on last error
-				this.toHide = this.toHide.add( this.containers );
+				if ( !this.numberOfInvalids() ) {
+
+					// Hide error containers on last error
+					this.toHide = this.toHide.add( this.containers );
+				}
+				this.showErrors();
+
+				// Add aria-invalid status for screen readers
+				$( element ).attr( "aria-invalid", !rs );
 			}
-			this.showErrors();
+
 			return result;
 		},
 
-		// http://jqueryvalidation.org/Validator.showErrors/
+		// https://jqueryvalidation.org/Validator.showErrors/
 		showErrors: function( errors ) {
 			if ( errors ) {
-				// add items to error list and map
+				var validator = this;
+
+				// Add items to error list and map
 				$.extend( this.errorMap, errors );
-				this.errorList = [];
-				for ( var name in errors ) {
-					this.errorList.push({
-						message: errors[ name ],
-						element: this.findByName( name )[ 0 ]
-					});
-				}
-				// remove items from success list
+				this.errorList = $.map( this.errorMap, function( message, name ) {
+					return {
+						message: message,
+						element: validator.findByName( name )[ 0 ]
+					};
+				} );
+
+				// Remove items from success list
 				this.successList = $.grep( this.successList, function( element ) {
 					return !( element.name in errors );
-				});
+				} );
 			}
 			if ( this.settings.showErrors ) {
 				this.settings.showErrors.call( this, this.errorMap, this.errorList );
@@ -462,19 +547,36 @@ $.extend( $.validator, {
 			}
 		},
 
-		// http://jqueryvalidation.org/Validator.resetForm/
+		// https://jqueryvalidation.org/Validator.resetForm/
 		resetForm: function() {
 			if ( $.fn.resetForm ) {
 				$( this.currentForm ).resetForm();
 			}
+			this.invalid = {};
 			this.submitted = {};
-			this.lastElement = null;
 			this.prepareForm();
 			this.hideErrors();
-			this.elements()
+			var elements = this.elements()
+				.removeData( "previousValue" )
+				.removeAttr( "aria-invalid" );
+
+			this.resetElements( elements );
+		},
+
+		resetElements: function( elements ) {
+			var i;
+
+			if ( this.settings.unhighlight ) {
+				for ( i = 0; elements[ i ]; i++ ) {
+					this.settings.unhighlight.call( this, elements[ i ],
+						this.settings.errorClass, "" );
+					this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
+				}
+			} else {
+				elements
 					.removeClass( this.settings.errorClass )
-					.removeData( "previousValue" )
-					.removeAttr( "aria-invalid" );
+					.removeClass( this.settings.validClass );
+			}
 		},
 
 		numberOfInvalids: function() {
@@ -486,7 +588,12 @@ $.extend( $.validator, {
 			var count = 0,
 				i;
 			for ( i in obj ) {
-				count++;
+
+				// This check allows counting elements with empty error
+				// message as invalid elements
+				if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
+					count++;
+				}
 			}
 			return count;
 		},
@@ -511,13 +618,15 @@ $.extend( $.validator, {
 		focusInvalid: function() {
 			if ( this.settings.focusInvalid ) {
 				try {
-					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
+					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
 					.filter( ":visible" )
-					.focus()
-					// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+					.trigger( "focus" )
+
+					// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
 					.trigger( "focusin" );
 				} catch ( e ) {
-					// ignore IE throwing errors when focusing hidden elements
+
+					// Ignore IE throwing errors when focusing hidden elements
 				}
 			}
 		},
@@ -526,31 +635,45 @@ $.extend( $.validator, {
 			var lastActive = this.lastActive;
 			return lastActive && $.grep( this.errorList, function( n ) {
 				return n.element.name === lastActive.name;
-			}).length === 1 && lastActive;
+			} ).length === 1 && lastActive;
 		},
 
 		elements: function() {
 			var validator = this,
 				rulesCache = {};
 
-			// select all valid inputs inside the form (no submit or reset buttons)
+			// Select all valid inputs inside the form (no submit or reset buttons)
 			return $( this.currentForm )
-			.find( "input, select, textarea" )
-			.not( ":submit, :reset, :image, [disabled], [readonly]" )
+			.find( "input, select, textarea, [contenteditable]" )
+			.not( ":submit, :reset, :image, :disabled" )
 			.not( this.settings.ignore )
 			.filter( function() {
-				if ( !this.name && validator.settings.debug && window.console ) {
+				var name = this.name || $( this ).attr( "name" ); // For contenteditable
+				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
+
+				if ( !name && validator.settings.debug && window.console ) {
 					console.error( "%o has no name assigned", this );
 				}
 
-				// select only the first element for each name, and only those with rules specified
-				if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
+				// Set form expando on contenteditable
+				if ( isContentEditable ) {
+					this.form = $( this ).closest( "form" )[ 0 ];
+					this.name = name;
+				}
+
+				// Ignore elements that belong to other/nested forms
+				if ( this.form !== validator.currentForm ) {
+					return false;
+				}
+
+				// Select only the first element for each name, and only those with rules specified
+				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
 					return false;
 				}
 
-				rulesCache[ this.name ] = true;
+				rulesCache[ name ] = true;
 				return true;
-			});
+			} );
 		},
 
 		clean: function( selector ) {
@@ -562,12 +685,16 @@ $.extend( $.validator, {
 			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
 		},
 
-		reset: function() {
+		resetInternals: function() {
 			this.successList = [];
 			this.errorList = [];
 			this.errorMap = {};
 			this.toShow = $( [] );
 			this.toHide = $( [] );
+		},
+
+		reset: function() {
+			this.resetInternals();
 			this.currentElements = $( [] );
 		},
 
@@ -582,19 +709,49 @@ $.extend( $.validator, {
 		},
 
 		elementValue: function( element ) {
-			var val,
-				$element = $( element ),
-				type = element.type;
+			var $element = $( element ),
+				type = element.type,
+				isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
+				val, idx;
 
 			if ( type === "radio" || type === "checkbox" ) {
-				return $( "input[name='" + element.name + "']:checked" ).val();
+				return this.findByName( element.name ).filter( ":checked" ).val();
 			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
-				return element.validity.badInput ? false : $element.val();
+				return element.validity.badInput ? "NaN" : $element.val();
+			}
+
+			if ( isContentEditable ) {
+				val = $element.text();
+			} else {
+				val = $element.val();
+			}
+
+			if ( type === "file" ) {
+
+				// Modern browser (chrome & safari)
+				if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
+					return val.substr( 12 );
+				}
+
+				// Legacy browsers
+				// Unix-based path
+				idx = val.lastIndexOf( "/" );
+				if ( idx >= 0 ) {
+					return val.substr( idx + 1 );
+				}
+
+				// Windows-based path
+				idx = val.lastIndexOf( "\\" );
+				if ( idx >= 0 ) {
+					return val.substr( idx + 1 );
+				}
+
+				// Just the file name
+				return val;
 			}
 
-			val = $element.val();
 			if ( typeof val === "string" ) {
-				return val.replace(/\r/g, "" );
+				return val.replace( /\r/g, "" );
 			}
 			return val;
 		},
@@ -605,18 +762,35 @@ $.extend( $.validator, {
 			var rules = $( element ).rules(),
 				rulesCount = $.map( rules, function( n, i ) {
 					return i;
-				}).length,
+				} ).length,
 				dependencyMismatch = false,
 				val = this.elementValue( element ),
-				result, method, rule;
+				result, method, rule, normalizer;
+
+			// Prioritize the local normalizer defined for this element over the global one
+			// if the former exists, otherwise user the global one in case it exists.
+			if ( typeof rules.normalizer === "function" ) {
+				normalizer = rules.normalizer;
+			} else if (	typeof this.settings.normalizer === "function" ) {
+				normalizer = this.settings.normalizer;
+			}
+
+			// If normalizer is defined, then call it to retreive the changed value instead
+			// of using the real one.
+			// Note that `this` in the normalizer is `element`.
+			if ( normalizer ) {
+				val = normalizer.call( element, val );
+
+				// Delete the normalizer from rules to avoid treating it as a pre-defined method.
+				delete rules.normalizer;
+			}
 
 			for ( method in rules ) {
 				rule = { method: method, parameters: rules[ method ] };
 				try {
-
 					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
 
-					// if a method indicates that the field is optional and therefore valid,
+					// If a method indicates that the field is optional and therefore valid,
 					// don't mark it as valid when there are no other rules
 					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
 						dependencyMismatch = true;
@@ -637,6 +811,10 @@ $.extend( $.validator, {
 					if ( this.settings.debug && window.console ) {
 						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
 					}
+					if ( e instanceof TypeError ) {
+						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
+					}
+
 					throw e;
 				}
 			}
@@ -649,7 +827,7 @@ $.extend( $.validator, {
 			return true;
 		},
 
-		// return the custom message for the given element and validation method
+		// Return the custom message for the given element and validation method
 		// specified in the element's HTML5 data attribute
 		// return the generic message if present and no method specific message is present
 		customDataMessage: function( element, method ) {
@@ -657,15 +835,15 @@ $.extend( $.validator, {
 				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
 		},
 
-		// return the custom message for the given element name and validation method
+		// Return the custom message for the given element name and validation method
 		customMessage: function( name, method ) {
 			var m = this.settings.messages[ name ];
-			return m && ( m.constructor === String ? m : m[ method ]);
+			return m && ( m.constructor === String ? m : m[ method ] );
 		},
 
-		// return the first defined argument, allowing empty strings
+		// Return the first defined argument, allowing empty strings
 		findDefined: function() {
-			for ( var i = 0; i < arguments.length; i++) {
+			for ( var i = 0; i < arguments.length; i++ ) {
 				if ( arguments[ i ] !== undefined ) {
 					return arguments[ i ];
 				}
@@ -673,30 +851,47 @@ $.extend( $.validator, {
 			return undefined;
 		},
 
-		defaultMessage: function( element, method ) {
-			return this.findDefined(
-				this.customMessage( element.name, method ),
-				this.customDataMessage( element, method ),
-				// title is never undefined, so handle empty string as undefined
-				!this.settings.ignoreTitle && element.title || undefined,
-				$.validator.messages[ method ],
-				"<strong>Warning: No message defined for " + element.name + "</strong>"
-			);
-		},
-
-		formatAndAdd: function( element, rule ) {
-			var message = this.defaultMessage( element, rule.method ),
+		// The second parameter 'rule' used to be a string, and extended to an object literal
+		// of the following form:
+		// rule = {
+		//     method: "method name",
+		//     parameters: "the given method parameters"
+		// }
+		//
+		// The old behavior still supported, kept to maintain backward compatibility with
+		// old code, and will be removed in the next major release.
+		defaultMessage: function( element, rule ) {
+			if ( typeof rule === "string" ) {
+				rule = { method: rule };
+			}
+
+			var message = this.findDefined(
+					this.customMessage( element.name, rule.method ),
+					this.customDataMessage( element, rule.method ),
+
+					// 'title' is never undefined, so handle empty string as undefined
+					!this.settings.ignoreTitle && element.title || undefined,
+					$.validator.messages[ rule.method ],
+					"<strong>Warning: No message defined for " + element.name + "</strong>"
+				),
 				theregex = /\$?\{(\d+)\}/g;
 			if ( typeof message === "function" ) {
 				message = message.call( this, rule.parameters, element );
 			} else if ( theregex.test( message ) ) {
 				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
 			}
-			this.errorList.push({
+
+			return message;
+		},
+
+		formatAndAdd: function( element, rule ) {
+			var message = this.defaultMessage( element, rule );
+
+			this.errorList.push( {
 				message: message,
 				element: element,
 				method: rule.method
-			});
+			} );
 
 			this.errorMap[ element.name ] = message;
 			this.submitted[ element.name ] = message;
@@ -741,23 +936,27 @@ $.extend( $.validator, {
 		},
 
 		invalidElements: function() {
-			return $( this.errorList ).map(function() {
+			return $( this.errorList ).map( function() {
 				return this.element;
-			});
+			} );
 		},
 
 		showLabel: function( element, message ) {
-			var place, group, errorID,
+			var place, group, errorID, v,
 				error = this.errorsFor( element ),
 				elementID = this.idOrName( element ),
 				describedBy = $( element ).attr( "aria-describedby" );
+
 			if ( error.length ) {
-				// refresh error/success class
+
+				// Refresh error/success class
 				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
-				// replace message on existing label
+
+				// Replace message on existing label
 				error.html( message );
 			} else {
-				// create error element
+
+				// Create error element
 				error = $( "<" + this.settings.errorElement + ">" )
 					.attr( "id", elementID + "-error" )
 					.addClass( this.settings.errorClass )
@@ -766,31 +965,35 @@ $.extend( $.validator, {
 				// Maintain reference to the element to be placed into the DOM
 				place = error;
 				if ( this.settings.wrapper ) {
-					// make sure the element is visible, even in IE
+
+					// Make sure the element is visible, even in IE
 					// actually showing the wrapped element is handled elsewhere
 					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
 				}
 				if ( this.labelContainer.length ) {
 					this.labelContainer.append( place );
 				} else if ( this.settings.errorPlacement ) {
-					this.settings.errorPlacement( place, $( element ) );
+					this.settings.errorPlacement.call( this, place, $( element ) );
 				} else {
 					place.insertAfter( element );
 				}
 
 				// Link error back to the element
 				if ( error.is( "label" ) ) {
+
 					// If the error is a label, then associate using 'for'
 					error.attr( "for", elementID );
-				} else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
+
 					// If the element is not a child of an associated label, then it's necessary
 					// to explicitly apply aria-describedby
+				} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
+					errorID = error.attr( "id" );
 
-					errorID = error.attr( "id" ).replace( /(:|\.|\[|\])/g, "\\$1");
 					// Respect existing non-error aria-describedby
 					if ( !describedBy ) {
 						describedBy = errorID;
-					} else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
+					} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
+
 						// Add to end of list if not already present
 						describedBy += " " + errorID;
 					}
@@ -799,12 +1002,13 @@ $.extend( $.validator, {
 					// If this element is grouped, then assign to all elements in the same group
 					group = this.groups[ element.name ];
 					if ( group ) {
-						$.each( this.groups, function( name, testgroup ) {
+						v = this;
+						$.each( v.groups, function( name, testgroup ) {
 							if ( testgroup === group ) {
-								$( "[name='" + name + "']", this.currentForm )
+								$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
 									.attr( "aria-describedby", error.attr( "id" ) );
 							}
-						});
+						} );
 					}
 				}
 			}
@@ -820,19 +1024,28 @@ $.extend( $.validator, {
 		},
 
 		errorsFor: function( element ) {
-			var name = this.idOrName( element ),
+			var name = this.escapeCssMeta( this.idOrName( element ) ),
 				describer = $( element ).attr( "aria-describedby" ),
 				selector = "label[for='" + name + "'], label[for='" + name + "'] *";
 
-			// aria-describedby should directly reference the error element
+			// 'aria-describedby' should directly reference the error element
 			if ( describer ) {
-				selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
+				selector = selector + ", #" + this.escapeCssMeta( describer )
+					.replace( /\s+/g, ", #" );
 			}
+
 			return this
 				.errors()
 				.filter( selector );
 		},
 
+		// See https://api.jquery.com/category/selectors/, for CSS
+		// meta-characters that should be escaped in order to be used with JQuery
+		// as a literal part of a name/id or any selector.
+		escapeCssMeta: function( string ) {
+			return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
+		},
+
 		idOrName: function( element ) {
 			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
 		},
@@ -853,7 +1066,7 @@ $.extend( $.validator, {
 		},
 
 		findByName: function( name ) {
-			return $( this.currentForm ).find( "[name='" + name + "']" );
+			return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
 		},
 
 		getLength: function( value, element ) {
@@ -869,7 +1082,7 @@ $.extend( $.validator, {
 		},
 
 		depend: function( param, element ) {
-			return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
+			return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
 		},
 
 		dependTypes: {
@@ -892,32 +1105,70 @@ $.extend( $.validator, {
 		startRequest: function( element ) {
 			if ( !this.pending[ element.name ] ) {
 				this.pendingRequest++;
+				$( element ).addClass( this.settings.pendingClass );
 				this.pending[ element.name ] = true;
 			}
 		},
 
 		stopRequest: function( element, valid ) {
 			this.pendingRequest--;
-			// sometimes synchronization fails, make sure pendingRequest is never < 0
+
+			// Sometimes synchronization fails, make sure pendingRequest is never < 0
 			if ( this.pendingRequest < 0 ) {
 				this.pendingRequest = 0;
 			}
 			delete this.pending[ element.name ];
+			$( element ).removeClass( this.settings.pendingClass );
 			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
 				$( this.currentForm ).submit();
+
+				// Remove the hidden input that was used as a replacement for the
+				// missing submit button. The hidden input is added by `handle()`
+				// to ensure that the value of the used submit button is passed on
+				// for scripted submits triggered by this method
+				if ( this.submitButton ) {
+					$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
+				}
+
 				this.formSubmitted = false;
-			} else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
+			} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
+				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
 				this.formSubmitted = false;
 			}
 		},
 
-		previousValue: function( element ) {
+		previousValue: function( element, method ) {
+			method = typeof method === "string" && method || "remote";
+
 			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
 				old: null,
 				valid: true,
-				message: this.defaultMessage( element, "remote" )
-			});
+				message: this.defaultMessage( element, { method: method } )
+			} );
+		},
+
+		// Cleans up all forms and elements, removes validator-specific events
+		destroy: function() {
+			this.resetForm();
+
+			$( this.currentForm )
+				.off( ".validate" )
+				.removeData( "validator" )
+				.find( ".validate-equalTo-blur" )
+					.off( ".validate-equalTo" )
+					.removeClass( "validate-equalTo-blur" )
+				.find( ".validate-lessThan-blur" )
+					.off( ".validate-lessThan" )
+					.removeClass( "validate-lessThan-blur" )
+				.find( ".validate-lessThanEqual-blur" )
+					.off( ".validate-lessThanEqual" )
+					.removeClass( "validate-lessThanEqual-blur" )
+				.find( ".validate-greaterThanEqual-blur" )
+					.off( ".validate-greaterThanEqual" )
+					.removeClass( "validate-greaterThanEqual-blur" )
+				.find( ".validate-greaterThan-blur" )
+					.off( ".validate-greaterThan" )
+					.removeClass( "validate-greaterThan-blur" );
 		}
 
 	},
@@ -948,13 +1199,36 @@ $.extend( $.validator, {
 		if ( classes ) {
 			$.each( classes.split( " " ), function() {
 				if ( this in $.validator.classRuleSettings ) {
-					$.extend( rules, $.validator.classRuleSettings[ this ]);
+					$.extend( rules, $.validator.classRuleSettings[ this ] );
 				}
-			});
+			} );
 		}
 		return rules;
 	},
 
+	normalizeAttributeRule: function( rules, type, method, value ) {
+
+		// Convert the value to a number for number inputs, and for text for backwards compability
+		// allows type="date" and others to be compared as strings
+		if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
+			value = Number( value );
+
+			// Support Opera Mini, which returns NaN for undefined minlength
+			if ( isNaN( value ) ) {
+				value = undefined;
+			}
+		}
+
+		if ( value || value === 0 ) {
+			rules[ method ] = value;
+		} else if ( type === method && type !== "range" ) {
+
+			// Exception: the jquery validate 'range' method
+			// does not test for the html5 'range' type
+			rules[ method ] = true;
+		}
+	},
+
 	attributeRules: function( element ) {
 		var rules = {},
 			$element = $( element ),
@@ -963,36 +1237,26 @@ $.extend( $.validator, {
 
 		for ( method in $.validator.methods ) {
 
-			// support for <input required> in both html5 and older browsers
+			// Support for <input required> in both html5 and older browsers
 			if ( method === "required" ) {
 				value = element.getAttribute( method );
+
 				// Some browsers return an empty string for the required attribute
 				// and non-HTML5 browsers might have required="" markup
 				if ( value === "" ) {
 					value = true;
 				}
-				// force non-HTML5 browsers to return bool
+
+				// Force non-HTML5 browsers to return bool
 				value = !!value;
 			} else {
 				value = $element.attr( method );
 			}
 
-			// convert the value to a number for number inputs, and for text for backwards compability
-			// allows type="date" and others to be compared as strings
-			if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
-				value = Number( value );
-			}
-
-			if ( value || value === 0 ) {
-				rules[ method ] = value;
-			} else if ( type === method && type !== "range" ) {
-				// exception: the jquery validate 'range' method
-				// does not test for the html5 'range' type
-				rules[ method ] = true;
-			}
+			this.normalizeAttributeRule( rules, type, method, value );
 		}
 
-		// maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
+		// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
 		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
 			delete rules.maxlength;
 		}
@@ -1001,13 +1265,20 @@ $.extend( $.validator, {
 	},
 
 	dataRules: function( element ) {
-		var method, value,
-			rules = {}, $element = $( element );
+		var rules = {},
+			$element = $( element ),
+			type = element.getAttribute( "type" ),
+			method, value;
+
 		for ( method in $.validator.methods ) {
 			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
-			if ( value !== undefined ) {
-				rules[ method ] = value;
+
+			// Cast empty attributes like `data-rule-required` to `true`
+			if ( value === "" ) {
+				value = true;
 			}
+
+			this.normalizeAttributeRule( rules, type, method, value );
 		}
 		return rules;
 	},
@@ -1023,9 +1294,11 @@ $.extend( $.validator, {
 	},
 
 	normalizeRules: function( rules, element ) {
-		// handle dependency check
+
+		// Handle dependency check
 		$.each( rules, function( prop, val ) {
-			// ignore rule when param is explicitly false, eg. required:false
+
+			// Ignore rule when param is explicitly false, eg. required:false
 			if ( val === false ) {
 				delete rules[ prop ];
 				return;
@@ -1043,36 +1316,38 @@ $.extend( $.validator, {
 				if ( keepRule ) {
 					rules[ prop ] = val.param !== undefined ? val.param : true;
 				} else {
+					$.data( element.form, "validator" ).resetElements( $( element ) );
 					delete rules[ prop ];
 				}
 			}
-		});
+		} );
 
-		// evaluate parameters
+		// Evaluate parameters
 		$.each( rules, function( rule, parameter ) {
-			rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
-		});
+			rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
+		} );
 
-		// clean number parameters
-		$.each([ "minlength", "maxlength" ], function() {
+		// Clean number parameters
+		$.each( [ "minlength", "maxlength" ], function() {
 			if ( rules[ this ] ) {
 				rules[ this ] = Number( rules[ this ] );
 			}
-		});
-		$.each([ "rangelength", "range" ], function() {
+		} );
+		$.each( [ "rangelength", "range" ], function() {
 			var parts;
 			if ( rules[ this ] ) {
 				if ( $.isArray( rules[ this ] ) ) {
-					rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
+					rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
 				} else if ( typeof rules[ this ] === "string" ) {
-					parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
-					rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
+					parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
+					rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
 				}
 			}
-		});
+		} );
 
 		if ( $.validator.autoCreateRanges ) {
-			// auto-create ranges
+
+			// Auto-create ranges
 			if ( rules.min != null && rules.max != null ) {
 				rules.range = [ rules.min, rules.max ];
 				delete rules.min;
@@ -1094,13 +1369,13 @@ $.extend( $.validator, {
 			var transformed = {};
 			$.each( data.split( /\s/ ), function() {
 				transformed[ this ] = true;
-			});
+			} );
 			data = transformed;
 		}
 		return data;
 	},
 
-	// http://jqueryvalidation.org/jQuery.validator.addMethod/
+	// https://jqueryvalidation.org/jQuery.validator.addMethod/
 	addMethod: function( name, method, message ) {
 		$.validator.methods[ name ] = method;
 		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
@@ -1109,172 +1384,198 @@ $.extend( $.validator, {
 		}
 	},
 
+	// https://jqueryvalidation.org/jQuery.validator.methods/
 	methods: {
 
-		// http://jqueryvalidation.org/required-method/
+		// https://jqueryvalidation.org/required-method/
 		required: function( value, element, param ) {
-			// check if dependency is met
+
+			// Check if dependency is met
 			if ( !this.depend( param, element ) ) {
 				return "dependency-mismatch";
 			}
 			if ( element.nodeName.toLowerCase() === "select" ) {
-				// could be an array for select-multiple or a string, both are fine this way
+
+				// Could be an array for select-multiple or a string, both are fine this way
 				var val = $( element ).val();
 				return val && val.length > 0;
 			}
 			if ( this.checkable( element ) ) {
 				return this.getLength( value, element ) > 0;
 			}
-			return $.trim( value ).length > 0;
+			return value !== undefined && value !== null && value.length > 0;
 		},
 
-		// http://jqueryvalidation.org/email-method/
+		// https://jqueryvalidation.org/email-method/
 		email: function( value, element ) {
-			// From http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29
+
+			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
 			// Retrieved 2014-01-14
 			// If you have a problem with this implementation, report a bug against the above spec
 			// Or use custom methods to implement your own email validation
 			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/url-method/
+		// https://jqueryvalidation.org/url-method/
 		url: function( value, element ) {
-			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
-			return this.optional( element ) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
-		},
 
-		// http://jqueryvalidation.org/date-method/
-		date: function( value, element ) {
-			return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
+			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
+			// https://gist.github.com/dperini/729294
+			// see also https://mathiasbynens.be/demo/url-regex
+			// modified to allow protocol-relative URLs
+			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
 		},
 
-		// http://jqueryvalidation.org/dateISO-method/
+		// https://jqueryvalidation.org/date-method/
+		date: ( function() {
+			var called = false;
+
+			return function( value, element ) {
+				if ( !called ) {
+					called = true;
+					if ( this.settings.debug && window.console ) {
+						console.warn(
+							"The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
+							"Please don't use it, since it relies on the Date constructor, which\n" +
+							"behaves very differently across browsers and locales. Use `dateISO`\n" +
+							"instead or one of the locale specific methods in `localizations/`\n" +
+							"and `additional-methods.js`."
+						);
+					}
+				}
+
+				return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
+			};
+		}() ),
+
+		// https://jqueryvalidation.org/dateISO-method/
 		dateISO: function( value, element ) {
 			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/number-method/
+		// https://jqueryvalidation.org/number-method/
 		number: function( value, element ) {
-			return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
+			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/digits-method/
+		// https://jqueryvalidation.org/digits-method/
 		digits: function( value, element ) {
 			return this.optional( element ) || /^\d+$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/creditcard-method/
-		// based on http://en.wikipedia.org/wiki/Luhn/
-		creditcard: function( value, element ) {
-			if ( this.optional( element ) ) {
-				return "dependency-mismatch";
-			}
-			// accept only spaces, digits and dashes
-			if ( /[^0-9 \-]+/.test( value ) ) {
-				return false;
-			}
-			var nCheck = 0,
-				nDigit = 0,
-				bEven = false,
-				n, cDigit;
-
-			value = value.replace( /\D/g, "" );
-
-			// Basing min and max length on
-			// http://developer.ean.com/general_info/Valid_Credit_Card_Types
-			if ( value.length < 13 || value.length > 19 ) {
-				return false;
-			}
-
-			for ( n = value.length - 1; n >= 0; n--) {
-				cDigit = value.charAt( n );
-				nDigit = parseInt( cDigit, 10 );
-				if ( bEven ) {
-					if ( ( nDigit *= 2 ) > 9 ) {
-						nDigit -= 9;
-					}
-				}
-				nCheck += nDigit;
-				bEven = !bEven;
-			}
-
-			return ( nCheck % 10 ) === 0;
-		},
-
-		// http://jqueryvalidation.org/minlength-method/
+		// https://jqueryvalidation.org/minlength-method/
 		minlength: function( value, element, param ) {
 			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
 			return this.optional( element ) || length >= param;
 		},
 
-		// http://jqueryvalidation.org/maxlength-method/
+		// https://jqueryvalidation.org/maxlength-method/
 		maxlength: function( value, element, param ) {
 			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
 			return this.optional( element ) || length <= param;
 		},
 
-		// http://jqueryvalidation.org/rangelength-method/
+		// https://jqueryvalidation.org/rangelength-method/
 		rangelength: function( value, element, param ) {
 			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
 			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
 		},
 
-		// http://jqueryvalidation.org/min-method/
+		// https://jqueryvalidation.org/min-method/
 		min: function( value, element, param ) {
 			return this.optional( element ) || value >= param;
 		},
 
-		// http://jqueryvalidation.org/max-method/
+		// https://jqueryvalidation.org/max-method/
 		max: function( value, element, param ) {
 			return this.optional( element ) || value <= param;
 		},
 
-		// http://jqueryvalidation.org/range-method/
+		// https://jqueryvalidation.org/range-method/
 		range: function( value, element, param ) {
 			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
 		},
 
-		// http://jqueryvalidation.org/equalTo-method/
+		// https://jqueryvalidation.org/step-method/
+		step: function( value, element, param ) {
+			var type = $( element ).attr( "type" ),
+				errorMessage = "Step attribute on input type " + type + " is not supported.",
+				supportedTypes = [ "text", "number", "range" ],
+				re = new RegExp( "\\b" + type + "\\b" ),
+				notSupported = type && !re.test( supportedTypes.join() ),
+				decimalPlaces = function( num ) {
+					var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
+					if ( !match ) {
+						return 0;
+					}
+
+					// Number of digits right of decimal point.
+					return match[ 1 ] ? match[ 1 ].length : 0;
+				},
+				toInt = function( num ) {
+					return Math.round( num * Math.pow( 10, decimals ) );
+				},
+				valid = true,
+				decimals;
+
+			// Works only for text, number and range input types
+			// TODO find a way to support input types date, datetime, datetime-local, month, time and week
+			if ( notSupported ) {
+				throw new Error( errorMessage );
+			}
+
+			decimals = decimalPlaces( param );
+
+			// Value can't have too many decimals
+			if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
+				valid = false;
+			}
+
+			return this.optional( element ) || valid;
+		},
+
+		// https://jqueryvalidation.org/equalTo-method/
 		equalTo: function( value, element, param ) {
-			// bind to the blur event of the target in order to revalidate whenever the target field is updated
-			// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
+
+			// Bind to the blur event of the target in order to revalidate whenever the target field is updated
 			var target = $( param );
-			if ( this.settings.onfocusout ) {
-				target.unbind( ".validate-equalTo" ).bind( "blur.validate-equalTo", function() {
+			if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
+				target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
 					$( element ).valid();
-				});
+				} );
 			}
 			return value === target.val();
 		},
 
-		// http://jqueryvalidation.org/remote-method/
-		remote: function( value, element, param ) {
+		// https://jqueryvalidation.org/remote-method/
+		remote: function( value, element, param, method ) {
 			if ( this.optional( element ) ) {
 				return "dependency-mismatch";
 			}
 
-			var previous = this.previousValue( element ),
-				validator, data;
+			method = typeof method === "string" && method || "remote";
 
-			if (!this.settings.messages[ element.name ] ) {
+			var previous = this.previousValue( element, method ),
+				validator, data, optionDataString;
+
+			if ( !this.settings.messages[ element.name ] ) {
 				this.settings.messages[ element.name ] = {};
 			}
-			previous.originalMessage = this.settings.messages[ element.name ].remote;
-			this.settings.messages[ element.name ].remote = previous.message;
+			previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
+			this.settings.messages[ element.name ][ method ] = previous.message;
 
 			param = typeof param === "string" && { url: param } || param;
-
-			if ( previous.old === value ) {
+			optionDataString = $.param( $.extend( { data: value }, param.data ) );
+			if ( previous.old === optionDataString ) {
 				return previous.valid;
 			}
 
-			previous.old = value;
+			previous.old = optionDataString;
 			validator = this;
 			this.startRequest( element );
 			data = {};
 			data[ element.name ] = value;
 			$.ajax( $.extend( true, {
-				url: param,
 				mode: "abort",
 				port: "validate" + element.name,
 				dataType: "json",
@@ -1284,18 +1585,19 @@ $.extend( $.validator, {
 					var valid = response === true || response === "true",
 						errors, message, submitted;
 
-					validator.settings.messages[ element.name ].remote = previous.originalMessage;
+					validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
 					if ( valid ) {
 						submitted = validator.formSubmitted;
-						validator.prepareElement( element );
+						validator.resetInternals();
+						validator.toHide = validator.errorsFor( element );
 						validator.formSubmitted = submitted;
 						validator.successList.push( element );
-						delete validator.invalid[ element.name ];
+						validator.invalid[ element.name ] = false;
 						validator.showErrors();
 					} else {
 						errors = {};
-						message = response || validator.defaultMessage( element, "remote" );
-						errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
+						message = response || validator.defaultMessage( element, { method: method, parameters: value } );
+						errors[ element.name ] = previous.message = message;
 						validator.invalid[ element.name ] = true;
 						validator.showErrors( errors );
 					}
@@ -1305,61 +1607,44 @@ $.extend( $.validator, {
 			}, param ) );
 			return "pending";
 		}
-
 	}
 
-});
+} );
 
-$.format = function deprecated() {
-	throw "$.format has been deprecated. Please use $.validator.format instead.";
-};
-
-// ajax mode: abort
+// Ajax mode: abort
 // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
 // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
 
 var pendingRequests = {},
 	ajax;
+
 // Use a prefilter if available (1.5+)
 if ( $.ajaxPrefilter ) {
-	$.ajaxPrefilter(function( settings, _, xhr ) {
+	$.ajaxPrefilter( function( settings, _, xhr ) {
 		var port = settings.port;
 		if ( settings.mode === "abort" ) {
-			if ( pendingRequests[port] ) {
-				pendingRequests[port].abort();
+			if ( pendingRequests[ port ] ) {
+				pendingRequests[ port ].abort();
 			}
-			pendingRequests[port] = xhr;
+			pendingRequests[ port ] = xhr;
 		}
-	});
+	} );
 } else {
+
 	// Proxy ajax
 	ajax = $.ajax;
 	$.ajax = function( settings ) {
 		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
 			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
 		if ( mode === "abort" ) {
-			if ( pendingRequests[port] ) {
-				pendingRequests[port].abort();
+			if ( pendingRequests[ port ] ) {
+				pendingRequests[ port ].abort();
 			}
-			pendingRequests[port] = ajax.apply(this, arguments);
-			return pendingRequests[port];
+			pendingRequests[ port ] = ajax.apply( this, arguments );
+			return pendingRequests[ port ];
 		}
-		return ajax.apply(this, arguments);
+		return ajax.apply( this, arguments );
 	};
 }
-
-// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
-// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
-
-$.extend($.fn, {
-	validateDelegate: function( delegate, type, handler ) {
-		return this.bind(type, function( event ) {
-			var target = $(event.target);
-			if ( target.is(delegate) ) {
-				return handler.apply(target, arguments);
-			}
-		});
-	}
-});
-
+return $;
 }));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/jquery.validate.min.js b/civicrm/bower_components/jquery-validation/dist/jquery.validate.min.js
index 3a8cdb2da4..7bc947fbc0 100644
--- a/civicrm/bower_components/jquery-validation/dist/jquery.validate.min.js
+++ b/civicrm/bower_components/jquery-validation/dist/jquery.validate.min.js
@@ -1,4 +1,4 @@
-/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014
- * http://jqueryvalidation.org/
- * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.validateDelegate(":submit","click",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(b.target).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(b.target).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.submit(function(b){function d(){var d,e;return c.settings.submitHandler?(c.submitButton&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e?e:!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c;return a(this[0]).is("form")?b=this.validate().form():(b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b})),b},removeAttrs:function(b){var c={},d=this;return a.each(b.split(/\s/),function(a,b){c[b]=d.attr(b),d.removeAttr(b)}),c},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(a,b){(9!==b.which||""!==this.elementValue(a))&&(a.name in this.submitted||a===this.lastElement)&&this.element(a)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!this.is(e.ignore)&&e[d].call(c,this[0],b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']","focusin focusout keyup",b).validateDelegate("select, option, [type='radio'], [type='checkbox']","click",b),this.settings.invalidHandler&&a(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue").removeAttr("aria-invalid")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled], [readonly]").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?a("input[name='"+b.name+"']:checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a];return void 0},defaultMessage:function(b,c){return this.findDefined(this.customMessage(b.name,c),this.customDataMessage(b,c),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c],"<strong>Warning: No message defined for "+b.name+"</strong>")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id").replace(/(:|\.|\[|\])/g,"\\$1"),i?i.match(new RegExp("\\b"+f+"\\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),/min|max/.test(c)&&(null===g||/number|range|text/.test(g))&&(d=Number(d)),d||0===d?e[c]=d:g===c&&"range"!==g&&(e[c]=!0);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b);for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),void 0!==d&&(e[c]=d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:a.trim(b).length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{url:d,mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}}),a.format=function(){throw"$.format has been deprecated. Please use $.validator.format instead."};var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a.extend(a.fn,{validateDelegate:function(b,c,d){return this.bind(c,function(c){var e=a(c.target);return e.is(b)?d.apply(e,arguments):void 0})}})});
\ No newline at end of file
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=".  Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ar.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ar.js
new file mode 100644
index 0000000000..c58f8bf6c7
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ar.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: AR (Arabic; العربية)
+ */
+$.extend( $.validator.messages, {
+	required: "هذا الحقل إلزامي",
+	remote: "يرجى تصحيح هذا الحقل للمتابعة",
+	email: "رجاء إدخال عنوان بريد إلكتروني صحيح",
+	url: "رجاء إدخال عنوان موقع إلكتروني صحيح",
+	date: "رجاء إدخال تاريخ صحيح",
+	dateISO: "رجاء إدخال تاريخ صحيح (ISO)",
+	number: "رجاء إدخال عدد بطريقة صحيحة",
+	digits: "رجاء إدخال أرقام فقط",
+	creditcard: "رجاء إدخال رقم بطاقة ائتمان صحيح",
+	equalTo: "رجاء إدخال نفس القيمة",
+	extension: "رجاء إدخال ملف بامتداد موافق عليه",
+	maxlength: $.validator.format( "الحد الأقصى لعدد الحروف هو {0}" ),
+	minlength: $.validator.format( "الحد الأدنى لعدد الحروف هو {0}" ),
+	rangelength: $.validator.format( "عدد الحروف يجب أن يكون بين {0} و {1}" ),
+	range: $.validator.format( "رجاء إدخال عدد قيمته بين {0} و {1}" ),
+	max: $.validator.format( "رجاء إدخال عدد أقل من أو يساوي {0}" ),
+	min: $.validator.format( "رجاء إدخال عدد أكبر من أو يساوي {0}" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ar.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ar.min.js
new file mode 100644
index 0000000000..9da3f2c4cd
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ar.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"هذا الحقل إلزامي",remote:"يرجى تصحيح هذا الحقل للمتابعة",email:"رجاء إدخال عنوان بريد إلكتروني صحيح",url:"رجاء إدخال عنوان موقع إلكتروني صحيح",date:"رجاء إدخال تاريخ صحيح",dateISO:"رجاء إدخال تاريخ صحيح (ISO)",number:"رجاء إدخال عدد بطريقة صحيحة",digits:"رجاء إدخال أرقام فقط",creditcard:"رجاء إدخال رقم بطاقة ائتمان صحيح",equalTo:"رجاء إدخال نفس القيمة",extension:"رجاء إدخال ملف بامتداد موافق عليه",maxlength:a.validator.format("الحد الأقصى لعدد الحروف هو {0}"),minlength:a.validator.format("الحد الأدنى لعدد الحروف هو {0}"),rangelength:a.validator.format("عدد الحروف يجب أن يكون بين {0} و {1}"),range:a.validator.format("رجاء إدخال عدد قيمته بين {0} و {1}"),max:a.validator.format("رجاء إدخال عدد أقل من أو يساوي {0}"),min:a.validator.format("رجاء إدخال عدد أكبر من أو يساوي {0}")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_az.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_az.js
new file mode 100644
index 0000000000..3cd9723a5c
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_az.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: Az (Azeri; azərbaycan dili)
+ */
+$.extend( $.validator.messages, {
+	required: "Bu xana mütləq doldurulmalıdır.",
+	remote: "Zəhmət olmasa, düzgün məna daxil edin.",
+	email: "Zəhmət olmasa, düzgün elektron poçt daxil edin.",
+	url: "Zəhmət olmasa, düzgün URL daxil edin.",
+	date: "Zəhmət olmasa, düzgün tarix daxil edin.",
+	dateISO: "Zəhmət olmasa, düzgün ISO formatlı tarix daxil edin.",
+	number: "Zəhmət olmasa, düzgün rəqəm daxil edin.",
+	digits: "Zəhmət olmasa, yalnız rəqəm daxil edin.",
+	creditcard: "Zəhmət olmasa, düzgün kredit kart nömrəsini daxil edin.",
+	equalTo: "Zəhmət olmasa, eyni mənanı bir daha daxil edin.",
+	extension: "Zəhmət olmasa, düzgün genişlənməyə malik faylı seçin.",
+	maxlength: $.validator.format( "Zəhmət olmasa, {0} simvoldan çox olmayaraq daxil edin." ),
+	minlength: $.validator.format( "Zəhmət olmasa, {0} simvoldan az olmayaraq daxil edin." ),
+	rangelength: $.validator.format( "Zəhmət olmasa, {0} - {1} aralığında uzunluğa malik simvol daxil edin." ),
+	range: $.validator.format( "Zəhmət olmasa, {0} - {1} aralığında rəqəm daxil edin." ),
+	max: $.validator.format( "Zəhmət olmasa, {0} və ondan kiçik rəqəm daxil edin." ),
+	min: $.validator.format( "Zəhmət olmasa, {0} və ondan böyük rəqəm daxil edin" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_az.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_az.min.js
new file mode 100644
index 0000000000..141c84b7f1
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_az.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Bu xana mütləq doldurulmalıdır.",remote:"Zəhmət olmasa, düzgün məna daxil edin.",email:"Zəhmət olmasa, düzgün elektron poçt daxil edin.",url:"Zəhmət olmasa, düzgün URL daxil edin.",date:"Zəhmət olmasa, düzgün tarix daxil edin.",dateISO:"Zəhmət olmasa, düzgün ISO formatlı tarix daxil edin.",number:"Zəhmət olmasa, düzgün rəqəm daxil edin.",digits:"Zəhmət olmasa, yalnız rəqəm daxil edin.",creditcard:"Zəhmət olmasa, düzgün kredit kart nömrəsini daxil edin.",equalTo:"Zəhmət olmasa, eyni mənanı bir daha daxil edin.",extension:"Zəhmət olmasa, düzgün genişlənməyə malik faylı seçin.",maxlength:a.validator.format("Zəhmət olmasa, {0} simvoldan çox olmayaraq daxil edin."),minlength:a.validator.format("Zəhmət olmasa, {0} simvoldan az olmayaraq daxil edin."),rangelength:a.validator.format("Zəhmət olmasa, {0} - {1} aralığında uzunluğa malik simvol daxil edin."),range:a.validator.format("Zəhmət olmasa, {0} - {1} aralığında rəqəm daxil edin."),max:a.validator.format("Zəhmət olmasa, {0} və ondan kiçik rəqəm daxil edin."),min:a.validator.format("Zəhmət olmasa, {0} və ondan böyük rəqəm daxil edin")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_bg.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_bg.js
new file mode 100644
index 0000000000..c725eeadb5
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_bg.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: BG (Bulgarian; български език)
+ */
+$.extend( $.validator.messages, {
+	required: "Полето е задължително.",
+	remote: "Моля, въведете правилната стойност.",
+	email: "Моля, въведете валиден email.",
+	url: "Моля, въведете валидно URL.",
+	date: "Моля, въведете валидна дата.",
+	dateISO: "Моля, въведете валидна дата (ISO).",
+	number: "Моля, въведете валиден номер.",
+	digits: "Моля, въведете само цифри.",
+	creditcard: "Моля, въведете валиден номер на кредитна карта.",
+	equalTo: "Моля, въведете същата стойност отново.",
+	extension: "Моля, въведете стойност с валидно разширение.",
+	maxlength: $.validator.format( "Моля, въведете не повече от {0} символа." ),
+	minlength: $.validator.format( "Моля, въведете поне {0} символа." ),
+	rangelength: $.validator.format( "Моля, въведете стойност с дължина между {0} и {1} символа." ),
+	range: $.validator.format( "Моля, въведете стойност между {0} и {1}." ),
+	max: $.validator.format( "Моля, въведете стойност по-малка или равна на {0}." ),
+	min: $.validator.format( "Моля, въведете стойност по-голяма или равна на {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_bg.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_bg.min.js
new file mode 100644
index 0000000000..3755541e8e
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_bg.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Полето е задължително.",remote:"Моля, въведете правилната стойност.",email:"Моля, въведете валиден email.",url:"Моля, въведете валидно URL.",date:"Моля, въведете валидна дата.",dateISO:"Моля, въведете валидна дата (ISO).",number:"Моля, въведете валиден номер.",digits:"Моля, въведете само цифри.",creditcard:"Моля, въведете валиден номер на кредитна карта.",equalTo:"Моля, въведете същата стойност отново.",extension:"Моля, въведете стойност с валидно разширение.",maxlength:a.validator.format("Моля, въведете не повече от {0} символа."),minlength:a.validator.format("Моля, въведете поне {0} символа."),rangelength:a.validator.format("Моля, въведете стойност с дължина между {0} и {1} символа."),range:a.validator.format("Моля, въведете стойност между {0} и {1}."),max:a.validator.format("Моля, въведете стойност по-малка или равна на {0}."),min:a.validator.format("Моля, въведете стойност по-голяма или равна на {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.js
new file mode 100644
index 0000000000..44c7b6777d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: bn_BD (Bengali, Bangladesh)
+ */
+$.extend( $.validator.messages, {
+	required: "এই তথ্যটি আবশ্যক।",
+	remote: "এই তথ্যটি ঠিক করুন।",
+	email: "অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",
+	url: "অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",
+	date: "তারিখ সঠিক নয়।",
+	dateISO: "অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",
+	number: "অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",
+	digits: "এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",
+	creditcard: "অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",
+	equalTo: "একই মান আবার লিখুন।",
+	extension: "সঠিক ধরনের ফাইল আপলোড করুন।",
+	maxlength: $.validator.format( "{0}টির বেশি অক্ষর লেখা যাবে না।" ),
+	minlength: $.validator.format( "{0}টির কম অক্ষর লেখা যাবে না।" ),
+	rangelength: $.validator.format( "{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।" ),
+	range: $.validator.format( "{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।" ),
+	max: $.validator.format( "অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।" ),
+	min: $.validator.format( "অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.min.js
new file mode 100644
index 0000000000..2f447f540d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_bn_BD.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"এই তথ্যটি আবশ্যক।",remote:"এই তথ্যটি ঠিক করুন।",email:"অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",url:"অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",date:"তারিখ সঠিক নয়।",dateISO:"অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",number:"অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",digits:"এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",creditcard:"অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",equalTo:"একই মান আবার লিখুন।",extension:"সঠিক ধরনের ফাইল আপলোড করুন।",maxlength:a.validator.format("{0}টির বেশি অক্ষর লেখা যাবে না।"),minlength:a.validator.format("{0}টির কম অক্ষর লেখা যাবে না।"),rangelength:a.validator.format("{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।"),range:a.validator.format("{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।"),max:a.validator.format("অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।"),min:a.validator.format("অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ca.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ca.js
new file mode 100644
index 0000000000..cd6c59663f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ca.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: CA (Catalan; català)
+ */
+$.extend( $.validator.messages, {
+	required: "Aquest camp és obligatori.",
+	remote: "Si us plau, omple aquest camp.",
+	email: "Si us plau, escriu una adreça de correu-e vàlida",
+	url: "Si us plau, escriu una URL vàlida.",
+	date: "Si us plau, escriu una data vàlida.",
+	dateISO: "Si us plau, escriu una data (ISO) vàlida.",
+	number: "Si us plau, escriu un número enter vàlid.",
+	digits: "Si us plau, escriu només dígits.",
+	creditcard: "Si us plau, escriu un número de tarjeta vàlid.",
+	equalTo: "Si us plau, escriu el mateix valor de nou.",
+	extension: "Si us plau, escriu un valor amb una extensió acceptada.",
+	maxlength: $.validator.format( "Si us plau, no escriguis més de {0} caracters." ),
+	minlength: $.validator.format( "Si us plau, no escriguis menys de {0} caracters." ),
+	rangelength: $.validator.format( "Si us plau, escriu un valor entre {0} i {1} caracters." ),
+	range: $.validator.format( "Si us plau, escriu un valor entre {0} i {1}." ),
+	max: $.validator.format( "Si us plau, escriu un valor menor o igual a {0}." ),
+	min: $.validator.format( "Si us plau, escriu un valor major o igual a {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ca.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ca.min.js
new file mode 100644
index 0000000000..905c9a3107
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ca.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Aquest camp és obligatori.",remote:"Si us plau, omple aquest camp.",email:"Si us plau, escriu una adreça de correu-e vàlida",url:"Si us plau, escriu una URL vàlida.",date:"Si us plau, escriu una data vàlida.",dateISO:"Si us plau, escriu una data (ISO) vàlida.",number:"Si us plau, escriu un número enter vàlid.",digits:"Si us plau, escriu només dígits.",creditcard:"Si us plau, escriu un número de tarjeta vàlid.",equalTo:"Si us plau, escriu el mateix valor de nou.",extension:"Si us plau, escriu un valor amb una extensió acceptada.",maxlength:a.validator.format("Si us plau, no escriguis més de {0} caracters."),minlength:a.validator.format("Si us plau, no escriguis menys de {0} caracters."),rangelength:a.validator.format("Si us plau, escriu un valor entre {0} i {1} caracters."),range:a.validator.format("Si us plau, escriu un valor entre {0} i {1}."),max:a.validator.format("Si us plau, escriu un valor menor o igual a {0}."),min:a.validator.format("Si us plau, escriu un valor major o igual a {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_cs.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_cs.js
new file mode 100644
index 0000000000..2ab4b51668
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_cs.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: CS (Czech; čeština, český jazyk)
+ */
+$.extend( $.validator.messages, {
+	required: "Tento údaj je povinný.",
+	remote: "Prosím, opravte tento údaj.",
+	email: "Prosím, zadejte platný e-mail.",
+	url: "Prosím, zadejte platné URL.",
+	date: "Prosím, zadejte platné datum.",
+	dateISO: "Prosím, zadejte platné datum (ISO).",
+	number: "Prosím, zadejte číslo.",
+	digits: "Prosím, zadávejte pouze číslice.",
+	creditcard: "Prosím, zadejte číslo kreditní karty.",
+	equalTo: "Prosím, zadejte znovu stejnou hodnotu.",
+	extension: "Prosím, zadejte soubor se správnou příponou.",
+	maxlength: $.validator.format( "Prosím, zadejte nejvíce {0} znaků." ),
+	minlength: $.validator.format( "Prosím, zadejte nejméně {0} znaků." ),
+	rangelength: $.validator.format( "Prosím, zadejte od {0} do {1} znaků." ),
+	range: $.validator.format( "Prosím, zadejte hodnotu od {0} do {1}." ),
+	max: $.validator.format( "Prosím, zadejte hodnotu menší nebo rovnu {0}." ),
+	min: $.validator.format( "Prosím, zadejte hodnotu větší nebo rovnu {0}." ),
+	step: $.validator.format( "Musí být násobkem čísla {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_cs.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_cs.min.js
new file mode 100644
index 0000000000..3e12762585
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_cs.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Tento údaj je povinný.",remote:"Prosím, opravte tento údaj.",email:"Prosím, zadejte platný e-mail.",url:"Prosím, zadejte platné URL.",date:"Prosím, zadejte platné datum.",dateISO:"Prosím, zadejte platné datum (ISO).",number:"Prosím, zadejte číslo.",digits:"Prosím, zadávejte pouze číslice.",creditcard:"Prosím, zadejte číslo kreditní karty.",equalTo:"Prosím, zadejte znovu stejnou hodnotu.",extension:"Prosím, zadejte soubor se správnou příponou.",maxlength:a.validator.format("Prosím, zadejte nejvíce {0} znaků."),minlength:a.validator.format("Prosím, zadejte nejméně {0} znaků."),rangelength:a.validator.format("Prosím, zadejte od {0} do {1} znaků."),range:a.validator.format("Prosím, zadejte hodnotu od {0} do {1}."),max:a.validator.format("Prosím, zadejte hodnotu menší nebo rovnu {0}."),min:a.validator.format("Prosím, zadejte hodnotu větší nebo rovnu {0}."),step:a.validator.format("Musí být násobkem čísla {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_da.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_da.js
new file mode 100644
index 0000000000..302775c0fb
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_da.js
@@ -0,0 +1,46 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: DA (Danish; dansk)
+ */
+$.extend( $.validator.messages, {
+	required: "Dette felt er påkrævet.",
+	remote: "Ret venligst dette felt",
+	email: "Indtast en gyldig email-adresse.",
+	url: "Indtast en gyldig URL.",
+	date: "Indtast en gyldig dato.",
+	number: "Indtast et tal.",
+	digits: "Indtast kun cifre.",
+	creditcard: "Indtast et gyldigt kreditkortnummer.",
+	equalTo: "Indtast den samme værdi igen.",
+	time: "Angiv en gyldig tid mellem kl. 00:00 og 23:59.",
+	ipv4: "Angiv venligst en gyldig IPv4-adresse.",
+	ipv6: "Angiv venligst en gyldig IPv6-adresse.",
+	require_from_group:  $.validator.format( "Angiv mindst {0} af disse felter." ),
+	extension: "Indtast venligst en værdi med en gyldig endelse",
+	pattern: "Ugyldigt format",
+	lettersonly: "Angiv venligst kun bogstaver.",
+	nowhitespace: "MÃ¥ ikke indholde mellemrum",
+	maxlength: $.validator.format( "Indtast højst {0} tegn." ),
+	minlength: $.validator.format( "Indtast mindst {0} tegn." ),
+	rangelength: $.validator.format( "Indtast mindst {0} og højst {1} tegn." ),
+	range: $.validator.format( "Angiv en værdi mellem {0} og {1}." ),
+	max: $.validator.format( "Angiv en værdi der højst er {0}." ),
+	min: $.validator.format( "Angiv en værdi der mindst er {0}." ),
+	minWords: $.validator.format( "Indtast venligst mindst {0} ord" ),
+	maxWords:  $.validator.format( "Indtast venligst højst {0} ord" ),
+	step: $.validator.format( "Angiv en værdi gange {0}." ),
+	notEqualTo: "Angiv en anden værdi, værdierne må ikke være det samme.",
+	integer: "Angiv et ikke-decimaltal, der er positivt eller negativt."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_da.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_da.min.js
new file mode 100644
index 0000000000..cdd590d425
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_da.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Dette felt er påkrævet.",remote:"Ret venligst dette felt",email:"Indtast en gyldig email-adresse.",url:"Indtast en gyldig URL.",date:"Indtast en gyldig dato.",number:"Indtast et tal.",digits:"Indtast kun cifre.",creditcard:"Indtast et gyldigt kreditkortnummer.",equalTo:"Indtast den samme værdi igen.",time:"Angiv en gyldig tid mellem kl. 00:00 og 23:59.",ipv4:"Angiv venligst en gyldig IPv4-adresse.",ipv6:"Angiv venligst en gyldig IPv6-adresse.",require_from_group:a.validator.format("Angiv mindst {0} af disse felter."),extension:"Indtast venligst en værdi med en gyldig endelse",pattern:"Ugyldigt format",lettersonly:"Angiv venligst kun bogstaver.",nowhitespace:"Må ikke indholde mellemrum",maxlength:a.validator.format("Indtast højst {0} tegn."),minlength:a.validator.format("Indtast mindst {0} tegn."),rangelength:a.validator.format("Indtast mindst {0} og højst {1} tegn."),range:a.validator.format("Angiv en værdi mellem {0} og {1}."),max:a.validator.format("Angiv en værdi der højst er {0}."),min:a.validator.format("Angiv en værdi der mindst er {0}."),minWords:a.validator.format("Indtast venligst mindst {0} ord"),maxWords:a.validator.format("Indtast venligst højst {0} ord"),step:a.validator.format("Angiv en værdi gange {0}."),notEqualTo:"Angiv en anden værdi, værdierne må ikke være det samme.",integer:"Angiv et ikke-decimaltal, der er positivt eller negativt."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_de.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_de.js
new file mode 100644
index 0000000000..611c16f71f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_de.js
@@ -0,0 +1,82 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: DE (German, Deutsch)
+ */
+$.extend( $.validator.messages, {
+	required: "Dieses Feld ist ein Pflichtfeld.",
+	maxlength: $.validator.format( "Geben Sie bitte maximal {0} Zeichen ein." ),
+	minlength: $.validator.format( "Geben Sie bitte mindestens {0} Zeichen ein." ),
+	rangelength: $.validator.format( "Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein." ),
+	email: "Geben Sie bitte eine gültige E-Mail-Adresse ein.",
+	url: "Geben Sie bitte eine gültige URL ein.",
+	date: "Geben Sie bitte ein gültiges Datum ein.",
+	number: "Geben Sie bitte eine Nummer ein.",
+	digits: "Geben Sie bitte nur Ziffern ein.",
+	equalTo: "Wiederholen Sie bitte denselben Wert.",
+	range: $.validator.format( "Geben Sie bitte einen Wert zwischen {0} und {1} ein." ),
+	max: $.validator.format( "Geben Sie bitte einen Wert kleiner oder gleich {0} ein." ),
+	min: $.validator.format( "Geben Sie bitte einen Wert größer oder gleich {0} ein." ),
+	creditcard: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein.",
+	remote: "Korrigieren Sie bitte dieses Feld.",
+	dateISO: "Geben Sie bitte ein gültiges Datum ein (ISO-Format).",
+	step: $.validator.format( "Geben Sie bitte ein Vielfaches von {0} ein." ),
+	maxWords: $.validator.format( "Geben Sie bitte {0} Wörter oder weniger ein." ),
+	minWords: $.validator.format( "Geben Sie bitte mindestens {0} Wörter ein." ),
+	rangeWords: $.validator.format( "Geben Sie bitte zwischen {0} und {1} Wörtern ein." ),
+	accept: "Geben Sie bitte einen Wert mit einem gültigen MIME-Typ ein.",
+	alphanumeric: "Geben Sie bitte nur Buchstaben (keine Umlaute), Zahlen oder Unterstriche ein.",
+	bankaccountNL: "Geben Sie bitte eine gültige Kontonummer ein.",
+	bankorgiroaccountNL: "Geben Sie bitte eine gültige Bank- oder Girokontonummer ein.",
+	bic: "Geben Sie bitte einen gültigen BIC-Code ein.",
+	cifES: "Geben Sie bitte eine gültige CIF-Nummer ein.",
+	cpfBR: "Geben Sie bitte eine gültige CPF-Nummer ein.",
+	creditcardtypes: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein.",
+	currency: "Geben Sie bitte eine gültige Währung ein.",
+	extension: "Geben Sie bitte einen Wert mit einer gültigen Erweiterung ein.",
+	giroaccountNL: "Geben Sie bitte eine gültige Girokontonummer ein.",
+	iban: "Geben Sie bitte eine gültige IBAN ein.",
+	integer:  "Geben Sie bitte eine positive oder negative Nicht-Dezimalzahl ein.",
+	ipv4: "Geben Sie bitte eine gültige IPv4-Adresse ein.",
+	ipv6: "Geben Sie bitte eine gültige IPv6-Adresse ein.",
+	lettersonly: "Geben Sie bitte nur Buchstaben ein.",
+	letterswithbasicpunc: "Geben Sie bitte nur Buchstaben oder Interpunktion ein.",
+	mobileNL: "Geben Sie bitte eine gültige Handynummer ein.",
+	mobileUK: "Geben Sie bitte eine gültige Handynummer ein.",
+	netmask:  "Geben Sie bitte eine gültige Netzmaske ein.",
+	nieES: "Geben Sie bitte eine gültige NIE-Nummer ein.",
+	nifES: "Geben Sie bitte eine gültige NIF-Nummer ein.",
+	nipPL: "Geben Sie bitte eine gültige NIP-Nummer ein.",
+	notEqualTo: "Geben Sie bitte einen anderen Wert ein. Die Werte dürfen nicht gleich sein.",
+	nowhitespace: "Kein Leerzeichen bitte.",
+	pattern: "Ungültiges Format.",
+	phoneNL: "Geben Sie bitte eine gültige Telefonnummer ein.",
+	phonesUK: "Geben Sie bitte eine gültige britische Telefonnummer ein.",
+	phoneUK: "Geben Sie bitte eine gültige Telefonnummer ein.",
+	phoneUS: "Geben Sie bitte eine gültige Telefonnummer ein.",
+	postalcodeBR: "Geben Sie bitte eine gültige brasilianische Postleitzahl ein.",
+	postalCodeCA: "Geben Sie bitte eine gültige kanadische Postleitzahl ein.",
+	postalcodeIT: "Geben Sie bitte eine gültige italienische Postleitzahl ein.",
+	postalcodeNL: "Geben Sie bitte eine gültige niederländische Postleitzahl ein.",
+	postcodeUK: "Geben Sie bitte eine gültige britische Postleitzahl ein.",
+	require_from_group: $.validator.format( "Füllen Sie bitte mindestens {0} dieser Felder aus." ),
+	skip_or_fill_minimum: $.validator.format( "Überspringen Sie bitte diese Felder oder füllen Sie mindestens {0} von ihnen aus." ),
+	stateUS: "Geben Sie bitte einen gültigen US-Bundesstaat ein.",
+	strippedminlength: $.validator.format( "Geben Sie bitte mindestens {0} Zeichen ein." ),
+	time: "Geben Sie bitte eine gültige Uhrzeit zwischen 00:00 und 23:59 ein.",
+	time12h: "Geben Sie bitte eine gültige Uhrzeit im 12-Stunden-Format ein.",
+	vinUS: "Die angegebene Fahrzeugidentifikationsnummer (VIN) ist ungültig.",
+	zipcodeUS: "Die angegebene US-Postleitzahl ist ungültig.",
+	ziprange: "Ihre Postleitzahl muss im Bereich 902xx-xxxx bis 905xx-xxxx liegen."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_de.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_de.min.js
new file mode 100644
index 0000000000..3046f472d4
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_de.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Dieses Feld ist ein Pflichtfeld.",maxlength:a.validator.format("Geben Sie bitte maximal {0} Zeichen ein."),minlength:a.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),rangelength:a.validator.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),email:"Geben Sie bitte eine gültige E-Mail-Adresse ein.",url:"Geben Sie bitte eine gültige URL ein.",date:"Geben Sie bitte ein gültiges Datum ein.",number:"Geben Sie bitte eine Nummer ein.",digits:"Geben Sie bitte nur Ziffern ein.",equalTo:"Wiederholen Sie bitte denselben Wert.",range:a.validator.format("Geben Sie bitte einen Wert zwischen {0} und {1} ein."),max:a.validator.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),min:a.validator.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),creditcard:"Geben Sie bitte eine gültige Kreditkarten-Nummer ein.",remote:"Korrigieren Sie bitte dieses Feld.",dateISO:"Geben Sie bitte ein gültiges Datum ein (ISO-Format).",step:a.validator.format("Geben Sie bitte ein Vielfaches von {0} ein."),maxWords:a.validator.format("Geben Sie bitte {0} Wörter oder weniger ein."),minWords:a.validator.format("Geben Sie bitte mindestens {0} Wörter ein."),rangeWords:a.validator.format("Geben Sie bitte zwischen {0} und {1} Wörtern ein."),accept:"Geben Sie bitte einen Wert mit einem gültigen MIME-Typ ein.",alphanumeric:"Geben Sie bitte nur Buchstaben (keine Umlaute), Zahlen oder Unterstriche ein.",bankaccountNL:"Geben Sie bitte eine gültige Kontonummer ein.",bankorgiroaccountNL:"Geben Sie bitte eine gültige Bank- oder Girokontonummer ein.",bic:"Geben Sie bitte einen gültigen BIC-Code ein.",cifES:"Geben Sie bitte eine gültige CIF-Nummer ein.",cpfBR:"Geben Sie bitte eine gültige CPF-Nummer ein.",creditcardtypes:"Geben Sie bitte eine gültige Kreditkarten-Nummer ein.",currency:"Geben Sie bitte eine gültige Währung ein.",extension:"Geben Sie bitte einen Wert mit einer gültigen Erweiterung ein.",giroaccountNL:"Geben Sie bitte eine gültige Girokontonummer ein.",iban:"Geben Sie bitte eine gültige IBAN ein.",integer:"Geben Sie bitte eine positive oder negative Nicht-Dezimalzahl ein.",ipv4:"Geben Sie bitte eine gültige IPv4-Adresse ein.",ipv6:"Geben Sie bitte eine gültige IPv6-Adresse ein.",lettersonly:"Geben Sie bitte nur Buchstaben ein.",letterswithbasicpunc:"Geben Sie bitte nur Buchstaben oder Interpunktion ein.",mobileNL:"Geben Sie bitte eine gültige Handynummer ein.",mobileUK:"Geben Sie bitte eine gültige Handynummer ein.",netmask:"Geben Sie bitte eine gültige Netzmaske ein.",nieES:"Geben Sie bitte eine gültige NIE-Nummer ein.",nifES:"Geben Sie bitte eine gültige NIF-Nummer ein.",nipPL:"Geben Sie bitte eine gültige NIP-Nummer ein.",notEqualTo:"Geben Sie bitte einen anderen Wert ein. Die Werte dürfen nicht gleich sein.",nowhitespace:"Kein Leerzeichen bitte.",pattern:"Ungültiges Format.",phoneNL:"Geben Sie bitte eine gültige Telefonnummer ein.",phonesUK:"Geben Sie bitte eine gültige britische Telefonnummer ein.",phoneUK:"Geben Sie bitte eine gültige Telefonnummer ein.",phoneUS:"Geben Sie bitte eine gültige Telefonnummer ein.",postalcodeBR:"Geben Sie bitte eine gültige brasilianische Postleitzahl ein.",postalCodeCA:"Geben Sie bitte eine gültige kanadische Postleitzahl ein.",postalcodeIT:"Geben Sie bitte eine gültige italienische Postleitzahl ein.",postalcodeNL:"Geben Sie bitte eine gültige niederländische Postleitzahl ein.",postcodeUK:"Geben Sie bitte eine gültige britische Postleitzahl ein.",require_from_group:a.validator.format("Füllen Sie bitte mindestens {0} dieser Felder aus."),skip_or_fill_minimum:a.validator.format("Überspringen Sie bitte diese Felder oder füllen Sie mindestens {0} von ihnen aus."),stateUS:"Geben Sie bitte einen gültigen US-Bundesstaat ein.",strippedminlength:a.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),time:"Geben Sie bitte eine gültige Uhrzeit zwischen 00:00 und 23:59 ein.",time12h:"Geben Sie bitte eine gültige Uhrzeit im 12-Stunden-Format ein.",vinUS:"Die angegebene Fahrzeugidentifikationsnummer (VIN) ist ungültig.",zipcodeUS:"Die angegebene US-Postleitzahl ist ungültig.",ziprange:"Ihre Postleitzahl muss im Bereich 902xx-xxxx bis 905xx-xxxx liegen."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_el.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_el.js
new file mode 100644
index 0000000000..f2dc9e9dcc
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_el.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: EL (Greek; ελληνικά)
+ */
+$.extend( $.validator.messages, {
+	required: "Αυτό το πεδίο είναι υποχρεωτικό.",
+	remote: "Παρακαλώ διορθώστε αυτό το πεδίο.",
+	email: "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",
+	url: "Παρακαλώ εισάγετε ένα έγκυρο URL.",
+	date: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",
+	dateISO: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",
+	number: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",
+	digits: "Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",
+	creditcard: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",
+	equalTo: "Παρακαλώ εισάγετε την ίδια τιμή ξανά.",
+	extension: "Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",
+	maxlength: $.validator.format( "Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες." ),
+	minlength: $.validator.format( "Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες." ),
+	rangelength: $.validator.format( "Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων." ),
+	range: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}." ),
+	max: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}." ),
+	min: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_el.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_el.min.js
new file mode 100644
index 0000000000..daaa2aaa0b
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_el.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Αυτό το πεδίο είναι υποχρεωτικό.",remote:"Παρακαλώ διορθώστε αυτό το πεδίο.",email:"Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",url:"Παρακαλώ εισάγετε ένα έγκυρο URL.",date:"Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",dateISO:"Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",number:"Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",digits:"Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",creditcard:"Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",equalTo:"Παρακαλώ εισάγετε την ίδια τιμή ξανά.",extension:"Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",maxlength:a.validator.format("Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες."),minlength:a.validator.format("Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες."),rangelength:a.validator.format("Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων."),range:a.validator.format("Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}."),max:a.validator.format("Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}."),min:a.validator.format("Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_es.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_es.js
new file mode 100644
index 0000000000..4829dc23a7
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_es.js
@@ -0,0 +1,38 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ */
+$.extend( $.validator.messages, {
+	required: "Este campo es obligatorio.",
+	remote: "Por favor, rellena este campo.",
+	email: "Por favor, escribe una dirección de correo válida.",
+	url: "Por favor, escribe una URL válida.",
+	date: "Por favor, escribe una fecha válida.",
+	dateISO: "Por favor, escribe una fecha (ISO) válida.",
+	number: "Por favor, escribe un número válido.",
+	digits: "Por favor, escribe sólo dígitos.",
+	creditcard: "Por favor, escribe un número de tarjeta válido.",
+	equalTo: "Por favor, escribe el mismo valor de nuevo.",
+	extension: "Por favor, escribe un valor con una extensión aceptada.",
+	maxlength: $.validator.format( "Por favor, no escribas más de {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, no escribas menos de {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, escribe un valor entre {0} y {1} caracteres." ),
+	range: $.validator.format( "Por favor, escribe un valor entre {0} y {1}." ),
+	max: $.validator.format( "Por favor, escribe un valor menor o igual a {0}." ),
+	min: $.validator.format( "Por favor, escribe un valor mayor o igual a {0}." ),
+	nifES: "Por favor, escribe un NIF válido.",
+	nieES: "Por favor, escribe un NIE válido.",
+	cifES: "Por favor, escribe un CIF válido."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_es.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_es.min.js
new file mode 100644
index 0000000000..d16a9a8922
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_es.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, rellena este campo.",email:"Por favor, escribe una dirección de correo válida.",url:"Por favor, escribe una URL válida.",date:"Por favor, escribe una fecha válida.",dateISO:"Por favor, escribe una fecha (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe sólo dígitos.",creditcard:"Por favor, escribe un número de tarjeta válido.",equalTo:"Por favor, escribe el mismo valor de nuevo.",extension:"Por favor, escribe un valor con una extensión aceptada.",maxlength:a.validator.format("Por favor, no escribas más de {0} caracteres."),minlength:a.validator.format("Por favor, no escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} y {1}."),max:a.validator.format("Por favor, escribe un valor menor o igual a {0}."),min:a.validator.format("Por favor, escribe un valor mayor o igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.js
new file mode 100644
index 0000000000..aa15bf494e
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ * Region: AR (Argentina)
+ */
+$.extend( $.validator.messages, {
+	required: "Este campo es obligatorio.",
+	remote: "Por favor, completá este campo.",
+	email: "Por favor, escribí una dirección de correo válida.",
+	url: "Por favor, escribí una URL válida.",
+	date: "Por favor, escribí una fecha válida.",
+	dateISO: "Por favor, escribí una fecha (ISO) válida.",
+	number: "Por favor, escribí un número entero válido.",
+	digits: "Por favor, escribí sólo dígitos.",
+	creditcard: "Por favor, escribí un número de tarjeta válido.",
+	equalTo: "Por favor, escribí el mismo valor de nuevo.",
+	extension: "Por favor, escribí un valor con una extensión aceptada.",
+	maxlength: $.validator.format( "Por favor, no escribas más de {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, no escribas menos de {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, escribí un valor entre {0} y {1} caracteres." ),
+	range: $.validator.format( "Por favor, escribí un valor entre {0} y {1}." ),
+	max: $.validator.format( "Por favor, escribí un valor menor o igual a {0}." ),
+	min: $.validator.format( "Por favor, escribí un valor mayor o igual a {0}." ),
+	nifES: "Por favor, escribí un NIF válido.",
+	nieES: "Por favor, escribí un NIE válido.",
+	cifES: "Por favor, escribí un CIF válido."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.min.js
new file mode 100644
index 0000000000..314e84d1b8
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_AR.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, completá este campo.",email:"Por favor, escribí una dirección de correo válida.",url:"Por favor, escribí una URL válida.",date:"Por favor, escribí una fecha válida.",dateISO:"Por favor, escribí una fecha (ISO) válida.",number:"Por favor, escribí un número entero válido.",digits:"Por favor, escribí sólo dígitos.",creditcard:"Por favor, escribí un número de tarjeta válido.",equalTo:"Por favor, escribí el mismo valor de nuevo.",extension:"Por favor, escribí un valor con una extensión aceptada.",maxlength:a.validator.format("Por favor, no escribas más de {0} caracteres."),minlength:a.validator.format("Por favor, no escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribí un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escribí un valor entre {0} y {1}."),max:a.validator.format("Por favor, escribí un valor menor o igual a {0}."),min:a.validator.format("Por favor, escribí un valor mayor o igual a {0}."),nifES:"Por favor, escribí un NIF válido.",nieES:"Por favor, escribí un NIE válido.",cifES:"Por favor, escribí un CIF válido."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.js
new file mode 100644
index 0000000000..1d9e388273
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ * Region: PE (Perú)
+ */
+$.extend( $.validator.messages, {
+	required: "Este campo es obligatorio.",
+	remote: "Por favor, llene este campo.",
+	email: "Por favor, escriba un correo electrónico válido.",
+	url: "Por favor, escriba una URL válida.",
+	date: "Por favor, escriba una fecha válida.",
+	dateISO: "Por favor, escriba una fecha (ISO) válida.",
+	number: "Por favor, escriba un número válido.",
+	digits: "Por favor, escriba sólo dígitos.",
+	creditcard: "Por favor, escriba un número de tarjeta válido.",
+	equalTo: "Por favor, escriba el mismo valor de nuevo.",
+	extension: "Por favor, escriba un valor con una extensión permitida.",
+	maxlength: $.validator.format( "Por favor, no escriba más de {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, no escriba menos de {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, escriba un valor entre {0} y {1} caracteres." ),
+	range: $.validator.format( "Por favor, escriba un valor entre {0} y {1}." ),
+	max: $.validator.format( "Por favor, escriba un valor menor o igual a {0}." ),
+	min: $.validator.format( "Por favor, escriba un valor mayor o igual a {0}." ),
+	nifES: "Por favor, escriba un NIF válido.",
+	nieES: "Por favor, escriba un NIE válido.",
+	cifES: "Por favor, escriba un CIF válido."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.min.js
new file mode 100644
index 0000000000..2cfa53da8f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_es_PE.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, llene este campo.",email:"Por favor, escriba un correo electrónico válido.",url:"Por favor, escriba una URL válida.",date:"Por favor, escriba una fecha válida.",dateISO:"Por favor, escriba una fecha (ISO) válida.",number:"Por favor, escriba un número válido.",digits:"Por favor, escriba sólo dígitos.",creditcard:"Por favor, escriba un número de tarjeta válido.",equalTo:"Por favor, escriba el mismo valor de nuevo.",extension:"Por favor, escriba un valor con una extensión permitida.",maxlength:a.validator.format("Por favor, no escriba más de {0} caracteres."),minlength:a.validator.format("Por favor, no escriba menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escriba un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escriba un valor entre {0} y {1}."),max:a.validator.format("Por favor, escriba un valor menor o igual a {0}."),min:a.validator.format("Por favor, escriba un valor mayor o igual a {0}."),nifES:"Por favor, escriba un NIF válido.",nieES:"Por favor, escriba un NIE válido.",cifES:"Por favor, escriba un CIF válido."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_et.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_et.js
new file mode 100644
index 0000000000..3fc27885d2
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_et.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ET (Estonian; eesti, eesti keel)
+ */
+$.extend( $.validator.messages, {
+	required: "See väli peab olema täidetud.",
+	maxlength: $.validator.format( "Palun sisestage vähem kui {0} tähemärki." ),
+	minlength: $.validator.format( "Palun sisestage vähemalt {0} tähemärki." ),
+	rangelength: $.validator.format( "Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki." ),
+	email: "Palun sisestage korrektne e-maili aadress.",
+	url: "Palun sisestage korrektne URL.",
+	date: "Palun sisestage korrektne kuupäev.",
+	dateISO: "Palun sisestage korrektne kuupäev (YYYY-MM-DD).",
+	number: "Palun sisestage korrektne number.",
+	digits: "Palun sisestage ainult numbreid.",
+	equalTo: "Palun sisestage sama väärtus uuesti.",
+	range: $.validator.format( "Palun sisestage väärtus vahemikus {0} kuni {1}." ),
+	max: $.validator.format( "Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}." ),
+	min: $.validator.format( "Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}." ),
+	creditcard: "Palun sisestage korrektne krediitkaardi number."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_et.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_et.min.js
new file mode 100644
index 0000000000..c4e26b917c
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_et.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"See väli peab olema täidetud.",maxlength:a.validator.format("Palun sisestage vähem kui {0} tähemärki."),minlength:a.validator.format("Palun sisestage vähemalt {0} tähemärki."),rangelength:a.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki."),email:"Palun sisestage korrektne e-maili aadress.",url:"Palun sisestage korrektne URL.",date:"Palun sisestage korrektne kuupäev.",dateISO:"Palun sisestage korrektne kuupäev (YYYY-MM-DD).",number:"Palun sisestage korrektne number.",digits:"Palun sisestage ainult numbreid.",equalTo:"Palun sisestage sama väärtus uuesti.",range:a.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1}."),max:a.validator.format("Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}."),min:a.validator.format("Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}."),creditcard:"Palun sisestage korrektne krediitkaardi number."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_eu.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_eu.js
new file mode 100644
index 0000000000..6a36df851f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_eu.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: EU (Basque; euskara, euskera)
+ */
+$.extend( $.validator.messages, {
+	required: "Eremu hau beharrezkoa da.",
+	remote: "Mesedez, bete eremu hau.",
+	email: "Mesedez, idatzi baliozko posta helbide bat.",
+	url: "Mesedez, idatzi baliozko URL bat.",
+	date: "Mesedez, idatzi baliozko data bat.",
+	dateISO: "Mesedez, idatzi baliozko (ISO) data bat.",
+	number: "Mesedez, idatzi baliozko zenbaki oso bat.",
+	digits: "Mesedez, idatzi digituak soilik.",
+	creditcard: "Mesedez, idatzi baliozko txartel zenbaki bat.",
+	equalTo: "Mesedez, idatzi berdina berriro ere.",
+	extension: "Mesedez, idatzi onartutako luzapena duen balio bat.",
+	maxlength: $.validator.format( "Mesedez, ez idatzi {0} karaktere baino gehiago." ),
+	minlength: $.validator.format( "Mesedez, ez idatzi {0} karaktere baino gutxiago." ),
+	rangelength: $.validator.format( "Mesedez, idatzi {0} eta {1} karaktere arteko balio bat." ),
+	range: $.validator.format( "Mesedez, idatzi {0} eta {1} arteko balio bat." ),
+	max: $.validator.format( "Mesedez, idatzi {0} edo txikiagoa den balio bat." ),
+	min: $.validator.format( "Mesedez, idatzi {0} edo handiagoa den balio bat." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_eu.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_eu.min.js
new file mode 100644
index 0000000000..1d4a0e7173
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_eu.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Eremu hau beharrezkoa da.",remote:"Mesedez, bete eremu hau.",email:"Mesedez, idatzi baliozko posta helbide bat.",url:"Mesedez, idatzi baliozko URL bat.",date:"Mesedez, idatzi baliozko data bat.",dateISO:"Mesedez, idatzi baliozko (ISO) data bat.",number:"Mesedez, idatzi baliozko zenbaki oso bat.",digits:"Mesedez, idatzi digituak soilik.",creditcard:"Mesedez, idatzi baliozko txartel zenbaki bat.",equalTo:"Mesedez, idatzi berdina berriro ere.",extension:"Mesedez, idatzi onartutako luzapena duen balio bat.",maxlength:a.validator.format("Mesedez, ez idatzi {0} karaktere baino gehiago."),minlength:a.validator.format("Mesedez, ez idatzi {0} karaktere baino gutxiago."),rangelength:a.validator.format("Mesedez, idatzi {0} eta {1} karaktere arteko balio bat."),range:a.validator.format("Mesedez, idatzi {0} eta {1} arteko balio bat."),max:a.validator.format("Mesedez, idatzi {0} edo txikiagoa den balio bat."),min:a.validator.format("Mesedez, idatzi {0} edo handiagoa den balio bat.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_fa.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_fa.js
new file mode 100644
index 0000000000..0f5283b34a
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_fa.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: FA (Persian; فارسی)
+ */
+$.extend( $.validator.messages, {
+	required: "تکمیل این فیلد اجباری است.",
+	remote: "لطفا این فیلد را تصحیح کنید.",
+	email: "لطفا یک ایمیل صحیح وارد کنید.",
+	url: "لطفا آدرس صحیح وارد کنید.",
+	date: "لطفا تاریخ صحیح وارد کنید.",
+	dateFA: "لطفا یک تاریخ صحیح وارد کنید.",
+	dateISO: "لطفا تاریخ صحیح وارد کنید (ISO).",
+	number: "لطفا عدد صحیح وارد کنید.",
+	digits: "لطفا تنها رقم وارد کنید.",
+	creditcard: "لطفا کریدیت کارت صحیح وارد کنید.",
+	equalTo: "لطفا مقدار برابری وارد کنید.",
+	extension: "لطفا مقداری وارد کنید که",
+	alphanumeric: "لطفا مقدار را عدد (انگلیسی) وارد کنید.",
+	maxlength: $.validator.format( "لطفا بیشتر از {0} حرف وارد نکنید." ),
+	minlength: $.validator.format( "لطفا کمتر از {0} حرف وارد نکنید." ),
+	rangelength: $.validator.format( "لطفا مقداری بین {0} تا {1} حرف وارد کنید." ),
+	range: $.validator.format( "لطفا مقداری بین {0} تا {1} حرف وارد کنید." ),
+	max: $.validator.format( "لطفا مقداری کمتر از {0} وارد کنید." ),
+	min: $.validator.format( "لطفا مقداری بیشتر از {0} وارد کنید." ),
+	minWords: $.validator.format( "لطفا حداقل {0} کلمه وارد کنید." ),
+	maxWords: $.validator.format( "لطفا حداکثر {0} کلمه وارد کنید." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_fa.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_fa.min.js
new file mode 100644
index 0000000000..1ca3881eed
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_fa.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"تکمیل این فیلد اجباری است.",remote:"لطفا این فیلد را تصحیح کنید.",email:"لطفا یک ایمیل صحیح وارد کنید.",url:"لطفا آدرس صحیح وارد کنید.",date:"لطفا تاریخ صحیح وارد کنید.",dateFA:"لطفا یک تاریخ صحیح وارد کنید.",dateISO:"لطفا تاریخ صحیح وارد کنید (ISO).",number:"لطفا عدد صحیح وارد کنید.",digits:"لطفا تنها رقم وارد کنید.",creditcard:"لطفا کریدیت کارت صحیح وارد کنید.",equalTo:"لطفا مقدار برابری وارد کنید.",extension:"لطفا مقداری وارد کنید که",alphanumeric:"لطفا مقدار را عدد (انگلیسی) وارد کنید.",maxlength:a.validator.format("لطفا بیشتر از {0} حرف وارد نکنید."),minlength:a.validator.format("لطفا کمتر از {0} حرف وارد نکنید."),rangelength:a.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),range:a.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),max:a.validator.format("لطفا مقداری کمتر از {0} وارد کنید."),min:a.validator.format("لطفا مقداری بیشتر از {0} وارد کنید."),minWords:a.validator.format("لطفا حداقل {0} کلمه وارد کنید."),maxWords:a.validator.format("لطفا حداکثر {0} کلمه وارد کنید.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_fi.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_fi.js
new file mode 100644
index 0000000000..ab5887b072
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_fi.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: FI (Finnish; suomi, suomen kieli)
+ */
+$.extend( $.validator.messages, {
+	required: "T&auml;m&auml; kentt&auml; on pakollinen.",
+	email: "Sy&ouml;t&auml; oikea s&auml;hk&ouml;postiosoite.",
+	url: "Sy&ouml;t&auml; oikea URL-osoite.",
+	date: "Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml;.",
+	dateISO: "Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; muodossa VVVV-KK-PP.",
+	number: "Sy&ouml;t&auml; luku.",
+	creditcard: "Sy&ouml;t&auml; voimassa oleva luottokorttinumero.",
+	digits: "Sy&ouml;t&auml; pelk&auml;st&auml;&auml;n numeroita.",
+	equalTo: "Sy&ouml;t&auml; sama arvo uudestaan.",
+	maxlength: $.validator.format( "Voit sy&ouml;tt&auml;&auml; enint&auml;&auml;n {0} merkki&auml;." ),
+	minlength: $.validator.format( "V&auml;hint&auml;&auml;n {0} merkki&auml;." ),
+	rangelength: $.validator.format( "Sy&ouml;t&auml; v&auml;hint&auml;&auml;n {0} ja enint&auml;&auml;n {1} merkki&auml;." ),
+	range: $.validator.format( "Sy&ouml;t&auml; arvo v&auml;lilt&auml; {0}&ndash;{1}." ),
+	max: $.validator.format( "Sy&ouml;t&auml; arvo, joka on enint&auml;&auml;n {0}." ),
+	min: $.validator.format( "Sy&ouml;t&auml; arvo, joka on v&auml;hint&auml;&auml;n {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_fi.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_fi.min.js
new file mode 100644
index 0000000000..fd84e4c7d4
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_fi.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"T&auml;m&auml; kentt&auml; on pakollinen.",email:"Sy&ouml;t&auml; oikea s&auml;hk&ouml;postiosoite.",url:"Sy&ouml;t&auml; oikea URL-osoite.",date:"Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml;.",dateISO:"Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; muodossa VVVV-KK-PP.",number:"Sy&ouml;t&auml; luku.",creditcard:"Sy&ouml;t&auml; voimassa oleva luottokorttinumero.",digits:"Sy&ouml;t&auml; pelk&auml;st&auml;&auml;n numeroita.",equalTo:"Sy&ouml;t&auml; sama arvo uudestaan.",maxlength:a.validator.format("Voit sy&ouml;tt&auml;&auml; enint&auml;&auml;n {0} merkki&auml;."),minlength:a.validator.format("V&auml;hint&auml;&auml;n {0} merkki&auml;."),rangelength:a.validator.format("Sy&ouml;t&auml; v&auml;hint&auml;&auml;n {0} ja enint&auml;&auml;n {1} merkki&auml;."),range:a.validator.format("Sy&ouml;t&auml; arvo v&auml;lilt&auml; {0}&ndash;{1}."),max:a.validator.format("Sy&ouml;t&auml; arvo, joka on enint&auml;&auml;n {0}."),min:a.validator.format("Sy&ouml;t&auml; arvo, joka on v&auml;hint&auml;&auml;n {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_fr.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_fr.js
new file mode 100644
index 0000000000..e9f18364fe
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_fr.js
@@ -0,0 +1,63 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: FR (French; français)
+ */
+$.extend( $.validator.messages, {
+	required: "Ce champ est obligatoire.",
+	remote: "Veuillez corriger ce champ.",
+	email: "Veuillez fournir une adresse électronique valide.",
+	url: "Veuillez fournir une adresse URL valide.",
+	date: "Veuillez fournir une date valide.",
+	dateISO: "Veuillez fournir une date valide (ISO).",
+	number: "Veuillez fournir un numéro valide.",
+	digits: "Veuillez fournir seulement des chiffres.",
+	creditcard: "Veuillez fournir un numéro de carte de crédit valide.",
+	equalTo: "Veuillez fournir encore la même valeur.",
+	notEqualTo: "Veuillez fournir une valeur différente, les valeurs ne doivent pas être identiques.",
+	extension: "Veuillez fournir une valeur avec une extension valide.",
+	maxlength: $.validator.format( "Veuillez fournir au plus {0} caractères." ),
+	minlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
+	rangelength: $.validator.format( "Veuillez fournir une valeur qui contient entre {0} et {1} caractères." ),
+	range: $.validator.format( "Veuillez fournir une valeur entre {0} et {1}." ),
+	max: $.validator.format( "Veuillez fournir une valeur inférieure ou égale à {0}." ),
+	min: $.validator.format( "Veuillez fournir une valeur supérieure ou égale à {0}." ),
+	step: $.validator.format( "Veuillez fournir une valeur multiple de {0}." ),
+	maxWords: $.validator.format( "Veuillez fournir au plus {0} mots." ),
+	minWords: $.validator.format( "Veuillez fournir au moins {0} mots." ),
+	rangeWords: $.validator.format( "Veuillez fournir entre {0} et {1} mots." ),
+	letterswithbasicpunc: "Veuillez fournir seulement des lettres et des signes de ponctuation.",
+	alphanumeric: "Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",
+	lettersonly: "Veuillez fournir seulement des lettres.",
+	nowhitespace: "Veuillez ne pas inscrire d'espaces blancs.",
+	ziprange: "Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",
+	integer: "Veuillez fournir un nombre non décimal qui est positif ou négatif.",
+	vinUS: "Veuillez fournir un numéro d'identification du véhicule (VIN).",
+	dateITA: "Veuillez fournir une date valide.",
+	time: "Veuillez fournir une heure valide entre 00:00 et 23:59.",
+	phoneUS: "Veuillez fournir un numéro de téléphone valide.",
+	phoneUK: "Veuillez fournir un numéro de téléphone valide.",
+	mobileUK: "Veuillez fournir un numéro de téléphone mobile valide.",
+	strippedminlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
+	email2: "Veuillez fournir une adresse électronique valide.",
+	url2: "Veuillez fournir une adresse URL valide.",
+	creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.",
+	ipv4: "Veuillez fournir une adresse IP v4 valide.",
+	ipv6: "Veuillez fournir une adresse IP v6 valide.",
+	require_from_group: $.validator.format( "Veuillez fournir au moins {0} de ces champs." ),
+	nifES: "Veuillez fournir un numéro NIF valide.",
+	nieES: "Veuillez fournir un numéro NIE valide.",
+	cifES: "Veuillez fournir un numéro CIF valide.",
+	postalCodeCA: "Veuillez fournir un code postal valide."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_fr.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_fr.min.js
new file mode 100644
index 0000000000..ff4cf847dc
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_fr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Ce champ est obligatoire.",remote:"Veuillez corriger ce champ.",email:"Veuillez fournir une adresse électronique valide.",url:"Veuillez fournir une adresse URL valide.",date:"Veuillez fournir une date valide.",dateISO:"Veuillez fournir une date valide (ISO).",number:"Veuillez fournir un numéro valide.",digits:"Veuillez fournir seulement des chiffres.",creditcard:"Veuillez fournir un numéro de carte de crédit valide.",equalTo:"Veuillez fournir encore la même valeur.",notEqualTo:"Veuillez fournir une valeur différente, les valeurs ne doivent pas être identiques.",extension:"Veuillez fournir une valeur avec une extension valide.",maxlength:a.validator.format("Veuillez fournir au plus {0} caractères."),minlength:a.validator.format("Veuillez fournir au moins {0} caractères."),rangelength:a.validator.format("Veuillez fournir une valeur qui contient entre {0} et {1} caractères."),range:a.validator.format("Veuillez fournir une valeur entre {0} et {1}."),max:a.validator.format("Veuillez fournir une valeur inférieure ou égale à {0}."),min:a.validator.format("Veuillez fournir une valeur supérieure ou égale à {0}."),step:a.validator.format("Veuillez fournir une valeur multiple de {0}."),maxWords:a.validator.format("Veuillez fournir au plus {0} mots."),minWords:a.validator.format("Veuillez fournir au moins {0} mots."),rangeWords:a.validator.format("Veuillez fournir entre {0} et {1} mots."),letterswithbasicpunc:"Veuillez fournir seulement des lettres et des signes de ponctuation.",alphanumeric:"Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",lettersonly:"Veuillez fournir seulement des lettres.",nowhitespace:"Veuillez ne pas inscrire d'espaces blancs.",ziprange:"Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",integer:"Veuillez fournir un nombre non décimal qui est positif ou négatif.",vinUS:"Veuillez fournir un numéro d'identification du véhicule (VIN).",dateITA:"Veuillez fournir une date valide.",time:"Veuillez fournir une heure valide entre 00:00 et 23:59.",phoneUS:"Veuillez fournir un numéro de téléphone valide.",phoneUK:"Veuillez fournir un numéro de téléphone valide.",mobileUK:"Veuillez fournir un numéro de téléphone mobile valide.",strippedminlength:a.validator.format("Veuillez fournir au moins {0} caractères."),email2:"Veuillez fournir une adresse électronique valide.",url2:"Veuillez fournir une adresse URL valide.",creditcardtypes:"Veuillez fournir un numéro de carte de crédit valide.",ipv4:"Veuillez fournir une adresse IP v4 valide.",ipv6:"Veuillez fournir une adresse IP v6 valide.",require_from_group:a.validator.format("Veuillez fournir au moins {0} de ces champs."),nifES:"Veuillez fournir un numéro NIF valide.",nieES:"Veuillez fournir un numéro NIE valide.",cifES:"Veuillez fournir un numéro CIF valide.",postalCodeCA:"Veuillez fournir un code postal valide."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ge.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ge.js
new file mode 100644
index 0000000000..61b6e241e6
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ge.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/**
+ * @author  @tatocaster <kutaliatato@gmail.com>
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: GE (Georgian; ქართული)
+ */
+$.extend( $.validator.messages, {
+	required: "ეს ველი სავალდებულოა",
+	remote: "გთხოვთ შეასწოროთ.",
+	email: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
+	url: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
+	date: "გთხოვთ შეიყვანოთ სწორი თარიღი.",
+	dateISO: "გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).",
+	number: "გთხოვთ შეიყვანოთ რიცხვი.",
+	digits: "დაშვებულია მხოლოდ ციფრები.",
+	creditcard: "გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",
+	equalTo: "გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",
+	maxlength: $.validator.format( "გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი." ),
+	minlength: $.validator.format( "შეიყვანეთ მინიმუმ {0} სიმბოლო." ),
+	rangelength: $.validator.format( "გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები." ),
+	range: $.validator.format( "შეიყვანეთ {0} -სა {1} -ს შორის." ),
+	max: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს." ),
+	min: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ge.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ge.min.js
new file mode 100644
index 0000000000..6b368c7dea
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ge.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"ეს ველი სავალდებულოა",remote:"გთხოვთ შეასწოროთ.",email:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",url:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",date:"გთხოვთ შეიყვანოთ სწორი თარიღი.",dateISO:"გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).",number:"გთხოვთ შეიყვანოთ რიცხვი.",digits:"დაშვებულია მხოლოდ ციფრები.",creditcard:"გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",equalTo:"გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",maxlength:a.validator.format("გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი."),minlength:a.validator.format("შეიყვანეთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები."),range:a.validator.format("შეიყვანეთ {0} -სა {1} -ს შორის."),max:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს."),min:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_gl.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_gl.js
new file mode 100644
index 0000000000..0503617139
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_gl.js
@@ -0,0 +1,40 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: GL (Galician; Galego)
+ */
+( function( $ ) {
+	$.extend( $.validator.messages, {
+		required: "Este campo é obrigatorio.",
+		remote: "Por favor, cubre este campo.",
+		email: "Por favor, escribe unha dirección de correo válida.",
+		url: "Por favor, escribe unha URL válida.",
+		date: "Por favor, escribe unha data válida.",
+		dateISO: "Por favor, escribe unha data (ISO) válida.",
+		number: "Por favor, escribe un número válido.",
+		digits: "Por favor, escribe só díxitos.",
+		creditcard: "Por favor, escribe un número de tarxeta válido.",
+		equalTo: "Por favor, escribe o mesmo valor de novo.",
+		extension: "Por favor, escribe un valor cunha extensión aceptada.",
+		maxlength: $.validator.format( "Por favor, non escribas máis de {0} caracteres." ),
+		minlength: $.validator.format( "Por favor, non escribas menos de {0} caracteres." ),
+		rangelength: $.validator.format( "Por favor, escribe un valor entre {0} e {1} caracteres." ),
+		range: $.validator.format( "Por favor, escribe un valor entre {0} e {1}." ),
+		max: $.validator.format( "Por favor, escribe un valor menor ou igual a {0}." ),
+		min: $.validator.format( "Por favor, escribe un valor maior ou igual a {0}." ),
+		nifES: "Por favor, escribe un NIF válido.",
+		nieES: "Por favor, escribe un NIE válido.",
+		cifES: "Por favor, escribe un CIF válido."
+	} );
+}( jQuery ) );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_gl.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_gl.min.js
new file mode 100644
index 0000000000..a9ff06cb6f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_gl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(a){a.extend(a.validator.messages,{required:"Este campo é obrigatorio.",remote:"Por favor, cubre este campo.",email:"Por favor, escribe unha dirección de correo válida.",url:"Por favor, escribe unha URL válida.",date:"Por favor, escribe unha data válida.",dateISO:"Por favor, escribe unha data (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe só díxitos.",creditcard:"Por favor, escribe un número de tarxeta válido.",equalTo:"Por favor, escribe o mesmo valor de novo.",extension:"Por favor, escribe un valor cunha extensión aceptada.",maxlength:a.validator.format("Por favor, non escribas máis de {0} caracteres."),minlength:a.validator.format("Por favor, non escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} e {1}."),max:a.validator.format("Por favor, escribe un valor menor ou igual a {0}."),min:a.validator.format("Por favor, escribe un valor maior ou igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."})}(jQuery),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_he.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_he.js
new file mode 100644
index 0000000000..cb84b56a26
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_he.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HE (Hebrew; עברית)
+ */
+$.extend( $.validator.messages, {
+	required: "השדה הזה הינו שדה חובה",
+	remote: "נא לתקן שדה זה",
+	email: "נא למלא כתובת דוא\"ל חוקית",
+	url: "נא למלא כתובת אינטרנט חוקית",
+	date: "נא למלא תאריך חוקי",
+	dateISO: "נא למלא תאריך חוקי (ISO)",
+	number: "נא למלא מספר",
+	digits: "נא למלא רק מספרים",
+	creditcard: "נא למלא מספר כרטיס אשראי חוקי",
+	equalTo: "נא למלא את אותו ערך שוב",
+	extension: "נא למלא ערך עם סיומת חוקית",
+	maxlength: $.validator.format( ".נא לא למלא יותר מ- {0} תווים" ),
+	minlength: $.validator.format( "נא למלא לפחות {0} תווים" ),
+	rangelength: $.validator.format( "נא למלא ערך בין {0} ל- {1} תווים" ),
+	range: $.validator.format( "נא למלא ערך בין {0} ל- {1}" ),
+	max: $.validator.format( "נא למלא ערך קטן או שווה ל- {0}" ),
+	min: $.validator.format( "נא למלא ערך גדול או שווה ל- {0}" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_he.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_he.min.js
new file mode 100644
index 0000000000..a998717a4d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_he.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"השדה הזה הינו שדה חובה",remote:"נא לתקן שדה זה",email:'נא למלא כתובת דוא"ל חוקית',url:"נא למלא כתובת אינטרנט חוקית",date:"נא למלא תאריך חוקי",dateISO:"נא למלא תאריך חוקי (ISO)",number:"נא למלא מספר",digits:"נא למלא רק מספרים",creditcard:"נא למלא מספר כרטיס אשראי חוקי",equalTo:"נא למלא את אותו ערך שוב",extension:"נא למלא ערך עם סיומת חוקית",maxlength:a.validator.format(".נא לא למלא יותר מ- {0} תווים"),minlength:a.validator.format("נא למלא לפחות {0} תווים"),rangelength:a.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),range:a.validator.format("נא למלא ערך בין {0} ל- {1}"),max:a.validator.format("נא למלא ערך קטן או שווה ל- {0}"),min:a.validator.format("נא למלא ערך גדול או שווה ל- {0}")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_hr.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_hr.js
new file mode 100644
index 0000000000..092506dbef
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_hr.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HR (Croatia; hrvatski jezik)
+ */
+$.extend( $.validator.messages, {
+	required: "Ovo polje je obavezno.",
+	remote: "Ovo polje treba popraviti.",
+	email: "Unesite ispravnu e-mail adresu.",
+	url: "Unesite ispravan URL.",
+	date: "Unesite ispravan datum.",
+	dateISO: "Unesite ispravan datum (ISO).",
+	number: "Unesite ispravan broj.",
+	digits: "Unesite samo brojeve.",
+	creditcard: "Unesite ispravan broj kreditne kartice.",
+	equalTo: "Unesite ponovo istu vrijednost.",
+	extension: "Unesite vrijednost sa ispravnom ekstenzijom.",
+	maxlength: $.validator.format( "Maksimalni broj znakova je {0} ." ),
+	minlength: $.validator.format( "Minimalni broj znakova je {0} ." ),
+	rangelength: $.validator.format( "Unesite vrijednost između {0} i {1} znakova." ),
+	range: $.validator.format( "Unesite vrijednost između {0} i {1}." ),
+	max: $.validator.format( "Unesite vrijednost manju ili jednaku {0}." ),
+	min: $.validator.format( "Unesite vrijednost veću ili jednaku {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_hr.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_hr.min.js
new file mode 100644
index 0000000000..92e3e2db88
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_hr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Ovo polje je obavezno.",remote:"Ovo polje treba popraviti.",email:"Unesite ispravnu e-mail adresu.",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo brojeve.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite ponovo istu vrijednost.",extension:"Unesite vrijednost sa ispravnom ekstenzijom.",maxlength:a.validator.format("Maksimalni broj znakova je {0} ."),minlength:a.validator.format("Minimalni broj znakova je {0} ."),rangelength:a.validator.format("Unesite vrijednost između {0} i {1} znakova."),range:a.validator.format("Unesite vrijednost između {0} i {1}."),max:a.validator.format("Unesite vrijednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrijednost veću ili jednaku {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_hu.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_hu.js
new file mode 100644
index 0000000000..616ae251c9
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_hu.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HU (Hungarian; Magyar)
+ */
+$.extend( $.validator.messages, {
+	required: "Kötelező megadni.",
+	maxlength: $.validator.format( "Legfeljebb {0} karakter hosszú legyen." ),
+	minlength: $.validator.format( "Legalább {0} karakter hosszú legyen." ),
+	rangelength: $.validator.format( "Legalább {0} és legfeljebb {1} karakter hosszú legyen." ),
+	email: "Érvényes e-mail címnek kell lennie.",
+	url: "Érvényes URL-nek kell lennie.",
+	date: "Dátumnak kell lennie.",
+	number: "Számnak kell lennie.",
+	digits: "Csak számjegyek lehetnek.",
+	equalTo: "Meg kell egyeznie a két értéknek.",
+	range: $.validator.format( "{0} és {1} közé kell esnie." ),
+	max: $.validator.format( "Nem lehet nagyobb, mint {0}." ),
+	min: $.validator.format( "Nem lehet kisebb, mint {0}." ),
+	creditcard: "Érvényes hitelkártyaszámnak kell lennie.",
+	remote: "Kérem javítsa ki ezt a mezőt.",
+	dateISO: "Kérem írjon be egy érvényes dátumot (ISO).",
+	step: $.validator.format( "A {0} egyik többszörösét adja meg." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_hu.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_hu.min.js
new file mode 100644
index 0000000000..1329619946
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_hu.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Kötelező megadni.",maxlength:a.validator.format("Legfeljebb {0} karakter hosszú legyen."),minlength:a.validator.format("Legalább {0} karakter hosszú legyen."),rangelength:a.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),email:"Érvényes e-mail címnek kell lennie.",url:"Érvényes URL-nek kell lennie.",date:"Dátumnak kell lennie.",number:"Számnak kell lennie.",digits:"Csak számjegyek lehetnek.",equalTo:"Meg kell egyeznie a két értéknek.",range:a.validator.format("{0} és {1} közé kell esnie."),max:a.validator.format("Nem lehet nagyobb, mint {0}."),min:a.validator.format("Nem lehet kisebb, mint {0}."),creditcard:"Érvényes hitelkártyaszámnak kell lennie.",remote:"Kérem javítsa ki ezt a mezőt.",dateISO:"Kérem írjon be egy érvényes dátumot (ISO).",step:a.validator.format("A {0} egyik többszörösét adja meg.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.js
new file mode 100644
index 0000000000..c6aec5c331
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HY_AM (Armenian; Õ°Õ¡ÕµÕ¥Ö€Õ¥Õ¶ Õ¬Õ¥Õ¦Õ¸Ö‚)
+ */
+$.extend( $.validator.messages, {
+	required: "Պարտադիր լրացման դաշտ",
+	remote: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ³Õ«Õ·Õ¿ Õ¡Ö€ÕªÕ¥Ö„Õ¨",
+	email: "Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",
+	url: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¾Õ¡Õ¾Õ¥Ö€ URL",
+	date: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¾Õ¡Õ¾Õ¥Ö€ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾",
+	dateISO: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ ISO Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¸Õ¾ Õ¾Õ¡Õ¾Õ¥Ö€ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾Ö‰",
+	number: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ©Õ«Õ¾",
+	digits: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ´Õ«Õ¡ÕµÕ¶ Õ©Õ¾Õ¥Ö€",
+	creditcard: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ³Õ«Õ·Õ¿ Õ¢Õ¡Õ¶Õ¯Õ¡ÕµÕ«Õ¶ Ö„Õ¡Ö€Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö€",
+	equalTo: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ´Õ«Ö‡Õ¶Õ¸Ö‚Õ¶ Õ¡Ö€ÕªÕ¥Ö„Õ¨ Ö‡Õ½ Õ´Õ¥Õ¯ Õ¡Õ¶Õ£Õ¡Õ´",
+	extension: "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ³Õ«Õ·Õ¿ Õ¨Õ¶Õ¤Õ¬Õ¡Õ¶Õ¸Ö‚Õ´Õ¸Õ¾ Ö†Õ¡ÕµÕ¬",
+	maxlength: $.validator.format( "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬ Ö„Õ¡Õ¶ {0} Õ¶Õ«Õ·" ),
+	minlength: $.validator.format( "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¸Õ¹ ÕºÕ¡Õ¯Õ¡Õ½ Ö„Õ¡Õ¶ {0} Õ¶Õ«Õ·" ),
+	rangelength: $.validator.format( "Ներմուծեք {0}֊ից {1} երկարությամբ արժեք" ),
+	range: $.validator.format( "Ներմուծեք թիվ {0}֊ից {1} միջակայքում" ),
+	max: $.validator.format( "Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին" ),
+	min: $.validator.format( "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ©Õ«Õ¾, Õ¸Ö€Õ¨ Õ´Õ¥Õ® Õ¯Õ¡Õ´ Õ°Õ¡Õ¾Õ¡Õ½Õ¡Ö€ Õ§ {0}ÖŠÕ«Õ¶" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.min.js
new file mode 100644
index 0000000000..fff2bbeae8
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_hy_AM.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Պարտադիր լրացման դաշտ",remote:"Ներմուծեք ճիշտ արժեքը",email:"Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",url:"Ներմուծեք վավեր URL",date:"Ներմուծեք վավեր ամսաթիվ",dateISO:"Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",number:"Ներմուծեք թիվ",digits:"Ներմուծեք միայն թվեր",creditcard:"Ներմուծեք ճիշտ բանկային քարտի համար",equalTo:"Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",extension:"Ընտրեք ճիշտ ընդլանումով ֆայլ",maxlength:a.validator.format("Ներմուծեք ոչ ավել քան {0} նիշ"),minlength:a.validator.format("Ներմուծեք ոչ պակաս քան {0} նիշ"),rangelength:a.validator.format("Ներմուծեք {0}֊ից {1} երկարությամբ արժեք"),range:a.validator.format("Ներմուծեք թիվ {0}֊ից {1} միջակայքում"),max:a.validator.format("Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին"),min:a.validator.format("Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_id.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_id.js
new file mode 100644
index 0000000000..052a988165
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_id.js
@@ -0,0 +1,34 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ID (Indonesia; Indonesian)
+ */
+$.extend( $.validator.messages, {
+	required: "Kolom ini diperlukan.",
+	remote: "Harap benarkan kolom ini.",
+	email: "Silakan masukkan format email yang benar.",
+	url: "Silakan masukkan format URL yang benar.",
+	date: "Silakan masukkan format tanggal yang benar.",
+	dateISO: "Silakan masukkan format tanggal(ISO) yang benar.",
+	number: "Silakan masukkan angka yang benar.",
+	digits: "Harap masukan angka saja.",
+	creditcard: "Harap masukkan format kartu kredit yang benar.",
+	equalTo: "Harap masukkan nilai yg sama dengan sebelumnya.",
+	maxlength: $.validator.format( "Input dibatasi hanya {0} karakter." ),
+	minlength: $.validator.format( "Input tidak kurang dari {0} karakter." ),
+	rangelength: $.validator.format( "Panjang karakter yg diizinkan antara {0} dan {1} karakter." ),
+	range: $.validator.format( "Harap masukkan nilai antara {0} dan {1}." ),
+	max: $.validator.format( "Harap masukkan nilai lebih kecil atau sama dengan {0}." ),
+	min: $.validator.format( "Harap masukkan nilai lebih besar atau sama dengan {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_id.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_id.min.js
new file mode 100644
index 0000000000..928788f66e
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_id.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Kolom ini diperlukan.",remote:"Harap benarkan kolom ini.",email:"Silakan masukkan format email yang benar.",url:"Silakan masukkan format URL yang benar.",date:"Silakan masukkan format tanggal yang benar.",dateISO:"Silakan masukkan format tanggal(ISO) yang benar.",number:"Silakan masukkan angka yang benar.",digits:"Harap masukan angka saja.",creditcard:"Harap masukkan format kartu kredit yang benar.",equalTo:"Harap masukkan nilai yg sama dengan sebelumnya.",maxlength:a.validator.format("Input dibatasi hanya {0} karakter."),minlength:a.validator.format("Input tidak kurang dari {0} karakter."),rangelength:a.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),range:a.validator.format("Harap masukkan nilai antara {0} dan {1}."),max:a.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),min:a.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_is.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_is.js
new file mode 100644
index 0000000000..e3f75d0141
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_is.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: IS (Icelandic; íslenska)
+ */
+$.extend( $.validator.messages, {
+	required: "Þessi reitur er nauðsynlegur.",
+	remote: "Lagaðu þennan reit.",
+	maxlength: $.validator.format( "Sláðu inn mest {0} stafi." ),
+	minlength: $.validator.format( "Sláðu inn minnst {0} stafi." ),
+	rangelength: $.validator.format( "Sláðu inn minnst {0} og mest {1} stafi." ),
+	email: "Sláðu inn gilt netfang.",
+	url: "Sláðu inn gilda vefslóð.",
+	date: "Sláðu inn gilda dagsetningu.",
+	number: "Sláðu inn tölu.",
+	digits: "Sláðu inn tölustafi eingöngu.",
+	equalTo: "Sláðu sama gildi inn aftur.",
+	range: $.validator.format( "Sláðu inn gildi milli {0} og {1}." ),
+	max: $.validator.format( "Sláðu inn gildi sem er minna en eða jafnt og {0}." ),
+	min: $.validator.format( "Sláðu inn gildi sem er stærra en eða jafnt og {0}." ),
+	creditcard: "Sláðu inn gilt greiðslukortanúmer."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_is.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_is.min.js
new file mode 100644
index 0000000000..f69e4a53c2
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_is.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Þessi reitur er nauðsynlegur.",remote:"Lagaðu þennan reit.",maxlength:a.validator.format("Sláðu inn mest {0} stafi."),minlength:a.validator.format("Sláðu inn minnst {0} stafi."),rangelength:a.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),email:"Sláðu inn gilt netfang.",url:"Sláðu inn gilda vefslóð.",date:"Sláðu inn gilda dagsetningu.",number:"Sláðu inn tölu.",digits:"Sláðu inn tölustafi eingöngu.",equalTo:"Sláðu sama gildi inn aftur.",range:a.validator.format("Sláðu inn gildi milli {0} og {1}."),max:a.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),min:a.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),creditcard:"Sláðu inn gilt greiðslukortanúmer."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_it.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_it.js
new file mode 100644
index 0000000000..88ce6f0ea7
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_it.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: IT (Italian; Italiano)
+ */
+$.extend( $.validator.messages, {
+	required: "Campo obbligatorio",
+	remote: "Controlla questo campo",
+	email: "Inserisci un indirizzo email valido",
+	url: "Inserisci un indirizzo web valido",
+	date: "Inserisci una data valida",
+	dateISO: "Inserisci una data valida (ISO)",
+	number: "Inserisci un numero valido",
+	digits: "Inserisci solo numeri",
+	creditcard: "Inserisci un numero di carta di credito valido",
+	equalTo: "Il valore non corrisponde",
+	extension: "Inserisci un valore con un&apos;estensione valida",
+	maxlength: $.validator.format( "Non inserire pi&ugrave; di {0} caratteri" ),
+	minlength: $.validator.format( "Inserisci almeno {0} caratteri" ),
+	rangelength: $.validator.format( "Inserisci un valore compreso tra {0} e {1} caratteri" ),
+	range: $.validator.format( "Inserisci un valore compreso tra {0} e {1}" ),
+	max: $.validator.format( "Inserisci un valore minore o uguale a {0}" ),
+	min: $.validator.format( "Inserisci un valore maggiore o uguale a {0}" ),
+	nifES: "Inserisci un NIF valido",
+	nieES: "Inserisci un NIE valido",
+	cifES: "Inserisci un CIF valido",
+	currency: "Inserisci una valuta valida"
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_it.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_it.min.js
new file mode 100644
index 0000000000..379ec60eed
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_it.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Campo obbligatorio",remote:"Controlla questo campo",email:"Inserisci un indirizzo email valido",url:"Inserisci un indirizzo web valido",date:"Inserisci una data valida",dateISO:"Inserisci una data valida (ISO)",number:"Inserisci un numero valido",digits:"Inserisci solo numeri",creditcard:"Inserisci un numero di carta di credito valido",equalTo:"Il valore non corrisponde",extension:"Inserisci un valore con un&apos;estensione valida",maxlength:a.validator.format("Non inserire pi&ugrave; di {0} caratteri"),minlength:a.validator.format("Inserisci almeno {0} caratteri"),rangelength:a.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri"),range:a.validator.format("Inserisci un valore compreso tra {0} e {1}"),max:a.validator.format("Inserisci un valore minore o uguale a {0}"),min:a.validator.format("Inserisci un valore maggiore o uguale a {0}"),nifES:"Inserisci un NIF valido",nieES:"Inserisci un NIE valido",cifES:"Inserisci un CIF valido",currency:"Inserisci una valuta valida"}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ja.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ja.js
new file mode 100644
index 0000000000..f72c53dc45
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ja.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: JA (Japanese; 日本語)
+ */
+$.extend( $.validator.messages, {
+	required: "このフィールドは必須です。",
+	remote: "このフィールドを修正してください。",
+	email: "有効なEメールアドレスを入力してください。",
+	url: "有効なURLを入力してください。",
+	date: "有効な日付を入力してください。",
+	dateISO: "有効な日付(ISO)を入力してください。",
+	number: "有効な数字を入力してください。",
+	digits: "数字のみを入力してください。",
+	creditcard: "有効なクレジットカード番号を入力してください。",
+	equalTo: "同じ値をもう一度入力してください。",
+	extension: "有効な拡張子を含む値を入力してください。",
+	maxlength: $.validator.format( "{0} 文字以内で入力してください。" ),
+	minlength: $.validator.format( "{0} 文字以上で入力してください。" ),
+	rangelength: $.validator.format( "{0} 文字から {1} 文字までの値を入力してください。" ),
+	range: $.validator.format( "{0} から {1} までの値を入力してください。" ),
+	step: $.validator.format( "{0} の倍数を入力してください。" ),
+	max: $.validator.format( "{0} 以下の値を入力してください。" ),
+	min: $.validator.format( "{0} 以上の値を入力してください。" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ja.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ja.min.js
new file mode 100644
index 0000000000..c312368aa2
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ja.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"このフィールドは必須です。",remote:"このフィールドを修正してください。",email:"有効なEメールアドレスを入力してください。",url:"有効なURLを入力してください。",date:"有効な日付を入力してください。",dateISO:"有効な日付(ISO)を入力してください。",number:"有効な数字を入力してください。",digits:"数字のみを入力してください。",creditcard:"有効なクレジットカード番号を入力してください。",equalTo:"同じ値をもう一度入力してください。",extension:"有効な拡張子を含む値を入力してください。",maxlength:a.validator.format("{0} 文字以内で入力してください。"),minlength:a.validator.format("{0} 文字以上で入力してください。"),rangelength:a.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),range:a.validator.format("{0} から {1} までの値を入力してください。"),step:a.validator.format("{0} の倍数を入力してください。"),max:a.validator.format("{0} 以下の値を入力してください。"),min:a.validator.format("{0} 以上の値を入力してください。")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ka.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ka.js
new file mode 100644
index 0000000000..a4d79ff974
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ka.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: KA (Georgian; ქართული)
+ */
+$.extend( $.validator.messages, {
+	required: "ამ ველის შევსება აუცილებელია.",
+	remote: "გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",
+	email: "გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",
+	url: "გთხოვთ მიუთითოთ კორექტული URL.",
+	date: "გთხოვთ მიუთითოთ კორექტული თარიღი.",
+	dateISO: "გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",
+	number: "გთხოვთ მიუთითოთ ციფრი.",
+	digits: "გთხოვთ მიუთითოთ მხოლოდ ციფრები.",
+	creditcard: "გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",
+	equalTo: "გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",
+	extension: "გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",
+	maxlength: $.validator.format( "დასაშვებია არაუმეტეს {0} სიმბოლო." ),
+	minlength: $.validator.format( "აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო." ),
+	rangelength: $.validator.format( "ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე." ),
+	range: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე." ),
+	max: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს." ),
+	min: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ka.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ka.min.js
new file mode 100644
index 0000000000..f7f87267d6
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ka.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"ამ ველის შევსება აუცილებელია.",remote:"გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",email:"გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",url:"გთხოვთ მიუთითოთ კორექტული URL.",date:"გთხოვთ მიუთითოთ კორექტული თარიღი.",dateISO:"გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",number:"გთხოვთ მიუთითოთ ციფრი.",digits:"გთხოვთ მიუთითოთ მხოლოდ ციფრები.",creditcard:"გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",equalTo:"გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",extension:"გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",maxlength:a.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),minlength:a.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),range:a.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),max:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),min:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_kk.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_kk.js
new file mode 100644
index 0000000000..79e3ea828e
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_kk.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: KK (Kazakh; қазақ тілі)
+ */
+$.extend( $.validator.messages, {
+	required: "Бұл өрісті міндетті түрде толтырыңыз.",
+	remote: "Дұрыс мағына енгізуіңізді сұраймыз.",
+	email: "Нақты электронды поштаңызды енгізуіңізді сұраймыз.",
+	url: "Нақты URL-ды енгізуіңізді сұраймыз.",
+	date: "Нақты URL-ды енгізуіңізді сұраймыз.",
+	dateISO: "Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",
+	number: "Күнді енгізуіңізді сұраймыз.",
+	digits: "Тек қана сандарды енгізуіңізді сұраймыз.",
+	creditcard: "Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",
+	equalTo: "Осы мәнді қайта енгізуіңізді сұраймыз.",
+	extension: "Файлдың кеңейтуін дұрыс таңдаңыз.",
+	maxlength: $.validator.format( "Ұзындығы {0} символдан көр болмасын." ),
+	minlength: $.validator.format( "Ұзындығы {0} символдан аз болмасын." ),
+	rangelength: $.validator.format( "Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз." ),
+	range: $.validator.format( "Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз." ),
+	max: $.validator.format( "{0} аз немесе тең санын енгізуіңіді сұраймыз." ),
+	min: $.validator.format( "{0} көп немесе тең санын енгізуіңізді сұраймыз." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_kk.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_kk.min.js
new file mode 100644
index 0000000000..38212366a9
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_kk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Бұл өрісті міндетті түрде толтырыңыз.",remote:"Дұрыс мағына енгізуіңізді сұраймыз.",email:"Нақты электронды поштаңызды енгізуіңізді сұраймыз.",url:"Нақты URL-ды енгізуіңізді сұраймыз.",date:"Нақты URL-ды енгізуіңізді сұраймыз.",dateISO:"Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",number:"Күнді енгізуіңізді сұраймыз.",digits:"Тек қана сандарды енгізуіңізді сұраймыз.",creditcard:"Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",equalTo:"Осы мәнді қайта енгізуіңізді сұраймыз.",extension:"Файлдың кеңейтуін дұрыс таңдаңыз.",maxlength:a.validator.format("Ұзындығы {0} символдан көр болмасын."),minlength:a.validator.format("Ұзындығы {0} символдан аз болмасын."),rangelength:a.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),max:a.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),min:a.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ko.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ko.js
new file mode 100644
index 0000000000..f94612cb7a
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ko.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: KO (Korean; 한국어)
+ */
+$.extend( $.validator.messages, {
+	required: "필수 항목입니다.",
+	remote: "항목을 수정하세요.",
+	email: "유효하지 않은 E-Mail주소입니다.",
+	url: "유효하지 않은 URL입니다.",
+	date: "올바른 날짜를 입력하세요.",
+	dateISO: "올바른 날짜(ISO)를 입력하세요.",
+	number: "유효한 숫자가 아닙니다.",
+	digits: "숫자만 입력 가능합니다.",
+	creditcard: "신용카드 번호가 바르지 않습니다.",
+	equalTo: "같은 값을 다시 입력하세요.",
+	extension: "올바른 확장자가 아닙니다.",
+	maxlength: $.validator.format( "{0}자를 넘을 수 없습니다. " ),
+	minlength: $.validator.format( "{0}자 이상 입력하세요." ),
+	rangelength: $.validator.format( "문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요." ),
+	range: $.validator.format( "{0} 에서 {1} 사이의 값을 입력하세요." ),
+	max: $.validator.format( "{0} 이하의 값을 입력하세요." ),
+	min: $.validator.format( "{0} 이상의 값을 입력하세요." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ko.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ko.min.js
new file mode 100644
index 0000000000..7b1ff18486
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ko.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"필수 항목입니다.",remote:"항목을 수정하세요.",email:"유효하지 않은 E-Mail주소입니다.",url:"유효하지 않은 URL입니다.",date:"올바른 날짜를 입력하세요.",dateISO:"올바른 날짜(ISO)를 입력하세요.",number:"유효한 숫자가 아닙니다.",digits:"숫자만 입력 가능합니다.",creditcard:"신용카드 번호가 바르지 않습니다.",equalTo:"같은 값을 다시 입력하세요.",extension:"올바른 확장자가 아닙니다.",maxlength:a.validator.format("{0}자를 넘을 수 없습니다. "),minlength:a.validator.format("{0}자 이상 입력하세요."),rangelength:a.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),range:a.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),max:a.validator.format("{0} 이하의 값을 입력하세요."),min:a.validator.format("{0} 이상의 값을 입력하세요.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_lt.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_lt.js
new file mode 100644
index 0000000000..4dea0b1101
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_lt.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: LT (Lithuanian; lietuvių kalba)
+ */
+$.extend( $.validator.messages, {
+	required: "Å is laukas yra privalomas.",
+	remote: "Prašau pataisyti šį lauką.",
+	email: "Prašau įvesti teisingą elektroninio pašto adresą.",
+	url: "Prašau įvesti teisingą URL.",
+	date: "Prašau įvesti teisingą datą.",
+	dateISO: "Prašau įvesti teisingą datą (ISO).",
+	number: "Prašau įvesti teisingą skaičių.",
+	digits: "Prašau naudoti tik skaitmenis.",
+	creditcard: "Prašau įvesti teisingą kreditinės kortelės numerį.",
+	equalTo: "Prašau įvestį tą pačią reikšmę dar kartą.",
+	extension: "Prašau įvesti reikšmę su teisingu plėtiniu.",
+	maxlength: $.validator.format( "Prašau įvesti ne daugiau kaip {0} simbolių." ),
+	minlength: $.validator.format( "Prašau įvesti bent {0} simbolius." ),
+	rangelength: $.validator.format( "Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių." ),
+	range: $.validator.format( "Prašau įvesti reikšmę intervale nuo {0} iki {1}." ),
+	max: $.validator.format( "Prašau įvesti reikšmę mažesnę arba lygią {0}." ),
+	min: $.validator.format( "Prašau įvesti reikšmę didesnę arba lygią {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_lt.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_lt.min.js
new file mode 100644
index 0000000000..f6e5c69c78
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_lt.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Šis laukas yra privalomas.",remote:"Prašau pataisyti šį lauką.",email:"Prašau įvesti teisingą elektroninio pašto adresą.",url:"Prašau įvesti teisingą URL.",date:"Prašau įvesti teisingą datą.",dateISO:"Prašau įvesti teisingą datą (ISO).",number:"Prašau įvesti teisingą skaičių.",digits:"Prašau naudoti tik skaitmenis.",creditcard:"Prašau įvesti teisingą kreditinės kortelės numerį.",equalTo:"Prašau įvestį tą pačią reikšmę dar kartą.",extension:"Prašau įvesti reikšmę su teisingu plėtiniu.",maxlength:a.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),minlength:a.validator.format("Prašau įvesti bent {0} simbolius."),rangelength:a.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),range:a.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),max:a.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),min:a.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_lv.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_lv.js
new file mode 100644
index 0000000000..692e3cbcb7
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_lv.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: LV (Latvian; latviešu valoda)
+ */
+$.extend( $.validator.messages, {
+	required: "Šis lauks ir obligāts.",
+	remote: "Lūdzu, pārbaudiet šo lauku.",
+	email: "Lūdzu, ievadiet derīgu e-pasta adresi.",
+	url: "Lūdzu, ievadiet derīgu URL adresi.",
+	date: "Lūdzu, ievadiet derīgu datumu.",
+	dateISO: "Lūdzu, ievadiet derīgu datumu (ISO).",
+	number: "Lūdzu, ievadiet derīgu numuru.",
+	digits: "LÅ«dzu, ievadiet tikai ciparus.",
+	creditcard: "Lūdzu, ievadiet derīgu kredītkartes numuru.",
+	equalTo: "Lūdzu, ievadiet to pašu vēlreiz.",
+	extension: "Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",
+	maxlength: $.validator.format( "Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes." ),
+	minlength: $.validator.format( "Lūdzu, ievadiet vismaz {0} rakstzīmes." ),
+	rangelength: $.validator.format( "Lūdzu ievadiet {0} līdz {1} rakstzīmes." ),
+	range: $.validator.format( "Lūdzu, ievadiet skaitli no {0} līdz {1}." ),
+	max: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}." ),
+	min: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_lv.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_lv.min.js
new file mode 100644
index 0000000000..a6cc9066d5
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_lv.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Šis lauks ir obligāts.",remote:"Lūdzu, pārbaudiet šo lauku.",email:"Lūdzu, ievadiet derīgu e-pasta adresi.",url:"Lūdzu, ievadiet derīgu URL adresi.",date:"Lūdzu, ievadiet derīgu datumu.",dateISO:"Lūdzu, ievadiet derīgu datumu (ISO).",number:"Lūdzu, ievadiet derīgu numuru.",digits:"Lūdzu, ievadiet tikai ciparus.",creditcard:"Lūdzu, ievadiet derīgu kredītkartes numuru.",equalTo:"Lūdzu, ievadiet to pašu vēlreiz.",extension:"Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",maxlength:a.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),minlength:a.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),rangelength:a.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),range:a.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),max:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),min:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_mk.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_mk.js
new file mode 100644
index 0000000000..242783536e
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_mk.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: MK (Macedonian; македонски јазик)
+ */
+$.extend( $.validator.messages, {
+	required: "Полето е задолжително.",
+	remote: "Поправете го ова поле",
+	email: "Внесете правилна e-mail адреса",
+	url: "Внесете правилен URL.",
+	date: "Внесете правилен датум",
+	dateISO: "Внесете правилен датум (ISO).",
+	number: "Внесете правилен број.",
+	digits: "Внесете само бројки.",
+	creditcard: "Внесете правилен број на кредитната картичка.",
+	equalTo: "Внесете ја истата вредност повторно.",
+	extension: "Внесете вредност со соодветна екстензија.",
+	maxlength: $.validator.format( "Внесете максимално {0} знаци." ),
+	minlength: $.validator.format( "Внесете барем {0} знаци." ),
+	rangelength: $.validator.format( "Внесете вредност со должина помеѓу {0} и {1} знаци." ),
+	range: $.validator.format( "Внесете вредност помеѓу {0} и {1}." ),
+	max: $.validator.format( "Внесете вредност помала или еднаква на {0}." ),
+	min: $.validator.format( "Внесете вредност поголема или еднаква на {0}" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_mk.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_mk.min.js
new file mode 100644
index 0000000000..af901b05eb
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_mk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Полето е задолжително.",remote:"Поправете го ова поле",email:"Внесете правилна e-mail адреса",url:"Внесете правилен URL.",date:"Внесете правилен датум",dateISO:"Внесете правилен датум (ISO).",number:"Внесете правилен број.",digits:"Внесете само бројки.",creditcard:"Внесете правилен број на кредитната картичка.",equalTo:"Внесете ја истата вредност повторно.",extension:"Внесете вредност со соодветна екстензија.",maxlength:a.validator.format("Внесете максимално {0} знаци."),minlength:a.validator.format("Внесете барем {0} знаци."),rangelength:a.validator.format("Внесете вредност со должина помеѓу {0} и {1} знаци."),range:a.validator.format("Внесете вредност помеѓу {0} и {1}."),max:a.validator.format("Внесете вредност помала или еднаква на {0}."),min:a.validator.format("Внесете вредност поголема или еднаква на {0}")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_my.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_my.js
new file mode 100644
index 0000000000..9b8313b6f4
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_my.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: MY (Malay; Melayu)
+ */
+$.extend( $.validator.messages, {
+	required: "Medan ini diperlukan.",
+	remote: "Sila betulkan medan ini.",
+	email: "Sila masukkan alamat emel yang betul.",
+	url: "Sila masukkan URL yang betul.",
+	date: "Sila masukkan tarikh yang betul.",
+	dateISO: "Sila masukkan tarikh(ISO) yang betul.",
+	number: "Sila masukkan nombor yang betul.",
+	digits: "Sila masukkan nilai digit sahaja.",
+	creditcard: "Sila masukkan nombor kredit kad yang betul.",
+	equalTo: "Sila masukkan nilai yang sama semula.",
+	extension: "Sila masukkan nilai yang telah diterima.",
+	maxlength: $.validator.format( "Sila masukkan tidak lebih dari {0} aksara." ),
+	minlength: $.validator.format( "Sila masukkan sekurang-kurangnya {0} aksara." ),
+	rangelength: $.validator.format( "Sila masukkan antara {0} dan {1} panjang aksara." ),
+	range: $.validator.format( "Sila masukkan nilai antara {0} dan {1} aksara." ),
+	max: $.validator.format( "Sila masukkan nilai yang kurang atau sama dengan {0}." ),
+	min: $.validator.format( "Sila masukkan nilai yang lebih atau sama dengan {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_my.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_my.min.js
new file mode 100644
index 0000000000..62d83f3feb
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_my.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Medan ini diperlukan.",remote:"Sila betulkan medan ini.",email:"Sila masukkan alamat emel yang betul.",url:"Sila masukkan URL yang betul.",date:"Sila masukkan tarikh yang betul.",dateISO:"Sila masukkan tarikh(ISO) yang betul.",number:"Sila masukkan nombor yang betul.",digits:"Sila masukkan nilai digit sahaja.",creditcard:"Sila masukkan nombor kredit kad yang betul.",equalTo:"Sila masukkan nilai yang sama semula.",extension:"Sila masukkan nilai yang telah diterima.",maxlength:a.validator.format("Sila masukkan tidak lebih dari {0} aksara."),minlength:a.validator.format("Sila masukkan sekurang-kurangnya {0} aksara."),rangelength:a.validator.format("Sila masukkan antara {0} dan {1} panjang aksara."),range:a.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),max:a.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),min:a.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_nl.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_nl.js
new file mode 100644
index 0000000000..c688ea2493
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_nl.js
@@ -0,0 +1,46 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: NL (Dutch; Nederlands, Vlaams)
+ */
+$.extend( $.validator.messages, {
+	required: "Dit is een verplicht veld.",
+	remote: "Controleer dit veld.",
+	email: "Vul hier een geldig e-mailadres in.",
+	url: "Vul hier een geldige URL in.",
+	date: "Vul hier een geldige datum in.",
+	dateISO: "Vul hier een geldige datum in (ISO-formaat).",
+	number: "Vul hier een geldig getal in.",
+	digits: "Vul hier alleen getallen in.",
+	creditcard: "Vul hier een geldig creditcardnummer in.",
+	equalTo: "Vul hier dezelfde waarde in.",
+	extension: "Vul hier een waarde in met een geldige extensie.",
+	maxlength: $.validator.format( "Vul hier maximaal {0} tekens in." ),
+	minlength: $.validator.format( "Vul hier minimaal {0} tekens in." ),
+	rangelength: $.validator.format( "Vul hier een waarde in van minimaal {0} en maximaal {1} tekens." ),
+	range: $.validator.format( "Vul hier een waarde in van minimaal {0} en maximaal {1}." ),
+	max: $.validator.format( "Vul hier een waarde in kleiner dan of gelijk aan {0}." ),
+	min: $.validator.format( "Vul hier een waarde in groter dan of gelijk aan {0}." ),
+	step: $.validator.format( "Vul hier een veelvoud van {0} in." ),
+
+	// For validations in additional-methods.js
+	iban: "Vul hier een geldig IBAN in.",
+	dateNL: "Vul hier een geldige datum in.",
+	phoneNL: "Vul hier een geldig Nederlands telefoonnummer in.",
+	mobileNL: "Vul hier een geldig Nederlands mobiel telefoonnummer in.",
+	postalcodeNL: "Vul hier een geldige postcode in.",
+	bankaccountNL: "Vul hier een geldig bankrekeningnummer in.",
+	giroaccountNL: "Vul hier een geldig gironummer in.",
+	bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_nl.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_nl.min.js
new file mode 100644
index 0000000000..41a2ff6d88
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_nl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Dit is een verplicht veld.",remote:"Controleer dit veld.",email:"Vul hier een geldig e-mailadres in.",url:"Vul hier een geldige URL in.",date:"Vul hier een geldige datum in.",dateISO:"Vul hier een geldige datum in (ISO-formaat).",number:"Vul hier een geldig getal in.",digits:"Vul hier alleen getallen in.",creditcard:"Vul hier een geldig creditcardnummer in.",equalTo:"Vul hier dezelfde waarde in.",extension:"Vul hier een waarde in met een geldige extensie.",maxlength:a.validator.format("Vul hier maximaal {0} tekens in."),minlength:a.validator.format("Vul hier minimaal {0} tekens in."),rangelength:a.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),range:a.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),max:a.validator.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),min:a.validator.format("Vul hier een waarde in groter dan of gelijk aan {0}."),step:a.validator.format("Vul hier een veelvoud van {0} in."),iban:"Vul hier een geldig IBAN in.",dateNL:"Vul hier een geldige datum in.",phoneNL:"Vul hier een geldig Nederlands telefoonnummer in.",mobileNL:"Vul hier een geldig Nederlands mobiel telefoonnummer in.",postalcodeNL:"Vul hier een geldige postcode in.",bankaccountNL:"Vul hier een geldig bankrekeningnummer in.",giroaccountNL:"Vul hier een geldig gironummer in.",bankorgiroaccountNL:"Vul hier een geldig bank- of gironummer in."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_no.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_no.js
new file mode 100644
index 0000000000..d6d7be0893
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_no.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: NO (Norwegian; Norsk)
+ */
+$.extend( $.validator.messages, {
+	required: "Angi en verdi.",
+	remote: "Ugyldig verdi.",
+	email: "Angi en gyldig epostadresse.",
+	url: "Angi en gyldig URL.",
+	date: "Angi en gyldig dato.",
+	dateISO: "Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",
+	number: "Angi et gyldig tall.",
+	digits: "Skriv kun tall.",
+	equalTo: "Skriv samme verdi igjen.",
+	maxlength: $.validator.format( "Maksimalt {0} tegn." ),
+	minlength: $.validator.format( "Minimum {0} tegn." ),
+	rangelength: $.validator.format( "Angi minimum {0} og maksimum {1} tegn." ),
+	range: $.validator.format( "Angi en verdi mellom {0} og {1}." ),
+	max: $.validator.format( "Angi en verdi som er mindre eller lik {0}." ),
+	min: $.validator.format( "Angi en verdi som er st&oslash;rre eller lik {0}." ),
+	step: $.validator.format( "Angi en verdi ganger {0}." ),
+	creditcard: "Angi et gyldig kredittkortnummer."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_no.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_no.min.js
new file mode 100644
index 0000000000..7569abcdcd
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_no.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Angi en verdi.",remote:"Ugyldig verdi.",email:"Angi en gyldig epostadresse.",url:"Angi en gyldig URL.",date:"Angi en gyldig dato.",dateISO:"Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",number:"Angi et gyldig tall.",digits:"Skriv kun tall.",equalTo:"Skriv samme verdi igjen.",maxlength:a.validator.format("Maksimalt {0} tegn."),minlength:a.validator.format("Minimum {0} tegn."),rangelength:a.validator.format("Angi minimum {0} og maksimum {1} tegn."),range:a.validator.format("Angi en verdi mellom {0} og {1}."),max:a.validator.format("Angi en verdi som er mindre eller lik {0}."),min:a.validator.format("Angi en verdi som er st&oslash;rre eller lik {0}."),step:a.validator.format("Angi en verdi ganger {0}."),creditcard:"Angi et gyldig kredittkortnummer."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_pl.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_pl.js
new file mode 100644
index 0000000000..fc07b85200
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_pl.js
@@ -0,0 +1,38 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: PL (Polish; język polski, polszczyzna)
+ */
+$.extend( $.validator.messages, {
+	required: "To pole jest wymagane.",
+	remote: "Proszę o wypełnienie tego pola.",
+	email: "Proszę o podanie prawidłowego adresu email.",
+	url: "Proszę o podanie prawidłowego URL.",
+	date: "Proszę o podanie prawidłowej daty.",
+	dateISO: "Proszę o podanie prawidłowej daty (ISO).",
+	number: "Proszę o podanie prawidłowej liczby.",
+	digits: "ProszÄ™ o podanie samych cyfr.",
+	creditcard: "Proszę o podanie prawidłowej karty kredytowej.",
+	equalTo: "Proszę o podanie tej samej wartości ponownie.",
+	extension: "Proszę o podanie wartości z prawidłowym rozszerzeniem.",
+	nipPL: "Proszę o podanie prawidłowego numeru NIP.",
+	phonePL: "Proszę o podanie prawidłowego numeru telefonu",
+	maxlength: $.validator.format( "Proszę o podanie nie więcej niż {0} znaków." ),
+	minlength: $.validator.format( "Proszę o podanie przynajmniej {0} znaków." ),
+	rangelength: $.validator.format( "Proszę o podanie wartości o długości od {0} do {1} znaków." ),
+	range: $.validator.format( "Proszę o podanie wartości z przedziału od {0} do {1}." ),
+	max: $.validator.format( "Proszę o podanie wartości mniejszej bądź równej {0}." ),
+	min: $.validator.format( "Proszę o podanie wartości większej bądź równej {0}." ),
+	pattern: $.validator.format( "Pole zawiera niedozwolone znaki." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_pl.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_pl.min.js
new file mode 100644
index 0000000000..03eba1ba55
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_pl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"To pole jest wymagane.",remote:"Proszę o wypełnienie tego pola.",email:"Proszę o podanie prawidłowego adresu email.",url:"Proszę o podanie prawidłowego URL.",date:"Proszę o podanie prawidłowej daty.",dateISO:"Proszę o podanie prawidłowej daty (ISO).",number:"Proszę o podanie prawidłowej liczby.",digits:"Proszę o podanie samych cyfr.",creditcard:"Proszę o podanie prawidłowej karty kredytowej.",equalTo:"Proszę o podanie tej samej wartości ponownie.",extension:"Proszę o podanie wartości z prawidłowym rozszerzeniem.",nipPL:"Proszę o podanie prawidłowego numeru NIP.",phonePL:"Proszę o podanie prawidłowego numeru telefonu",maxlength:a.validator.format("Proszę o podanie nie więcej niż {0} znaków."),minlength:a.validator.format("Proszę o podanie przynajmniej {0} znaków."),rangelength:a.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),range:a.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),max:a.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),min:a.validator.format("Proszę o podanie wartości większej bądź równej {0}."),pattern:a.validator.format("Pole zawiera niedozwolone znaki.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.js
new file mode 100644
index 0000000000..92d9604c33
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.js
@@ -0,0 +1,91 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: PT (Portuguese; português)
+ * Region: BR (Brazil)
+ */
+$.extend( $.validator.messages, {
+
+	// Core
+	required: "Este campo &eacute; requerido.",
+	remote: "Por favor, corrija este campo.",
+	email: "Por favor, forne&ccedil;a um endere&ccedil;o de email v&aacute;lido.",
+	url: "Por favor, forne&ccedil;a uma URL v&aacute;lida.",
+	date: "Por favor, forne&ccedil;a uma data v&aacute;lida.",
+	dateISO: "Por favor, forne&ccedil;a uma data v&aacute;lida (ISO).",
+	number: "Por favor, forne&ccedil;a um n&uacute;mero v&aacute;lido.",
+	digits: "Por favor, forne&ccedil;a somente d&iacute;gitos.",
+	creditcard: "Por favor, forne&ccedil;a um cart&atilde;o de cr&eacute;dito v&aacute;lido.",
+	equalTo: "Por favor, forne&ccedil;a o mesmo valor novamente.",
+	maxlength: $.validator.format( "Por favor, forne&ccedil;a n&atilde;o mais que {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, forne&ccedil;a ao menos {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, forne&ccedil;a um valor entre {0} e {1} caracteres de comprimento." ),
+	range: $.validator.format( "Por favor, forne&ccedil;a um valor entre {0} e {1}." ),
+	max: $.validator.format( "Por favor, forne&ccedil;a um valor menor ou igual a {0}." ),
+	min: $.validator.format( "Por favor, forne&ccedil;a um valor maior ou igual a {0}." ),
+	step: $.validator.format( "Por favor, forne&ccedil;a um valor m&uacute;ltiplo de {0}." ),
+
+	// Metodos Adicionais
+	maxWords: $.validator.format( "Por favor, forne&ccedil;a com {0} palavras ou menos." ),
+	minWords: $.validator.format( "Por favor, forne&ccedil;a pelo menos {0} palavras." ),
+	rangeWords: $.validator.format( "Por favor, forne&ccedil;a entre {0} e {1} palavras." ),
+	accept: "Por favor, forne&ccedil;a um tipo v&aacute;lido.",
+	alphanumeric: "Por favor, forne&ccedil;a somente com letras, n&uacute;meros e sublinhados.",
+	bankaccountNL: "Por favor, forne&ccedil;a com um n&uacute;mero de conta banc&aacute;ria v&aacute;lida.",
+	bankorgiroaccountNL: "Por favor, forne&ccedil;a um banco v&aacute;lido ou n&uacute;mero de conta.",
+	bic: "Por favor, forne&ccedil;a um c&oacute;digo BIC v&aacute;lido.",
+	cifES: "Por favor, forne&ccedil;a um c&oacute;digo CIF v&aacute;lido.",
+	creditcardtypes: "Por favor, forne&ccedil;a um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",
+	currency: "Por favor, forne&ccedil;a uma moeda v&aacute;lida.",
+	dateFA: "Por favor, forne&ccedil;a uma data correta.",
+	dateITA: "Por favor, forne&ccedil;a uma data correta.",
+	dateNL: "Por favor, forne&ccedil;a uma data correta.",
+	extension: "Por favor, forne&ccedil;a um valor com uma extens&atilde;o v&aacute;lida.",
+	giroaccountNL: "Por favor, forne&ccedil;a um n&uacute;mero de conta corrente v&aacute;lido.",
+	iban: "Por favor, forne&ccedil;a um c&oacute;digo IBAN v&aacute;lido.",
+	integer: "Por favor, forne&ccedil;a um n&uacute;mero n&atilde;o decimal.",
+	ipv4: "Por favor, forne&ccedil;a um IPv4 v&aacute;lido.",
+	ipv6: "Por favor, forne&ccedil;a um IPv6 v&aacute;lido.",
+	lettersonly: "Por favor, forne&ccedil;a apenas com letras.",
+	letterswithbasicpunc: "Por favor, forne&ccedil;a apenas letras ou pontua&ccedil;ões.",
+	mobileNL: "Por favor, fornece&ccedil;a um n&uacute;mero v&aacute;lido de telefone.",
+	mobileUK: "Por favor, fornece&ccedil;a um n&uacute;mero v&aacute;lido de telefone.",
+	nieES: "Por favor, forne&ccedil;a um NIE v&aacute;lido.",
+	nifES: "Por favor, forne&ccedil;a um NIF v&aacute;lido.",
+	nowhitespace: "Por favor, n&atilde;o utilize espa&ccedil;os em branco.",
+	pattern: "O formato fornecido &eacute; inv&aacute;lido.",
+	phoneNL: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	phoneUK: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	phoneUS: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	phonesUK: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	postalCodeCA: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postalcodeIT: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postalcodeNL: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postcodeUK: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postalcodeBR: "Por favor, forne&ccedil;a um CEP v&aacute;lido.",
+	require_from_group: $.validator.format( "Por favor, forne&ccedil;a pelo menos {0} destes campos." ),
+	skip_or_fill_minimum: $.validator.format( "Por favor, optar entre ignorar esses campos ou preencher pelo menos {0} deles." ),
+	stateUS: "Por favor, forne&ccedil;a um estado v&aacute;lido.",
+	strippedminlength: $.validator.format( "Por favor, forne&ccedil;a pelo menos {0} caracteres." ),
+	time: "Por favor, forne&ccedil;a um hor&aacute;rio v&aacute;lido, no intervado de 00:00 a 23:59.",
+	time12h: "Por favor, forne&ccedil;a um hor&aacute;rio v&aacute;lido, no intervado de 01:00 a 12:59 am/pm.",
+	url2: "Por favor, forne&ccedil;a uma URL v&aacute;lida.",
+	vinUS: "O n&uacute;mero de identifica&ccedil;&atilde;o de ve&iacute;culo informado (VIN) &eacute; inv&aacute;lido.",
+	zipcodeUS: "Por favor, forne&ccedil;a um c&oacute;digo postal americano v&aacute;lido.",
+	ziprange: "O c&oacute;digo postal deve estar entre 902xx-xxxx e 905xx-xxxx",
+	cpfBR: "Por favor, forne&ccedil;a um CPF v&aacute;lido.",
+	nisBR: "Por favor, forne&ccedil;a um NIS/PIS v&aacute;lido",
+	cnhBR: "Por favor, forne&ccedil;a um CNH v&aacute;lido.",
+	cnpjBR: "Por favor, forne&ccedil;a um CNPJ v&aacute;lido."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.min.js
new file mode 100644
index 0000000000..f568651041
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_BR.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Este campo &eacute; requerido.",remote:"Por favor, corrija este campo.",email:"Por favor, forne&ccedil;a um endere&ccedil;o de email v&aacute;lido.",url:"Por favor, forne&ccedil;a uma URL v&aacute;lida.",date:"Por favor, forne&ccedil;a uma data v&aacute;lida.",dateISO:"Por favor, forne&ccedil;a uma data v&aacute;lida (ISO).",number:"Por favor, forne&ccedil;a um n&uacute;mero v&aacute;lido.",digits:"Por favor, forne&ccedil;a somente d&iacute;gitos.",creditcard:"Por favor, forne&ccedil;a um cart&atilde;o de cr&eacute;dito v&aacute;lido.",equalTo:"Por favor, forne&ccedil;a o mesmo valor novamente.",maxlength:a.validator.format("Por favor, forne&ccedil;a n&atilde;o mais que {0} caracteres."),minlength:a.validator.format("Por favor, forne&ccedil;a ao menos {0} caracteres."),rangelength:a.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1} caracteres de comprimento."),range:a.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1}."),max:a.validator.format("Por favor, forne&ccedil;a um valor menor ou igual a {0}."),min:a.validator.format("Por favor, forne&ccedil;a um valor maior ou igual a {0}."),step:a.validator.format("Por favor, forne&ccedil;a um valor m&uacute;ltiplo de {0}."),maxWords:a.validator.format("Por favor, forne&ccedil;a com {0} palavras ou menos."),minWords:a.validator.format("Por favor, forne&ccedil;a pelo menos {0} palavras."),rangeWords:a.validator.format("Por favor, forne&ccedil;a entre {0} e {1} palavras."),accept:"Por favor, forne&ccedil;a um tipo v&aacute;lido.",alphanumeric:"Por favor, forne&ccedil;a somente com letras, n&uacute;meros e sublinhados.",bankaccountNL:"Por favor, forne&ccedil;a com um n&uacute;mero de conta banc&aacute;ria v&aacute;lida.",bankorgiroaccountNL:"Por favor, forne&ccedil;a um banco v&aacute;lido ou n&uacute;mero de conta.",bic:"Por favor, forne&ccedil;a um c&oacute;digo BIC v&aacute;lido.",cifES:"Por favor, forne&ccedil;a um c&oacute;digo CIF v&aacute;lido.",creditcardtypes:"Por favor, forne&ccedil;a um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",currency:"Por favor, forne&ccedil;a uma moeda v&aacute;lida.",dateFA:"Por favor, forne&ccedil;a uma data correta.",dateITA:"Por favor, forne&ccedil;a uma data correta.",dateNL:"Por favor, forne&ccedil;a uma data correta.",extension:"Por favor, forne&ccedil;a um valor com uma extens&atilde;o v&aacute;lida.",giroaccountNL:"Por favor, forne&ccedil;a um n&uacute;mero de conta corrente v&aacute;lido.",iban:"Por favor, forne&ccedil;a um c&oacute;digo IBAN v&aacute;lido.",integer:"Por favor, forne&ccedil;a um n&uacute;mero n&atilde;o decimal.",ipv4:"Por favor, forne&ccedil;a um IPv4 v&aacute;lido.",ipv6:"Por favor, forne&ccedil;a um IPv6 v&aacute;lido.",lettersonly:"Por favor, forne&ccedil;a apenas com letras.",letterswithbasicpunc:"Por favor, forne&ccedil;a apenas letras ou pontua&ccedil;ões.",mobileNL:"Por favor, fornece&ccedil;a um n&uacute;mero v&aacute;lido de telefone.",mobileUK:"Por favor, fornece&ccedil;a um n&uacute;mero v&aacute;lido de telefone.",nieES:"Por favor, forne&ccedil;a um NIE v&aacute;lido.",nifES:"Por favor, forne&ccedil;a um NIF v&aacute;lido.",nowhitespace:"Por favor, n&atilde;o utilize espa&ccedil;os em branco.",pattern:"O formato fornecido &eacute; inv&aacute;lido.",phoneNL:"Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",phoneUK:"Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",phoneUS:"Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",phonesUK:"Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",postalCodeCA:"Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",postalcodeIT:"Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",postalcodeNL:"Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",postcodeUK:"Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",postalcodeBR:"Por favor, forne&ccedil;a um CEP v&aacute;lido.",require_from_group:a.validator.format("Por favor, forne&ccedil;a pelo menos {0} destes campos."),skip_or_fill_minimum:a.validator.format("Por favor, optar entre ignorar esses campos ou preencher pelo menos {0} deles."),stateUS:"Por favor, forne&ccedil;a um estado v&aacute;lido.",strippedminlength:a.validator.format("Por favor, forne&ccedil;a pelo menos {0} caracteres."),time:"Por favor, forne&ccedil;a um hor&aacute;rio v&aacute;lido, no intervado de 00:00 a 23:59.",time12h:"Por favor, forne&ccedil;a um hor&aacute;rio v&aacute;lido, no intervado de 01:00 a 12:59 am/pm.",url2:"Por favor, forne&ccedil;a uma URL v&aacute;lida.",vinUS:"O n&uacute;mero de identifica&ccedil;&atilde;o de ve&iacute;culo informado (VIN) &eacute; inv&aacute;lido.",zipcodeUS:"Por favor, forne&ccedil;a um c&oacute;digo postal americano v&aacute;lido.",ziprange:"O c&oacute;digo postal deve estar entre 902xx-xxxx e 905xx-xxxx",cpfBR:"Por favor, forne&ccedil;a um CPF v&aacute;lido.",nisBR:"Por favor, forne&ccedil;a um NIS/PIS v&aacute;lido",cnhBR:"Por favor, forne&ccedil;a um CNH v&aacute;lido.",cnpjBR:"Por favor, forne&ccedil;a um CNPJ v&aacute;lido."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.js
new file mode 100644
index 0000000000..d3b3ae5794
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.js
@@ -0,0 +1,39 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: PT (Portuguese; português)
+ * Region: PT (Portugal)
+ */
+$.extend( $.validator.messages, {
+	required: "Campo de preenchimento obrigat&oacute;rio.",
+	remote: "Por favor, corrija este campo.",
+	email: "Por favor, introduza um endere&ccedil;o eletr&oacute;nico v&aacute;lido.",
+	url: "Por favor, introduza um URL v&aacute;lido.",
+	date: "Por favor, introduza uma data v&aacute;lida.",
+	dateISO: "Por favor, introduza uma data v&aacute;lida (ISO).",
+	number: "Por favor, introduza um n&uacute;mero v&aacute;lido.",
+	digits: "Por favor, introduza apenas d&iacute;gitos.",
+	creditcard: "Por favor, introduza um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",
+	equalTo: "Por favor, introduza de novo o mesmo valor.",
+	extension: "Por favor, introduza um ficheiro com uma extens&atilde;o v&aacute;lida.",
+	maxlength: $.validator.format( "Por favor, n&atilde;o introduza mais do que {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, introduza pelo menos {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, introduza entre {0} e {1} caracteres." ),
+	range: $.validator.format( "Por favor, introduza um valor entre {0} e {1}." ),
+	max: $.validator.format( "Por favor, introduza um valor menor ou igual a {0}." ),
+	min: $.validator.format( "Por favor, introduza um valor maior ou igual a {0}." ),
+	nifES: "Por favor, introduza um NIF v&aacute;lido.",
+	nieES: "Por favor, introduza um NIE v&aacute;lido.",
+	cifES: "Por favor, introduza um CIF v&aacute;lido."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.min.js
new file mode 100644
index 0000000000..867c3164df
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_pt_PT.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Campo de preenchimento obrigat&oacute;rio.",remote:"Por favor, corrija este campo.",email:"Por favor, introduza um endere&ccedil;o eletr&oacute;nico v&aacute;lido.",url:"Por favor, introduza um URL v&aacute;lido.",date:"Por favor, introduza uma data v&aacute;lida.",dateISO:"Por favor, introduza uma data v&aacute;lida (ISO).",number:"Por favor, introduza um n&uacute;mero v&aacute;lido.",digits:"Por favor, introduza apenas d&iacute;gitos.",creditcard:"Por favor, introduza um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",equalTo:"Por favor, introduza de novo o mesmo valor.",extension:"Por favor, introduza um ficheiro com uma extens&atilde;o v&aacute;lida.",maxlength:a.validator.format("Por favor, n&atilde;o introduza mais do que {0} caracteres."),minlength:a.validator.format("Por favor, introduza pelo menos {0} caracteres."),rangelength:a.validator.format("Por favor, introduza entre {0} e {1} caracteres."),range:a.validator.format("Por favor, introduza um valor entre {0} e {1}."),max:a.validator.format("Por favor, introduza um valor menor ou igual a {0}."),min:a.validator.format("Por favor, introduza um valor maior ou igual a {0}."),nifES:"Por favor, introduza um NIF v&aacute;lido.",nieES:"Por favor, introduza um NIE v&aacute;lido.",cifES:"Por favor, introduza um CIF v&aacute;lido."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ro.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ro.js
new file mode 100644
index 0000000000..45ce0c6115
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ro.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: RO (Romanian, limba română)
+ */
+$.extend( $.validator.messages, {
+	required: "Acest câmp este obligatoriu.",
+	remote: "Te rugăm să completezi acest câmp.",
+	email: "Te rugăm să introduci o adresă de email validă",
+	url: "Te rugăm sa introduci o adresă URL validă.",
+	date: "Te rugăm să introduci o dată corectă.",
+	dateISO: "Te rugăm să introduci o dată (ISO) corectă.",
+	number: "Te rugăm să introduci un număr întreg valid.",
+	digits: "Te rugăm să introduci doar cifre.",
+	creditcard: "Te rugăm să introduci un numar de carte de credit valid.",
+	equalTo: "Te rugăm să reintroduci valoarea.",
+	extension: "Te rugăm să introduci o valoare cu o extensie validă.",
+	maxlength: $.validator.format( "Te rugăm să nu introduci mai mult de {0} caractere." ),
+	minlength: $.validator.format( "Te rugăm să introduci cel puțin {0} caractere." ),
+	rangelength: $.validator.format( "Te rugăm să introduci o valoare între {0} și {1} caractere." ),
+	range: $.validator.format( "Te rugăm să introduci o valoare între {0} și {1}." ),
+	max: $.validator.format( "Te rugăm să introduci o valoare egal sau mai mică decât {0}." ),
+	min: $.validator.format( "Te rugăm să introduci o valoare egal sau mai mare decât {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ro.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ro.min.js
new file mode 100644
index 0000000000..c0dcc47b42
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ro.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Acest câmp este obligatoriu.",remote:"Te rugăm să completezi acest câmp.",email:"Te rugăm să introduci o adresă de email validă",url:"Te rugăm sa introduci o adresă URL validă.",date:"Te rugăm să introduci o dată corectă.",dateISO:"Te rugăm să introduci o dată (ISO) corectă.",number:"Te rugăm să introduci un număr întreg valid.",digits:"Te rugăm să introduci doar cifre.",creditcard:"Te rugăm să introduci un numar de carte de credit valid.",equalTo:"Te rugăm să reintroduci valoarea.",extension:"Te rugăm să introduci o valoare cu o extensie validă.",maxlength:a.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),minlength:a.validator.format("Te rugăm să introduci cel puțin {0} caractere."),rangelength:a.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),range:a.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),max:a.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),min:a.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ru.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ru.js
new file mode 100644
index 0000000000..9f600510d1
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ru.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: RU (Russian; русский язык)
+ */
+$.extend( $.validator.messages, {
+	required: "Это поле необходимо заполнить.",
+	remote: "Пожалуйста, введите правильное значение.",
+	email: "Пожалуйста, введите корректный адрес электронной почты.",
+	url: "Пожалуйста, введите корректный URL.",
+	date: "Пожалуйста, введите корректную дату.",
+	dateISO: "Пожалуйста, введите корректную дату в формате ISO.",
+	number: "Пожалуйста, введите число.",
+	digits: "Пожалуйста, вводите только цифры.",
+	creditcard: "Пожалуйста, введите правильный номер кредитной карты.",
+	equalTo: "Пожалуйста, введите такое же значение ещё раз.",
+	extension: "Пожалуйста, выберите файл с правильным расширением.",
+	maxlength: $.validator.format( "Пожалуйста, введите не больше {0} символов." ),
+	minlength: $.validator.format( "Пожалуйста, введите не меньше {0} символов." ),
+	rangelength: $.validator.format( "Пожалуйста, введите значение длиной от {0} до {1} символов." ),
+	range: $.validator.format( "Пожалуйста, введите число от {0} до {1}." ),
+	max: $.validator.format( "Пожалуйста, введите число, меньшее или равное {0}." ),
+	min: $.validator.format( "Пожалуйста, введите число, большее или равное {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ru.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ru.min.js
new file mode 100644
index 0000000000..2a0246000b
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ru.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Это поле необходимо заполнить.",remote:"Пожалуйста, введите правильное значение.",email:"Пожалуйста, введите корректный адрес электронной почты.",url:"Пожалуйста, введите корректный URL.",date:"Пожалуйста, введите корректную дату.",dateISO:"Пожалуйста, введите корректную дату в формате ISO.",number:"Пожалуйста, введите число.",digits:"Пожалуйста, вводите только цифры.",creditcard:"Пожалуйста, введите правильный номер кредитной карты.",equalTo:"Пожалуйста, введите такое же значение ещё раз.",extension:"Пожалуйста, выберите файл с правильным расширением.",maxlength:a.validator.format("Пожалуйста, введите не больше {0} символов."),minlength:a.validator.format("Пожалуйста, введите не меньше {0} символов."),rangelength:a.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}."),max:a.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),min:a.validator.format("Пожалуйста, введите число, большее или равное {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sd.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sd.js
new file mode 100644
index 0000000000..25741679fb
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sd.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SD (Sindhi; سنڌي)
+ */
+$.extend( $.validator.messages, {
+    required: "هنن جاين جي ضرورت آهي",
+    remote: "هنن جاين جي ضرورت آهي",
+    email: "لکيل اي ميل غلط آهي",
+    url: "لکيل ايڊريس غلط آهي",
+    date: "لکيل تاريخ غلط آهي",
+    dateISO: "جي معيار جي مطابق نه آهي (ISO) لکيل تاريخ",
+    number: "لکيل انگ صحيح ناهي",
+    digits: "رڳو انگ داخل ڪري سگهجي ٿو",
+    creditcard: "لکيل ڪارڊ نمبر صحيح نه آهي",
+    equalTo: "داخل ٿيل ڀيٽ صحيح نه آهي",
+    extension: "لکيل غلط آهي",
+    maxlength: $.validator.format( "وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي" ),
+    minlength: $.validator.format( "گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي" ),
+    rangelength: $.validator.format( "داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي" ),
+    range: $.validator.format( "داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي" ),
+    max: $.validator.format( "وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي" ),
+    min: $.validator.format( "گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sd.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sd.min.js
new file mode 100644
index 0000000000..1ce64bbc09
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sd.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"هنن جاين جي ضرورت آهي",remote:"هنن جاين جي ضرورت آهي",email:"لکيل اي ميل غلط آهي",url:"لکيل ايڊريس غلط آهي",date:"لکيل تاريخ غلط آهي",dateISO:"جي معيار جي مطابق نه آهي (ISO) لکيل تاريخ",number:"لکيل انگ صحيح ناهي",digits:"رڳو انگ داخل ڪري سگهجي ٿو",creditcard:"لکيل ڪارڊ نمبر صحيح نه آهي",equalTo:"داخل ٿيل ڀيٽ صحيح نه آهي",extension:"لکيل غلط آهي",maxlength:a.validator.format("وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي"),minlength:a.validator.format("گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي"),rangelength:a.validator.format("داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي"),range:a.validator.format("داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي"),max:a.validator.format("وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي"),min:a.validator.format("گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_si.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_si.js
new file mode 100644
index 0000000000..8d45b74adf
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_si.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SI (Slovenian)
+ */
+$.extend( $.validator.messages, {
+	required: "To polje je obvezno.",
+	remote: "Vpis v tem polju ni v pravi obliki.",
+	email: "Prosimo, vnesite pravi email naslov.",
+	url: "Prosimo, vnesite pravi URL.",
+	date: "Prosimo, vnesite pravi datum.",
+	dateISO: "Prosimo, vnesite pravi datum (ISO).",
+	number: "Prosimo, vnesite pravo Å¡tevilko.",
+	digits: "Prosimo, vnesite samo Å¡tevilke.",
+	creditcard: "Prosimo, vnesite pravo Å¡tevilko kreditne kartice.",
+	equalTo: "Prosimo, ponovno vnesite enako vsebino.",
+	extension: "Prosimo, vnesite vsebino z pravo končnico.",
+	maxlength: $.validator.format( "Prosimo, da ne vnašate več kot {0} znakov." ),
+	minlength: $.validator.format( "Prosimo, vnesite vsaj {0} znakov." ),
+	rangelength: $.validator.format( "Prosimo, vnesite od {0} do {1} znakov." ),
+	range: $.validator.format( "Prosimo, vnesite vrednost med {0} in {1}." ),
+	max: $.validator.format( "Prosimo, vnesite vrednost manjšo ali enako {0}." ),
+	min: $.validator.format( "Prosimo, vnesite vrednost večjo ali enako {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_si.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_si.min.js
new file mode 100644
index 0000000000..05e2a4895d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_si.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Vpis v tem polju ni v pravi obliki.",email:"Prosimo, vnesite pravi email naslov.",url:"Prosimo, vnesite pravi URL.",date:"Prosimo, vnesite pravi datum.",dateISO:"Prosimo, vnesite pravi datum (ISO).",number:"Prosimo, vnesite pravo številko.",digits:"Prosimo, vnesite samo številke.",creditcard:"Prosimo, vnesite pravo številko kreditne kartice.",equalTo:"Prosimo, ponovno vnesite enako vsebino.",extension:"Prosimo, vnesite vsebino z pravo končnico.",maxlength:a.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),minlength:a.validator.format("Prosimo, vnesite vsaj {0} znakov."),rangelength:a.validator.format("Prosimo, vnesite od {0} do {1} znakov."),range:a.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),min:a.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sk.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sk.js
new file mode 100644
index 0000000000..0f9becf59f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sk.js
@@ -0,0 +1,33 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SK (Slovak; slovenčina, slovenský jazyk)
+ */
+$.extend( $.validator.messages, {
+	required: "Povinné zadať.",
+	maxlength: $.validator.format( "Maximálne {0} znakov." ),
+	minlength: $.validator.format( "Minimálne {0} znakov." ),
+	rangelength: $.validator.format( "Minimálne {0} a maximálne {1} znakov." ),
+	email: "E-mailová adresa musí byť platná.",
+	url: "URL musí byť platná.",
+	date: "Musí byť dátum.",
+	number: "Musí byť číslo.",
+	digits: "Môže obsahovať iba číslice.",
+	equalTo: "Dve hodnoty sa musia rovnať.",
+	range: $.validator.format( "Musí byť medzi {0} a {1}." ),
+	max: $.validator.format( "Nemôže byť viac ako {0}." ),
+	min: $.validator.format( "Nemôže byť menej ako {0}." ),
+	creditcard: "Číslo platobnej karty musí byť platné.",
+	step: $.validator.format( "Musí byť násobkom čísla {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sk.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sk.min.js
new file mode 100644
index 0000000000..581a13d102
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Povinné zadať.",maxlength:a.validator.format("Maximálne {0} znakov."),minlength:a.validator.format("Minimálne {0} znakov."),rangelength:a.validator.format("Minimálne {0} a maximálne {1} znakov."),email:"E-mailová adresa musí byť platná.",url:"URL musí byť platná.",date:"Musí byť dátum.",number:"Musí byť číslo.",digits:"Môže obsahovať iba číslice.",equalTo:"Dve hodnoty sa musia rovnať.",range:a.validator.format("Musí byť medzi {0} a {1}."),max:a.validator.format("Nemôže byť viac ako {0}."),min:a.validator.format("Nemôže byť menej ako {0}."),creditcard:"Číslo platobnej karty musí byť platné.",step:a.validator.format("Musí byť násobkom čísla {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sl.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sl.js
new file mode 100644
index 0000000000..9902b44828
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sl.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Language: SL (Slovenian; slovenski jezik)
+ */
+$.extend( $.validator.messages, {
+	required: "To polje je obvezno.",
+	remote: "Prosimo popravite to polje.",
+	email: "Prosimo vnesite veljaven email naslov.",
+	url: "Prosimo vnesite veljaven URL naslov.",
+	date: "Prosimo vnesite veljaven datum.",
+	dateISO: "Prosimo vnesite veljaven ISO datum.",
+	number: "Prosimo vnesite veljavno Å¡tevilo.",
+	digits: "Prosimo vnesite samo Å¡tevila.",
+	creditcard: "Prosimo vnesite veljavno Å¡tevilko kreditne kartice.",
+	equalTo: "Prosimo ponovno vnesite vrednost.",
+	extension: "Prosimo vnesite vrednost z veljavno končnico.",
+	maxlength: $.validator.format( "Prosimo vnesite največ {0} znakov." ),
+	minlength: $.validator.format( "Prosimo vnesite najmanj {0} znakov." ),
+	rangelength: $.validator.format( "Prosimo vnesite najmanj {0} in največ {1} znakov." ),
+	range: $.validator.format( "Prosimo vnesite vrednost med {0} in {1}." ),
+	max: $.validator.format( "Prosimo vnesite vrednost manjše ali enako {0}." ),
+	min: $.validator.format( "Prosimo vnesite vrednost večje ali enako {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sl.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sl.min.js
new file mode 100644
index 0000000000..9ac8718ce0
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Prosimo popravite to polje.",email:"Prosimo vnesite veljaven email naslov.",url:"Prosimo vnesite veljaven URL naslov.",date:"Prosimo vnesite veljaven datum.",dateISO:"Prosimo vnesite veljaven ISO datum.",number:"Prosimo vnesite veljavno število.",digits:"Prosimo vnesite samo števila.",creditcard:"Prosimo vnesite veljavno številko kreditne kartice.",equalTo:"Prosimo ponovno vnesite vrednost.",extension:"Prosimo vnesite vrednost z veljavno končnico.",maxlength:a.validator.format("Prosimo vnesite največ {0} znakov."),minlength:a.validator.format("Prosimo vnesite najmanj {0} znakov."),rangelength:a.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),range:a.validator.format("Prosimo vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),min:a.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sr.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr.js
new file mode 100644
index 0000000000..f6c5143c06
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SR (Serbian; српски језик)
+ */
+$.extend( $.validator.messages, {
+	required: "Поље је обавезно.",
+	remote: "Средите ово поље.",
+	email: "Унесите исправну и-мејл адресу.",
+	url: "Унесите исправан URL.",
+	date: "Унесите исправан датум.",
+	dateISO: "Унесите исправан датум (ISO).",
+	number: "Унесите исправан број.",
+	digits: "Унесите само цифе.",
+	creditcard: "Унесите исправан број кредитне картице.",
+	equalTo: "Унесите исту вредност поново.",
+	extension: "Унесите вредност са одговарајућом екстензијом.",
+	maxlength: $.validator.format( "Унесите мање од {0} карактера." ),
+	minlength: $.validator.format( "Унесите барем {0} карактера." ),
+	rangelength: $.validator.format( "Унесите вредност дугачку између {0} и {1} карактера." ),
+	range: $.validator.format( "Унесите вредност између {0} и {1}." ),
+	max: $.validator.format( "Унесите вредност мању или једнаку {0}." ),
+	min: $.validator.format( "Унесите вредност већу или једнаку {0}." ),
+	step: $.validator.format( "Унесите вредност која је умножак броја {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sr.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr.min.js
new file mode 100644
index 0000000000..a6a804576d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Поље је обавезно.",remote:"Средите ово поље.",email:"Унесите исправну и-мејл адресу.",url:"Унесите исправан URL.",date:"Унесите исправан датум.",dateISO:"Унесите исправан датум (ISO).",number:"Унесите исправан број.",digits:"Унесите само цифе.",creditcard:"Унесите исправан број кредитне картице.",equalTo:"Унесите исту вредност поново.",extension:"Унесите вредност са одговарајућом екстензијом.",maxlength:a.validator.format("Унесите мање од {0} карактера."),minlength:a.validator.format("Унесите барем {0} карактера."),rangelength:a.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),range:a.validator.format("Унесите вредност између {0} и {1}."),max:a.validator.format("Унесите вредност мању или једнаку {0}."),min:a.validator.format("Унесите вредност већу или једнаку {0}."),step:a.validator.format("Унесите вредност која је умножак броја {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.js
new file mode 100644
index 0000000000..28560c29c0
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SR (Serbian - Latin alphabet; srpski jezik - latinica)
+ */
+$.extend( $.validator.messages, {
+	required: "Polje je obavezno.",
+	remote: "Sredite ovo polje.",
+	email: "Unesite ispravnu e-mail adresu",
+	url: "Unesite ispravan URL.",
+	date: "Unesite ispravan datum.",
+	dateISO: "Unesite ispravan datum (ISO).",
+	number: "Unesite ispravan broj.",
+	digits: "Unesite samo cifre.",
+	creditcard: "Unesite ispravan broj kreditne kartice.",
+	equalTo: "Unesite istu vrednost ponovo.",
+	extension: "Unesite vrednost sa odgovarajućom ekstenzijom.",
+	maxlength: $.validator.format( "Unesite manje od {0} karaktera." ),
+	minlength: $.validator.format( "Unesite barem {0} karaktera." ),
+	rangelength: $.validator.format( "Unesite vrednost dugačku između {0} i {1} karaktera." ),
+	range: $.validator.format( "Unesite vrednost između {0} i {1}." ),
+	max: $.validator.format( "Unesite vrednost manju ili jednaku {0}." ),
+	min: $.validator.format( "Unesite vrednost veću ili jednaku {0}." ),
+	step: $.validator.format( "Unesite vrednost koja je umnožak broja {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.min.js
new file mode 100644
index 0000000000..28cf8e3a16
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sr_lat.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Polje je obavezno.",remote:"Sredite ovo polje.",email:"Unesite ispravnu e-mail adresu",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo cifre.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite istu vrednost ponovo.",extension:"Unesite vrednost sa odgovarajućom ekstenzijom.",maxlength:a.validator.format("Unesite manje od {0} karaktera."),minlength:a.validator.format("Unesite barem {0} karaktera."),rangelength:a.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),range:a.validator.format("Unesite vrednost između {0} i {1}."),max:a.validator.format("Unesite vrednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrednost veću ili jednaku {0}."),step:a.validator.format("Unesite vrednost koja je umnožak broja {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sv.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sv.js
new file mode 100644
index 0000000000..c19e8ca021
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sv.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SV (Swedish; Svenska)
+ */
+$.extend( $.validator.messages, {
+	required: "Detta f&auml;lt &auml;r obligatoriskt.",
+	remote: "Var snäll och åtgärda detta fält.",
+	maxlength: $.validator.format( "Du f&aring;r ange h&ouml;gst {0} tecken." ),
+	minlength: $.validator.format( "Du m&aring;ste ange minst {0} tecken." ),
+	rangelength: $.validator.format( "Ange minst {0} och max {1} tecken." ),
+	email: "Ange en korrekt e-postadress.",
+	url: "Ange en korrekt URL.",
+	date: "Ange ett korrekt datum.",
+	dateISO: "Ange ett korrekt datum (&Aring;&Aring;&Aring;&Aring;-MM-DD).",
+	number: "Ange ett korrekt nummer.",
+	digits: "Ange endast siffror.",
+	equalTo: "Ange samma v&auml;rde igen.",
+	range: $.validator.format( "Ange ett v&auml;rde mellan {0} och {1}." ),
+	max: $.validator.format( "Ange ett v&auml;rde som &auml;r mindre eller lika med {0}." ),
+	min: $.validator.format( "Ange ett v&auml;rde som &auml;r st&ouml;rre eller lika med {0}." ),
+	creditcard: "Ange ett korrekt kreditkortsnummer.",
+	pattern: "Ogiltigt format."
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_sv.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_sv.min.js
new file mode 100644
index 0000000000..22da363775
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_sv.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Detta f&auml;lt &auml;r obligatoriskt.",remote:"Var snäll och åtgärda detta fält.",maxlength:a.validator.format("Du f&aring;r ange h&ouml;gst {0} tecken."),minlength:a.validator.format("Du m&aring;ste ange minst {0} tecken."),rangelength:a.validator.format("Ange minst {0} och max {1} tecken."),email:"Ange en korrekt e-postadress.",url:"Ange en korrekt URL.",date:"Ange ett korrekt datum.",dateISO:"Ange ett korrekt datum (&Aring;&Aring;&Aring;&Aring;-MM-DD).",number:"Ange ett korrekt nummer.",digits:"Ange endast siffror.",equalTo:"Ange samma v&auml;rde igen.",range:a.validator.format("Ange ett v&auml;rde mellan {0} och {1}."),max:a.validator.format("Ange ett v&auml;rde som &auml;r mindre eller lika med {0}."),min:a.validator.format("Ange ett v&auml;rde som &auml;r st&ouml;rre eller lika med {0}."),creditcard:"Ange ett korrekt kreditkortsnummer.",pattern:"Ogiltigt format."}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_th.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_th.js
new file mode 100644
index 0000000000..0ca954d3a7
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_th.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: TH (Thai; ไทย)
+ */
+$.extend( $.validator.messages, {
+	required: "โปรดระบุ",
+	remote: "โปรดแก้ไขให้ถูกต้อง",
+	email: "โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",
+	url: "โปรดระบุ URL ที่ถูกต้อง",
+	date: "โปรดระบุวันที่ ที่ถูกต้อง",
+	dateISO: "โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",
+	number: "โปรดระบุทศนิยมที่ถูกต้อง",
+	digits: "โปรดระบุจำนวนเต็มที่ถูกต้อง",
+	creditcard: "โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",
+	equalTo: "โปรดระบุค่าเดิมอีกครั้ง",
+	extension: "โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",
+	maxlength: $.validator.format( "โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ" ),
+	minlength: $.validator.format( "โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ" ),
+	rangelength: $.validator.format( "โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ" ),
+	range: $.validator.format( "โปรดระบุค่าระหว่าง {0} และ {1}" ),
+	max: $.validator.format( "โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}" ),
+	min: $.validator.format( "โปรดระบุค่ามากกว่าหรือเท่ากับ {0}" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_th.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_th.min.js
new file mode 100644
index 0000000000..fdf1af2426
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_th.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"โปรดระบุ",remote:"โปรดแก้ไขให้ถูกต้อง",email:"โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",url:"โปรดระบุ URL ที่ถูกต้อง",date:"โปรดระบุวันที่ ที่ถูกต้อง",dateISO:"โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",number:"โปรดระบุทศนิยมที่ถูกต้อง",digits:"โปรดระบุจำนวนเต็มที่ถูกต้อง",creditcard:"โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",equalTo:"โปรดระบุค่าเดิมอีกครั้ง",extension:"โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",maxlength:a.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),minlength:a.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),rangelength:a.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),range:a.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),max:a.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),min:a.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_tj.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_tj.js
new file mode 100644
index 0000000000..dfe45feed0
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_tj.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: TJ (Tajikistan; Забони тоҷикӣ)
+ */
+$.extend( $.validator.messages, {
+	required: "Ворид кардани ин филд маҷбури аст.",
+	remote: "Илтимос, маълумоти саҳеҳ ворид кунед.",
+	email: "Илтимос, почтаи электронии саҳеҳ ворид кунед.",
+	url: "Илтимос, URL адреси саҳеҳ ворид кунед.",
+	date: "Илтимос, таърихи саҳеҳ ворид кунед.",
+	dateISO: "Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",
+	number: "Илтимос, рақамҳои саҳеҳ ворид кунед.",
+	digits: "Илтимос, танҳо рақам ворид кунед.",
+	creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.",
+	equalTo: "Илтимос, миқдори баробар ворид кунед.",
+	extension: "Илтимос, қофияи файлро дуруст интихоб кунед",
+	maxlength: $.validator.format( "Илтимос, бештар аз {0} рамз ворид накунед." ),
+	minlength: $.validator.format( "Илтимос, камтар аз {0} рамз ворид накунед." ),
+	rangelength: $.validator.format( "Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед." ),
+	range: $.validator.format( "Илтимос, аз {0} то {1} рақам зиёд ворид кунед." ),
+	max: $.validator.format( "Илтимос, бештар аз {0} рақам ворид накунед." ),
+	min: $.validator.format( "Илтимос, камтар аз {0} рақам ворид накунед." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_tj.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_tj.min.js
new file mode 100644
index 0000000000..16df53db5d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_tj.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Ворид кардани ин филд маҷбури аст.",remote:"Илтимос, маълумоти саҳеҳ ворид кунед.",email:"Илтимос, почтаи электронии саҳеҳ ворид кунед.",url:"Илтимос, URL адреси саҳеҳ ворид кунед.",date:"Илтимос, таърихи саҳеҳ ворид кунед.",dateISO:"Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",number:"Илтимос, рақамҳои саҳеҳ ворид кунед.",digits:"Илтимос, танҳо рақам ворид кунед.",creditcard:"Илтимос, кредит карди саҳеҳ ворид кунед.",equalTo:"Илтимос, миқдори баробар ворид кунед.",extension:"Илтимос, қофияи файлро дуруст интихоб кунед",maxlength:a.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),minlength:a.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),rangelength:a.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),range:a.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),max:a.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),min:a.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_tr.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_tr.js
new file mode 100644
index 0000000000..bb8c32ee89
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_tr.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: TR (Turkish; Türkçe)
+ */
+$.extend( $.validator.messages, {
+	required: "Bu alanın doldurulması zorunludur.",
+	remote: "Lütfen bu alanı düzeltin.",
+	email: "Lütfen geçerli bir e-posta adresi giriniz.",
+	url: "Lütfen geçerli bir web adresi (URL) giriniz.",
+	date: "Lütfen geçerli bir tarih giriniz.",
+	dateISO: "Lütfen geçerli bir tarih giriniz(ISO formatında)",
+	number: "Lütfen geçerli bir sayı giriniz.",
+	digits: "Lütfen sadece sayısal karakterler giriniz.",
+	creditcard: "Lütfen geçerli bir kredi kartı giriniz.",
+	equalTo: "Lütfen aynı değeri tekrar giriniz.",
+	extension: "Lütfen geçerli uzantıya sahip bir değer giriniz.",
+	maxlength: $.validator.format( "Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz." ),
+	minlength: $.validator.format( "Lütfen en az {0} karakter uzunluğunda bir değer giriniz." ),
+	rangelength: $.validator.format( "Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz." ),
+	range: $.validator.format( "Lütfen {0} ile {1} arasında bir değer giriniz." ),
+	max: $.validator.format( "Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz." ),
+	min: $.validator.format( "Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz." ),
+	require_from_group: $.validator.format( "Lütfen bu alanların en az {0} tanesini doldurunuz." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_tr.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_tr.min.js
new file mode 100644
index 0000000000..bf9edb5215
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_tr.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Bu alanın doldurulması zorunludur.",remote:"Lütfen bu alanı düzeltin.",email:"Lütfen geçerli bir e-posta adresi giriniz.",url:"Lütfen geçerli bir web adresi (URL) giriniz.",date:"Lütfen geçerli bir tarih giriniz.",dateISO:"Lütfen geçerli bir tarih giriniz(ISO formatında)",number:"Lütfen geçerli bir sayı giriniz.",digits:"Lütfen sadece sayısal karakterler giriniz.",creditcard:"Lütfen geçerli bir kredi kartı giriniz.",equalTo:"Lütfen aynı değeri tekrar giriniz.",extension:"Lütfen geçerli uzantıya sahip bir değer giriniz.",maxlength:a.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),minlength:a.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),rangelength:a.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),range:a.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),max:a.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),min:a.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz."),require_from_group:a.validator.format("Lütfen bu alanların en az {0} tanesini doldurunuz.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_uk.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_uk.js
new file mode 100644
index 0000000000..9531a95718
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_uk.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: UK (Ukrainian; українська мова)
+ */
+$.extend( $.validator.messages, {
+	required: "Це поле необхідно заповнити.",
+	remote: "Будь ласка, введіть правильне значення.",
+	email: "Будь ласка, введіть коректну адресу електронної пошти.",
+	url: "Будь ласка, введіть коректний URL.",
+	date: "Будь ласка, введіть коректну дату.",
+	dateISO: "Будь ласка, введіть коректну дату у форматі ISO.",
+	number: "Будь ласка, введіть число.",
+	digits: "Вводите потрібно лише цифри.",
+	creditcard: "Будь ласка, введіть правильний номер кредитної карти.",
+	equalTo: "Будь ласка, введіть таке ж значення ще раз.",
+	extension: "Будь ласка, виберіть файл з правильним розширенням.",
+	maxlength: $.validator.format( "Будь ласка, введіть не більше {0} символів." ),
+	minlength: $.validator.format( "Будь ласка, введіть не менше {0} символів." ),
+	rangelength: $.validator.format( "Будь ласка, введіть значення довжиною від {0} до {1} символів." ),
+	range: $.validator.format( "Будь ласка, введіть число від {0} до {1}." ),
+	max: $.validator.format( "Будь ласка, введіть число, менше або рівно {0}." ),
+	min: $.validator.format( "Будь ласка, введіть число, більше або рівно {0}." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_uk.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_uk.min.js
new file mode 100644
index 0000000000..0538a18649
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_uk.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Це поле необхідно заповнити.",remote:"Будь ласка, введіть правильне значення.",email:"Будь ласка, введіть коректну адресу електронної пошти.",url:"Будь ласка, введіть коректний URL.",date:"Будь ласка, введіть коректну дату.",dateISO:"Будь ласка, введіть коректну дату у форматі ISO.",number:"Будь ласка, введіть число.",digits:"Вводите потрібно лише цифри.",creditcard:"Будь ласка, введіть правильний номер кредитної карти.",equalTo:"Будь ласка, введіть таке ж значення ще раз.",extension:"Будь ласка, виберіть файл з правильним розширенням.",maxlength:a.validator.format("Будь ласка, введіть не більше {0} символів."),minlength:a.validator.format("Будь ласка, введіть не менше {0} символів."),rangelength:a.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),range:a.validator.format("Будь ласка, введіть число від {0} до {1}."),max:a.validator.format("Будь ласка, введіть число, менше або рівно {0}."),min:a.validator.format("Будь ласка, введіть число, більше або рівно {0}.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ur.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ur.js
new file mode 100644
index 0000000000..1327da075c
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ur.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: UR (Urdu; اردو)
+ */
+$.extend( $.validator.messages, {
+	required: "ان معلومات کا اندراج ضروری ہے",
+	remote: "ان معلومات کا اندراج ضروری ہے",
+	email: "درج کی ہوئی ای میل درست نہیں ہے",
+	url: "درج کیا گیا پتہ درست نہیں ہے",
+	date: "درج کی گئی تاریخ درست نہیں ہے",
+	dateISO: "معیار کے مطابق نہیں ہے (ISO) درج کی گئی تاریخ",
+	number: "درج کیےگئے ہندسے درست نہیں ہیں",
+	digits: "صرف ہندسے اندراج کئے جاسکتے ہیں",
+	creditcard: "درج کیا گیا کارڈ نمبر درست نہیں ہے",
+	equalTo: "اندراج کا موازنہ درست نہیں ہے",
+	extension: "اندراج درست نہیں ہے",
+	maxlength: $.validator.format( "زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں" ),
+	minlength: $.validator.format( "کم سے کم {0} کا اندراج کرنا ضروری ہے" ),
+	rangelength: $.validator.format( "اندراج کا {0} اور {1}کے درمیان ہونا ضروری ہے" ),
+	range: $.validator.format( "اندراج کا {0} اور {1} کے درمیان ہونا ضروری ہے" ),
+	max: $.validator.format( "زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں" ),
+	min: $.validator.format( "کم سے کم {0} کا اندراج کرنا ضروری ہے" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_ur.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_ur.min.js
new file mode 100644
index 0000000000..9411307093
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_ur.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"ان معلومات کا اندراج ضروری ہے",remote:"ان معلومات کا اندراج ضروری ہے",email:"درج کی ہوئی ای میل درست نہیں ہے",url:"درج کیا گیا پتہ درست نہیں ہے",date:"درج کی گئی تاریخ درست نہیں ہے",dateISO:"معیار کے مطابق نہیں ہے (ISO) درج کی گئی تاریخ",number:"درج کیےگئے ہندسے درست نہیں ہیں",digits:"صرف ہندسے اندراج کئے جاسکتے ہیں",creditcard:"درج کیا گیا کارڈ نمبر درست نہیں ہے",equalTo:"اندراج کا موازنہ درست نہیں ہے",extension:"اندراج درست نہیں ہے",maxlength:a.validator.format("زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں"),minlength:a.validator.format("کم سے کم {0} کا اندراج کرنا ضروری ہے"),rangelength:a.validator.format("اندراج کا {0} اور {1}کے درمیان ہونا ضروری ہے"),range:a.validator.format("اندراج کا {0} اور {1} کے درمیان ہونا ضروری ہے"),max:a.validator.format("زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں"),min:a.validator.format("کم سے کم {0} کا اندراج کرنا ضروری ہے")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_vi.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_vi.js
new file mode 100644
index 0000000000..ae415453dc
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_vi.js
@@ -0,0 +1,35 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: VI (Vietnamese; Tiếng Việt)
+ */
+$.extend( $.validator.messages, {
+	required: "Hãy nhập.",
+	remote: "Hãy sửa cho đúng.",
+	email: "Hãy nhập email.",
+	url: "Hãy nhập URL.",
+	date: "Hãy nhập ngày.",
+	dateISO: "Hãy nhập ngày (ISO).",
+	number: "Hãy nhập số.",
+	digits: "Hãy nhập chữ số.",
+	creditcard: "Hãy nhập số thẻ tín dụng.",
+	equalTo: "Hãy nhập thêm lần nữa.",
+	extension: "Phần mở rộng không đúng.",
+	maxlength: $.validator.format( "Hãy nhập từ {0} kí tự trở xuống." ),
+	minlength: $.validator.format( "Hãy nhập từ {0} kí tự trở lên." ),
+	rangelength: $.validator.format( "Hãy nhập từ {0} đến {1} kí tự." ),
+	range: $.validator.format( "Hãy nhập từ {0} đến {1}." ),
+	max: $.validator.format( "Hãy nhập từ {0} trở xuống." ),
+	min: $.validator.format( "Hãy nhập từ {0} trở lên." )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_vi.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_vi.min.js
new file mode 100644
index 0000000000..328904a4cb
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_vi.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"Hãy nhập.",remote:"Hãy sửa cho đúng.",email:"Hãy nhập email.",url:"Hãy nhập URL.",date:"Hãy nhập ngày.",dateISO:"Hãy nhập ngày (ISO).",number:"Hãy nhập số.",digits:"Hãy nhập chữ số.",creditcard:"Hãy nhập số thẻ tín dụng.",equalTo:"Hãy nhập thêm lần nữa.",extension:"Phần mở rộng không đúng.",maxlength:a.validator.format("Hãy nhập từ {0} kí tự trở xuống."),minlength:a.validator.format("Hãy nhập từ {0} kí tự trở lên."),rangelength:a.validator.format("Hãy nhập từ {0} đến {1} kí tự."),range:a.validator.format("Hãy nhập từ {0} đến {1}."),max:a.validator.format("Hãy nhập từ {0} trở xuống."),min:a.validator.format("Hãy nhập từ {0} trở lên.")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_zh.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh.js
new file mode 100644
index 0000000000..afc74ab066
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh.js
@@ -0,0 +1,36 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
+ */
+$.extend( $.validator.messages, {
+	required: "这是必填字段",
+	remote: "请修正此字段",
+	email: "请输入有效的电子邮件地址",
+	url: "请输入有效的网址",
+	date: "请输入有效的日期",
+	dateISO: "请输入有效的日期 (YYYY-MM-DD)",
+	number: "请输入有效的数字",
+	digits: "只能输入数字",
+	creditcard: "请输入有效的信用卡号码",
+	equalTo: "你的输入不相同",
+	extension: "请输入有效的后缀",
+	maxlength: $.validator.format( "最多可以输入 {0} 个字符" ),
+	minlength: $.validator.format( "最少要输入 {0} 个字符" ),
+	rangelength: $.validator.format( "请输入长度在 {0} 到 {1} 之间的字符串" ),
+	range: $.validator.format( "请输入范围在 {0} 到 {1} 之间的数值" ),
+	step: $.validator.format( "请输入 {0} 的整数倍值" ),
+	max: $.validator.format( "请输入不大于 {0} 的数值" ),
+	min: $.validator.format( "请输入不小于 {0} 的数值" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_zh.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh.min.js
new file mode 100644
index 0000000000..5cc9653ce4
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"这是必填字段",remote:"请修正此字段",email:"请输入有效的电子邮件地址",url:"请输入有效的网址",date:"请输入有效的日期",dateISO:"请输入有效的日期 (YYYY-MM-DD)",number:"请输入有效的数字",digits:"只能输入数字",creditcard:"请输入有效的信用卡号码",equalTo:"你的输入不相同",extension:"请输入有效的后缀",maxlength:a.validator.format("最多可以输入 {0} 个字符"),minlength:a.validator.format("最少要输入 {0} 个字符"),rangelength:a.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),range:a.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),step:a.validator.format("请输入 {0} 的整数倍值"),max:a.validator.format("请输入不大于 {0} 的数值"),min:a.validator.format("请输入不小于 {0} 的数值")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.js
new file mode 100644
index 0000000000..991201471b
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.js
@@ -0,0 +1,37 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ZH (Chinese; 中文 (Zhōngwén), 汉语, 漢語)
+ * Region: TW (Taiwan)
+ */
+$.extend( $.validator.messages, {
+	required: "必須填寫",
+	remote: "請修正此欄位",
+	email: "請輸入有效的電子郵件",
+	url: "請輸入有效的網址",
+	date: "請輸入有效的日期",
+	dateISO: "請輸入有效的日期 (YYYY-MM-DD)",
+	number: "請輸入正確的數值",
+	digits: "只可輸入數字",
+	creditcard: "請輸入有效的信用卡號碼",
+	equalTo: "請重複輸入一次",
+	extension: "請輸入有效的後綴",
+	maxlength: $.validator.format( "最多 {0} 個字" ),
+	minlength: $.validator.format( "最少 {0} 個字" ),
+	rangelength: $.validator.format( "請輸入長度為 {0} 至 {1} 之間的字串" ),
+	range: $.validator.format( "請輸入 {0} 至 {1} 之間的數值" ),
+	step: $.validator.format( "請輸入 {0} 的整數倍值" ),
+	max: $.validator.format( "請輸入不大於 {0} 的數值" ),
+	min: $.validator.format( "請輸入不小於 {0} 的數值" )
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.min.js b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.min.js
new file mode 100644
index 0000000000..a05922ea98
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/messages_zh_TW.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.messages,{required:"必須填寫",remote:"請修正此欄位",email:"請輸入有效的電子郵件",url:"請輸入有效的網址",date:"請輸入有效的日期",dateISO:"請輸入有效的日期 (YYYY-MM-DD)",number:"請輸入正確的數值",digits:"只可輸入數字",creditcard:"請輸入有效的信用卡號碼",equalTo:"請重複輸入一次",extension:"請輸入有效的後綴",maxlength:a.validator.format("最多 {0} 個字"),minlength:a.validator.format("最少 {0} 個字"),rangelength:a.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),range:a.validator.format("請輸入 {0} 至 {1} 之間的數值"),step:a.validator.format("請輸入 {0} 的整數倍值"),max:a.validator.format("請輸入不大於 {0} 的數值"),min:a.validator.format("請輸入不小於 {0} 的數值")}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_de.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_de.js
new file mode 100644
index 0000000000..da10e46984
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_de.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: DE
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+	}
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_de.min.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_de.min.js
new file mode 100644
index 0000000000..24522ea9de
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_de.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.js
new file mode 100644
index 0000000000..fc8971e951
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: ES_CL
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+	}
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.min.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.min.js
new file mode 100644
index 0000000000..08e1372987
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_es_CL.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_fi.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_fi.js
new file mode 100644
index 0000000000..bb7e95eac0
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_fi.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: FI
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+)(?:,\d+)?$/.test( value );
+	}
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_fi.min.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_fi.min.js
new file mode 100644
index 0000000000..14ce33222b
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_fi.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d{1,2}\.\d{1,2}\.\d{4}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+)(?:,\d+)?$/.test(a)}}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_it.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_it.js
new file mode 100644
index 0000000000..b0ad79e501
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_it.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: IT
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+	}
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_it.min.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_it.min.js
new file mode 100644
index 0000000000..08e1372987
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_it.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_nl.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_nl.js
new file mode 100644
index 0000000000..e83f337ff8
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_nl.js
@@ -0,0 +1,24 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: NL
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+	}
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_nl.min.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_nl.min.js
new file mode 100644
index 0000000000..114c24d330
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_nl.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_pt.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_pt.js
new file mode 100644
index 0000000000..a74b65fd4c
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_pt.js
@@ -0,0 +1,21 @@
+(function( factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		define( ["jquery", "../jquery.validate"], factory );
+	} else if (typeof module === "object" && module.exports) {
+		module.exports = factory( require( "jquery" ) );
+	} else {
+		factory( jQuery );
+	}
+}(function( $ ) {
+
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: PT_BR
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test( value );
+	}
+} );
+return $;
+}));
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/dist/localization/methods_pt.min.js b/civicrm/bower_components/jquery-validation/dist/localization/methods_pt.min.js
new file mode 100644
index 0000000000..64e16dfe8d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/dist/localization/methods_pt.min.js
@@ -0,0 +1,4 @@
+/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019
+ * https://jqueryvalidation.org/
+ * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */
+!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(a)}}),a});
\ No newline at end of file
diff --git a/civicrm/bower_components/jquery-validation/package.json b/civicrm/bower_components/jquery-validation/package.json
index 2916eae83f..254f2bea5e 100644
--- a/civicrm/bower_components/jquery-validation/package.json
+++ b/civicrm/bower_components/jquery-validation/package.json
@@ -1,9 +1,10 @@
 {
 	"name": "jquery-validation",
 	"title": "jQuery Validation Plugin",
-	"description": "Form validation made easy",
-	"version": "1.13.1",
-	"homepage": "http://jqueryvalidation.org/",
+	"description": "Client-side form validation made easy",
+	"version": "1.19.1",
+	"homepage": "https://jqueryvalidation.org/",
+	"license": "MIT",
 	"author": {
 		"name": "Jörn Zaefferer",
 		"email": "joern.zaefferer@gmail.com",
@@ -11,35 +12,50 @@
 	},
 	"repository": {
 		"type": "git",
-		"url": "git://github.com/jzaefferer/jquery-validation.git"
+		"url": "git://github.com/jquery-validation/jquery-validation.git"
 	},
 	"bugs": {
-		"url": "https://github.com/jzaefferer/jquery-validation/issues"
+		"url": "https://github.com/jquery-validation/jquery-validation/issues"
 	},
 	"licenses": [
 		{
 			"type": "MIT",
-			"url": "http://www.opensource.org/licenses/MIT"
+			"url": "https://www.opensource.org/licenses/MIT"
 		}
 	],
 	"scripts": {
-		"test": "grunt"
+		"test": "grunt",
+		"prepublish": "grunt"
+	},
+	"files": [
+		"dist/localization/",
+		"dist/additional-methods.js",
+		"dist/additional-methods.min.js",
+		"dist/jquery.validate.js",
+		"dist/jquery.validate.min.js"
+	],
+	"main": "dist/jquery.validate.js",
+	"peerDependencies": {
+		"jquery": "^1.7 || ^2.0 || ^3.1"
 	},
-	"dependencies": {},
 	"devDependencies": {
-		"commitplease": "1.11.0",
-		"grunt": "0.4.4",
-		"grunt-contrib-compress": "0.7.0",
-		"grunt-contrib-concat": "0.3.0",
-		"grunt-contrib-copy": "0.5.0",
-		"grunt-contrib-jshint": "^0.10.0",
-		"grunt-contrib-qunit": "0.4.0",
-		"grunt-contrib-uglify": "0.4.0",
-		"grunt-contrib-watch": "0.6.0",
-		"grunt-jscs": "^0.6.1",
-		"grunt-text-replace": "0.3.11"
+		"commitplease": "2.3.1",
+		"grunt": "1.0.1",
+		"grunt-contrib-compress": "1.2.0",
+		"grunt-contrib-concat": "1.0.1",
+		"grunt-contrib-copy": "1.0.0",
+		"grunt-contrib-jshint": "1.0.0",
+		"grunt-contrib-qunit": "1.2.0",
+		"grunt-contrib-uglify": "1.0.1",
+		"grunt-contrib-watch": "1.0.0",
+		"grunt-jscs": "2.8.0",
+		"grunt-sri": "0.2.0",
+		"grunt-text-replace": "0.4.0",
+		"qunitjs": "2.3.3"
 	},
 	"keywords": [
+		"jquery",
+		"jquery-plugin",
 		"forms",
 		"validation",
 		"validate"
diff --git a/civicrm/bower_components/jquery-validation/src/additional/abaRoutingNumber.js b/civicrm/bower_components/jquery-validation/src/additional/abaRoutingNumber.js
new file mode 100644
index 0000000000..c8bac54b27
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/abaRoutingNumber.js
@@ -0,0 +1,31 @@
+/**
+ * This is used in the United States to process payments, deposits,
+ * or transfers using the Automated Clearing House (ACH) or Fedwire
+ * systems. A very common use case would be to validate a form for
+ * an ACH bill payment.
+ */
+$.validator.addMethod( "abaRoutingNumber", function( value ) {
+	var checksum = 0;
+	var tokens = value.split( "" );
+	var length = tokens.length;
+
+	// Length Check
+	if ( length !== 9 ) {
+		return false;
+	}
+
+	// Calc the checksum
+	// https://en.wikipedia.org/wiki/ABA_routing_transit_number
+	for ( var i = 0; i < length; i += 3 ) {
+		checksum +=	parseInt( tokens[ i ], 10 )     * 3 +
+					parseInt( tokens[ i + 1 ], 10 ) * 7 +
+					parseInt( tokens[ i + 2 ], 10 );
+	}
+
+	// If not zero and divisible by 10 then valid
+	if ( checksum !== 0 && checksum % 10 === 0 ) {
+		return true;
+	}
+
+	return false;
+}, "Please enter a valid routing number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/accept.js b/civicrm/bower_components/jquery-validation/src/additional/accept.js
index 87d9d9a7d0..655507f2bd 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/accept.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/accept.js
@@ -1,26 +1,34 @@
 // Accept a value from a file input based on a required mimetype
-$.validator.addMethod("accept", function(value, element, param) {
+$.validator.addMethod( "accept", function( value, element, param ) {
+
 	// Split mime on commas in case we have multiple types we can accept
-	var typeParam = typeof param === "string" ? param.replace(/\s/g, "").replace(/,/g, "|") : "image/*",
-	optionalValue = this.optional(element),
-	i, file;
+	var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
+		optionalValue = this.optional( element ),
+		i, file, regex;
 
 	// Element is optional
-	if (optionalValue) {
+	if ( optionalValue ) {
 		return optionalValue;
 	}
 
-	if ($(element).attr("type") === "file") {
-		// If we are using a wildcard, make it regex friendly
-		typeParam = typeParam.replace(/\*/g, ".*");
+	if ( $( element ).attr( "type" ) === "file" ) {
+
+		// Escape string to be used in the regex
+		// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
+		// Escape also "/*" as "/.*" as a wildcard
+		typeParam = typeParam
+				.replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
+				.replace( /,/g, "|" )
+				.replace( /\/\*/g, "/.*" );
 
 		// Check if the element has a FileList before checking each file
-		if (element.files && element.files.length) {
-			for (i = 0; i < element.files.length; i++) {
-				file = element.files[i];
+		if ( element.files && element.files.length ) {
+			regex = new RegExp( ".?(" + typeParam + ")$", "i" );
+			for ( i = 0; i < element.files.length; i++ ) {
+				file = element.files[ i ];
 
 				// Grab the mimetype from the loaded file, verify it matches
-				if (!file.type.match(new RegExp( ".?(" + typeParam + ")$", "i"))) {
+				if ( !file.type.match( regex ) ) {
 					return false;
 				}
 			}
@@ -30,4 +38,4 @@ $.validator.addMethod("accept", function(value, element, param) {
 	// Either return true because we've validated each file, or because the
 	// browser does not support element.files and the FileList feature
 	return true;
-}, $.validator.format("Please enter a value with a valid mimetype."));
+}, $.validator.format( "Please enter a value with a valid mimetype." ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/additional.js b/civicrm/bower_components/jquery-validation/src/additional/additional.js
index 0803925c98..5dd01a2db7 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/additional.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/additional.js
@@ -1,24 +1,26 @@
-(function() {
+( function() {
 
-	function stripHtml(value) {
-		// remove html tags and space chars
-		return value.replace(/<.[^<>]*?>/g, " ").replace(/&nbsp;|&#160;/gi, " ")
-		// remove punctuation
-		.replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "");
+	function stripHtml( value ) {
+
+		// Remove html tags and space chars
+		return value.replace( /<.[^<>]*?>/g, " " ).replace( /&nbsp;|&#160;/gi, " " )
+
+		// Remove punctuation
+		.replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" );
 	}
 
-	$.validator.addMethod("maxWords", function(value, element, params) {
-		return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length <= params;
-	}, $.validator.format("Please enter {0} words or less."));
+	$.validator.addMethod( "maxWords", function( value, element, params ) {
+		return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length <= params;
+	}, $.validator.format( "Please enter {0} words or less." ) );
 
-	$.validator.addMethod("minWords", function(value, element, params) {
-		return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params;
-	}, $.validator.format("Please enter at least {0} words."));
+	$.validator.addMethod( "minWords", function( value, element, params ) {
+		return this.optional( element ) || stripHtml( value ).match( /\b\w+\b/g ).length >= params;
+	}, $.validator.format( "Please enter at least {0} words." ) );
 
-	$.validator.addMethod("rangeWords", function(value, element, params) {
-		var valueStripped = stripHtml(value),
+	$.validator.addMethod( "rangeWords", function( value, element, params ) {
+		var valueStripped = stripHtml( value ),
 			regex = /\b\w+\b/g;
-		return this.optional(element) || valueStripped.match(regex).length >= params[0] && valueStripped.match(regex).length <= params[1];
-	}, $.validator.format("Please enter between {0} and {1} words."));
+		return this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];
+	}, $.validator.format( "Please enter between {0} and {1} words." ) );
 
-}());
+}() );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/alphanumeric.js b/civicrm/bower_components/jquery-validation/src/additional/alphanumeric.js
index 39aaebe32c..79e54e0a1a 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/alphanumeric.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/alphanumeric.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("alphanumeric", function(value, element) {
-	return this.optional(element) || /^\w+$/i.test(value);
-}, "Letters, numbers, and underscores only please");
+$.validator.addMethod( "alphanumeric", function( value, element ) {
+	return this.optional( element ) || /^\w+$/i.test( value );
+}, "Letters, numbers, and underscores only please" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/bankaccountNL.js b/civicrm/bower_components/jquery-validation/src/additional/bankaccountNL.js
index 33f8547983..1671f4980d 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/bankaccountNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/bankaccountNL.js
@@ -4,22 +4,23 @@
  * We accept the notation with spaces, as that is common.
  * acceptable: 123456789 or 12 34 56 789
  */
-$.validator.addMethod("bankaccountNL", function(value, element) {
-	if (this.optional(element)) {
+$.validator.addMethod( "bankaccountNL", function( value, element ) {
+	if ( this.optional( element ) ) {
 		return true;
 	}
-	if (!(/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(value))) {
+	if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {
 		return false;
 	}
-	// now '11 check'
-	var account = value.replace(/ /g, ""), // remove spaces
+
+	// Now '11 check'
+	var account = value.replace( / /g, "" ), // Remove spaces
 		sum = 0,
 		len = account.length,
 		pos, factor, digit;
 	for ( pos = 0; pos < len; pos++ ) {
 		factor = len - pos;
-		digit = account.substring(pos, pos + 1);
+		digit = account.substring( pos, pos + 1 );
 		sum = sum + factor * digit;
 	}
 	return sum % 11 === 0;
-}, "Please specify a valid bank account number");
+}, "Please specify a valid bank account number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/bankorgiroaccountNL.js b/civicrm/bower_components/jquery-validation/src/additional/bankorgiroaccountNL.js
index 1a4f2f6a0e..b224f45b1e 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/bankorgiroaccountNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/bankorgiroaccountNL.js
@@ -1,5 +1,5 @@
-$.validator.addMethod("bankorgiroaccountNL", function(value, element) {
-	return this.optional(element) ||
-			($.validator.methods.bankaccountNL.call(this, value, element)) ||
-			($.validator.methods.giroaccountNL.call(this, value, element));
-}, "Please specify a valid bank or giro account number");
+$.validator.addMethod( "bankorgiroaccountNL", function( value, element ) {
+	return this.optional( element ) ||
+			( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||
+			( $.validator.methods.giroaccountNL.call( this, value, element ) );
+}, "Please specify a valid bank or giro account number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/bic.js b/civicrm/bower_components/jquery-validation/src/additional/bic.js
index ebac9e6ce2..49f137fa5a 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/bic.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/bic.js
@@ -3,14 +3,16 @@
  *
  * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
  *
+ * Validation is case-insensitive. Please make sure to normalize input yourself.
+ *
  * BIC definition in detail:
  * - First 4 characters - bank code (only letters)
  * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
  * - Next 2 characters - location code (letters and digits)
  *   a. shall not start with '0' or '1'
- *   b. second character must be a letter ('O' is not allowed) or one of the following digits ('0' for test (therefore not allowed), '1' for passive participant and '2' for active participant)
+ *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)
  * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
  */
-$.validator.addMethod("bic", function(value, element) {
-    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value );
-}, "Please specify a valid BIC code");
+$.validator.addMethod( "bic", function( value, element ) {
+    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );
+}, "Please specify a valid BIC code" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/cifES.js b/civicrm/bower_components/jquery-validation/src/additional/cifES.js
index b66a9c2b5d..cfef967b55 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/cifES.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/cifES.js
@@ -1,61 +1,114 @@
 /*
  * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
  * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
+ *
+ * Spanish CIF structure:
+ *
+ * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]
+ *
+ * Where:
+ *
+ * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]
+ * P: 2 characters. Province.
+ * N: 5 characters. Secuencial Number within the province.
+ * C: 1 character. Control Digit: [0-9A-J].
+ *
+ * [ T ]: Kind of Organizations. Possible values:
+ *
+ *   A. Corporations
+ *   B. LLCs
+ *   C. General partnerships
+ *   D. Companies limited partnerships
+ *   E. Communities of goods
+ *   F. Cooperative Societies
+ *   G. Associations
+ *   H. Communities of homeowners in horizontal property regime
+ *   J. Civil Societies
+ *   K. Old format
+ *   L. Old format
+ *   M. Old format
+ *   N. Nonresident entities
+ *   P. Local authorities
+ *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
+ *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
+ *   S. Organs of State Administration and regions
+ *   V. Agrarian Transformation
+ *   W. Permanent establishments of non-resident in Spain
+ *
+ * [ C ]: Control Digit. It can be a number or a letter depending on T value:
+ * [ T ]  -->  [ C ]
+ * ------    ----------
+ *   A         Number
+ *   B         Number
+ *   E         Number
+ *   H         Number
+ *   K         Letter
+ *   P         Letter
+ *   Q         Letter
+ *   S         Letter
+ *
  */
-$.validator.addMethod( "cifES", function( value ) {
+$.validator.addMethod( "cifES", function( value, element ) {
 	"use strict";
 
-	var num = [],
-		controlDigit, sum, i, count, tmp, secondDigit;
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	var cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi );
+	var letter  = value.substring( 0, 1 ), // [ T ]
+		number  = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]
+		control = value.substring( 8, 9 ), // [ C ]
+		all_sum = 0,
+		even_sum = 0,
+		odd_sum = 0,
+		i, n,
+		control_digit,
+		control_letter;
 
-	value = value.toUpperCase();
+	function isOdd( n ) {
+		return n % 2 === 0;
+	}
 
 	// Quick format test
-	if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+	if ( value.length !== 9 || !cifRegEx.test( value ) ) {
 		return false;
 	}
 
-	for ( i = 0; i < 9; i++ ) {
-		num[ i ] = parseInt( value.charAt( i ), 10 );
-	}
+	for ( i = 0; i < number.length; i++ ) {
+		n = parseInt( number[ i ], 10 );
 
-	// Algorithm for checking CIF codes
-	sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
-	for ( count = 1; count < 8; count += 2 ) {
-		tmp = ( 2 * num[ count ] ).toString();
-		secondDigit = tmp.charAt( 1 );
+		// Odd positions
+		if ( isOdd( i ) ) {
 
-		sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === "" ? 0 : parseInt( secondDigit, 10 ) );
+			// Odd positions are multiplied first.
+			n *= 2;
+
+			// If the multiplication is bigger than 10 we need to adjust
+			odd_sum += n < 10 ? n : n - 9;
+
+		// Even positions
+		// Just sum them
+		} else {
+			even_sum += n;
+		}
 	}
 
-	/* The first (position 1) is a letter following the following criteria:
-	 *	A. Corporations
-	 *	B. LLCs
-	 *	C. General partnerships
-	 *	D. Companies limited partnerships
-	 *	E. Communities of goods
-	 *	F. Cooperative Societies
-	 *	G. Associations
-	 *	H. Communities of homeowners in horizontal property regime
-	 *	J. Civil Societies
-	 *	K. Old format
-	 *	L. Old format
-	 *	M. Old format
-	 *	N. Nonresident entities
-	 *	P. Local authorities
-	 *	Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
-	 *	R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
-	 *	S. Organs of State Administration and regions
-	 *	V. Agrarian Transformation
-	 *	W. Permanent establishments of non-resident in Spain
-	 */
-	if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
-		sum += "";
-		controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
-		value += controlDigit;
-		return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
+	all_sum = even_sum + odd_sum;
+	control_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();
+	control_digit = parseInt( control_digit, 10 ) > 9 ? "0" : control_digit;
+	control_letter = "JABCDEFGHI".substr( control_digit, 1 ).toString();
+
+	// Control must be a digit
+	if ( letter.match( /[ABEH]/ ) ) {
+		return control === control_digit;
+
+	// Control must be a letter
+	} else if ( letter.match( /[KPQS]/ ) ) {
+		return control === control_letter;
 	}
 
-	return false;
+	// Can be either
+	return control === control_digit || control === control_letter;
 
 }, "Please specify a valid CIF number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/cnhBR.js b/civicrm/bower_components/jquery-validation/src/additional/cnhBR.js
new file mode 100644
index 0000000000..67ea7965a6
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/cnhBR.js
@@ -0,0 +1,49 @@
+/*
+ * Brazillian CNH number (Carteira Nacional de Habilitacao) is the License Driver number.
+ * CNH numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cnhBR", function( value ) {
+
+  // Removing special characters from value
+  value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+  // Checking value to have 11 digits only
+  if ( value.length !== 11 ) {
+    return false;
+  }
+
+  var sum = 0, dsc = 0, firstChar,
+		firstCN, secondCN, i, j, v;
+
+  firstChar = value.charAt( 0 );
+
+  if ( new Array( 12 ).join( firstChar ) === value ) {
+    return false;
+  }
+
+  // Step 1 - using first Check Number:
+  for ( i = 0, j = 9, v = 0; i < 9; ++i, --j ) {
+    sum += +( value.charAt( i ) * j );
+  }
+
+  firstCN = sum % 11;
+  if ( firstCN >= 10 ) {
+    firstCN = 0;
+    dsc = 2;
+  }
+
+  sum = 0;
+  for ( i = 0, j = 1, v = 0; i < 9; ++i, ++j ) {
+    sum += +( value.charAt( i ) * j );
+  }
+
+  secondCN = sum % 11;
+  if ( secondCN >= 10 ) {
+    secondCN = 0;
+  } else {
+    secondCN = secondCN - dsc;
+  }
+
+  return ( String( firstCN ).concat( secondCN ) === value.substr( -2 ) );
+
+}, "Please specify a valid CNH number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/cnpjBR.js b/civicrm/bower_components/jquery-validation/src/additional/cnpjBR.js
new file mode 100644
index 0000000000..43e3bfcf64
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/cnpjBR.js
@@ -0,0 +1,74 @@
+/*
+ * Brazillian value number (Cadastrado de Pessoas Juridica).
+ * value numbers have 14 digits in total: 12 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cnpjBR", function( value, element ) {
+	"use strict";
+
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	// Removing no number
+	value = value.replace( /[^\d]+/g, "" );
+
+	// Checking value to have 14 digits only
+	if ( value.length !== 14 ) {
+		return false;
+	}
+
+	// Elimina values invalidos conhecidos
+	if ( value === "00000000000000" ||
+		value === "11111111111111" ||
+		value === "22222222222222" ||
+		value === "33333333333333" ||
+		value === "44444444444444" ||
+		value === "55555555555555" ||
+		value === "66666666666666" ||
+		value === "77777777777777" ||
+		value === "88888888888888" ||
+		value === "99999999999999" ) {
+		return false;
+	}
+
+	// Valida DVs
+	var tamanho = ( value.length - 2 );
+	var numeros = value.substring( 0, tamanho );
+	var digitos = value.substring( tamanho );
+	var soma = 0;
+	var pos = tamanho - 7;
+
+	for ( var i = tamanho; i >= 1; i-- ) {
+		soma += numeros.charAt( tamanho - i ) * pos--;
+		if ( pos < 2 ) {
+			pos = 9;
+		}
+	}
+
+	var resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
+
+	if ( resultado !== parseInt( digitos.charAt( 0 ), 10 ) ) {
+		return false;
+	}
+
+	tamanho = tamanho + 1;
+	numeros = value.substring( 0, tamanho );
+	soma = 0;
+	pos = tamanho - 7;
+
+	for ( var il = tamanho; il >= 1; il-- ) {
+		soma += numeros.charAt( tamanho - il ) * pos--;
+		if ( pos < 2 ) {
+			pos = 9;
+		}
+	}
+
+	resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
+
+	if ( resultado !== parseInt( digitos.charAt( 1 ), 10 ) ) {
+		return false;
+	}
+
+	return true;
+
+}, "Please specify a CNPJ value number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/cpfBR.js b/civicrm/bower_components/jquery-validation/src/additional/cpfBR.js
new file mode 100644
index 0000000000..a2b1611b3d
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/cpfBR.js
@@ -0,0 +1,65 @@
+/*
+ * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
+ * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
+ */
+$.validator.addMethod( "cpfBR", function( value, element ) {
+	"use strict";
+
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	// Removing special characters from value
+	value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+	// Checking value to have 11 digits only
+	if ( value.length !== 11 ) {
+		return false;
+	}
+
+	var sum = 0,
+		firstCN, secondCN, checkResult, i;
+
+	firstCN = parseInt( value.substring( 9, 10 ), 10 );
+	secondCN = parseInt( value.substring( 10, 11 ), 10 );
+
+	checkResult = function( sum, cn ) {
+		var result = ( sum * 10 ) % 11;
+		if ( ( result === 10 ) || ( result === 11 ) ) {
+			result = 0;
+		}
+		return ( result === cn );
+	};
+
+	// Checking for dump data
+	if ( value === "" ||
+		value === "00000000000" ||
+		value === "11111111111" ||
+		value === "22222222222" ||
+		value === "33333333333" ||
+		value === "44444444444" ||
+		value === "55555555555" ||
+		value === "66666666666" ||
+		value === "77777777777" ||
+		value === "88888888888" ||
+		value === "99999999999"
+	) {
+		return false;
+	}
+
+	// Step 1 - using first Check Number:
+	for ( i = 1; i <= 9; i++ ) {
+		sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );
+	}
+
+	// If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
+	if ( checkResult( sum, firstCN ) ) {
+		sum = 0;
+		for ( i = 1; i <= 10; i++ ) {
+			sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );
+		}
+		return checkResult( sum, secondCN );
+	}
+	return false;
+
+}, "Please specify a valid CPF number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/creditcard.js b/civicrm/bower_components/jquery-validation/src/additional/creditcard.js
new file mode 100644
index 0000000000..d2953d3e89
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/creditcard.js
@@ -0,0 +1,40 @@
+// https://jqueryvalidation.org/creditcard-method/
+// based on https://en.wikipedia.org/wiki/Luhn_algorithm
+$.validator.addMethod( "creditcard", function( value, element ) {
+	if ( this.optional( element ) ) {
+		return "dependency-mismatch";
+	}
+
+	// Accept only spaces, digits and dashes
+	if ( /[^0-9 \-]+/.test( value ) ) {
+		return false;
+	}
+
+	var nCheck = 0,
+		nDigit = 0,
+		bEven = false,
+		n, cDigit;
+
+	value = value.replace( /\D/g, "" );
+
+	// Basing min and max length on
+	// https://dev.ean.com/general-info/valid-card-types/
+	if ( value.length < 13 || value.length > 19 ) {
+		return false;
+	}
+
+	for ( n = value.length - 1; n >= 0; n-- ) {
+		cDigit = value.charAt( n );
+		nDigit = parseInt( cDigit, 10 );
+		if ( bEven ) {
+			if ( ( nDigit *= 2 ) > 9 ) {
+				nDigit -= 9;
+			}
+		}
+
+		nCheck += nDigit;
+		bEven = !bEven;
+	}
+
+	return ( nCheck % 10 ) === 0;
+}, "Please enter a valid credit card number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/creditcardtypes.js b/civicrm/bower_components/jquery-validation/src/additional/creditcardtypes.js
index f70f261f2f..81e0dc0400 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/creditcardtypes.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/creditcardtypes.js
@@ -1,69 +1,69 @@
 /* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
- * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
+ * Redistributed under the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
  * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
  */
-$.validator.addMethod("creditcardtypes", function(value, element, param) {
-	if (/[^0-9\-]+/.test(value)) {
+$.validator.addMethod( "creditcardtypes", function( value, element, param ) {
+	if ( /[^0-9\-]+/.test( value ) ) {
 		return false;
 	}
 
-	value = value.replace(/\D/g, "");
+	value = value.replace( /\D/g, "" );
 
 	var validTypes = 0x0000;
 
-	if (param.mastercard) {
+	if ( param.mastercard ) {
 		validTypes |= 0x0001;
 	}
-	if (param.visa) {
+	if ( param.visa ) {
 		validTypes |= 0x0002;
 	}
-	if (param.amex) {
+	if ( param.amex ) {
 		validTypes |= 0x0004;
 	}
-	if (param.dinersclub) {
+	if ( param.dinersclub ) {
 		validTypes |= 0x0008;
 	}
-	if (param.enroute) {
+	if ( param.enroute ) {
 		validTypes |= 0x0010;
 	}
-	if (param.discover) {
+	if ( param.discover ) {
 		validTypes |= 0x0020;
 	}
-	if (param.jcb) {
+	if ( param.jcb ) {
 		validTypes |= 0x0040;
 	}
-	if (param.unknown) {
+	if ( param.unknown ) {
 		validTypes |= 0x0080;
 	}
-	if (param.all) {
+	if ( param.all ) {
 		validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
 	}
-	if (validTypes & 0x0001 && /^(5[12345])/.test(value)) { //mastercard
+	if ( validTypes & 0x0001 && ( /^(5[12345])/.test( value ) || /^(2[234567])/.test( value ) ) ) { // Mastercard
 		return value.length === 16;
 	}
-	if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
+	if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa
 		return value.length === 16;
 	}
-	if (validTypes & 0x0004 && /^(3[47])/.test(value)) { //amex
+	if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex
 		return value.length === 15;
 	}
-	if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) { //dinersclub
+	if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub
 		return value.length === 14;
 	}
-	if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) { //enroute
+	if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute
 		return value.length === 15;
 	}
-	if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
+	if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover
 		return value.length === 16;
 	}
-	if (validTypes & 0x0040 && /^(3)/.test(value)) { //jcb
+	if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb
 		return value.length === 16;
 	}
-	if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) { //jcb
+	if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb
 		return value.length === 15;
 	}
-	if (validTypes & 0x0080) { //unknown
+	if ( validTypes & 0x0080 ) { // Unknown
 		return true;
 	}
 	return false;
-}, "Please enter a valid credit card number.");
+}, "Please enter a valid credit card number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/currency.js b/civicrm/bower_components/jquery-validation/src/additional/currency.js
index fbdd5b0e52..76197df5a5 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/currency.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/currency.js
@@ -26,16 +26,16 @@
  *     currency: "$,£,¢"
  *  }
  */
-$.validator.addMethod("currency", function(value, element, param) {
+$.validator.addMethod( "currency", function( value, element, param ) {
     var isParamString = typeof param === "string",
-        symbol = isParamString ? param : param[0],
-        soft = isParamString ? true : param[1],
+        symbol = isParamString ? param : param[ 0 ],
+        soft = isParamString ? true : param[ 1 ],
         regex;
 
-    symbol = symbol.replace(/,/g, "");
+    symbol = symbol.replace( /,/g, "" );
     symbol = soft ? symbol + "]" : symbol + "]?";
     regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
-    regex = new RegExp(regex);
-    return this.optional(element) || regex.test(value);
+    regex = new RegExp( regex );
+    return this.optional( element ) || regex.test( value );
 
-}, "Please specify a valid currency");
+}, "Please specify a valid currency" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/dateFA.js b/civicrm/bower_components/jquery-validation/src/additional/dateFA.js
index c817da1e9d..22baa88cd9 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/dateFA.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/dateFA.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("dateFA", function(value, element) {
-	return this.optional(element) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(value);
-}, "Please enter a correct date");
+$.validator.addMethod( "dateFA", function( value, element ) {
+	return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );
+}, $.validator.messages.date );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/dateITA.js b/civicrm/bower_components/jquery-validation/src/additional/dateITA.js
index 1ca821d316..29c40b169a 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/dateITA.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/dateITA.js
@@ -17,17 +17,17 @@
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
-$.validator.addMethod("dateITA", function(value, element) {
+$.validator.addMethod( "dateITA", function( value, element ) {
 	var check = false,
 		re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
 		adata, gg, mm, aaaa, xdata;
-	if ( re.test(value)) {
-		adata = value.split("/");
-		gg = parseInt(adata[0], 10);
-		mm = parseInt(adata[1], 10);
-		aaaa = parseInt(adata[2], 10);
-		xdata = new Date(aaaa, mm - 1, gg, 12, 0, 0, 0);
-		if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth () === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
+	if ( re.test( value ) ) {
+		adata = value.split( "/" );
+		gg = parseInt( adata[ 0 ], 10 );
+		mm = parseInt( adata[ 1 ], 10 );
+		aaaa = parseInt( adata[ 2 ], 10 );
+		xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );
+		if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
 			check = true;
 		} else {
 			check = false;
@@ -35,5 +35,5 @@ $.validator.addMethod("dateITA", function(value, element) {
 	} else {
 		check = false;
 	}
-	return this.optional(element) || check;
-}, "Please enter a correct date");
+	return this.optional( element ) || check;
+}, $.validator.messages.date );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/dateNL.js b/civicrm/bower_components/jquery-validation/src/additional/dateNL.js
index b1522e499a..cf650bcfc6 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/dateNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/dateNL.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("dateNL", function(value, element) {
-	return this.optional(element) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(value);
-}, "Please enter a correct date");
+$.validator.addMethod( "dateNL", function( value, element ) {
+	return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value );
+}, $.validator.messages.date );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/extension.js b/civicrm/bower_components/jquery-validation/src/additional/extension.js
index 580a09d0f8..4903875859 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/extension.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/extension.js
@@ -1,5 +1,5 @@
 // Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
-$.validator.addMethod("extension", function(value, element, param) {
-	param = typeof param === "string" ? param.replace(/,/g, "|") : "png|jpe?g|gif";
-	return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
-}, $.validator.format("Please enter a value with a valid extension."));
+$.validator.addMethod( "extension", function( value, element, param ) {
+	param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif";
+	return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) );
+}, $.validator.format( "Please enter a value with a valid extension." ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/giroaccountNL.js b/civicrm/bower_components/jquery-validation/src/additional/giroaccountNL.js
index f7ea542907..0cfd04cd6e 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/giroaccountNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/giroaccountNL.js
@@ -1,6 +1,6 @@
 /**
  * Dutch giro account numbers (not bank numbers) have max 7 digits
  */
-$.validator.addMethod("giroaccountNL", function(value, element) {
-	return this.optional(element) || /^[0-9]{1,7}$/.test(value);
-}, "Please specify a valid giro account number");
+$.validator.addMethod( "giroaccountNL", function( value, element ) {
+	return this.optional( element ) || /^[0-9]{1,7}$/.test( value );
+}, "Please specify a valid giro account number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/greaterThan.js b/civicrm/bower_components/jquery-validation/src/additional/greaterThan.js
new file mode 100644
index 0000000000..67d8c3050c
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/greaterThan.js
@@ -0,0 +1,11 @@
+$.validator.addMethod( "greaterThan", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-greaterThan-blur" ).length ) {
+        target.addClass( "validate-greaterThan-blur" ).on( "blur.validate-greaterThan", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value > target.val();
+}, "Please enter a greater value." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/greaterThanEqual.js b/civicrm/bower_components/jquery-validation/src/additional/greaterThanEqual.js
new file mode 100644
index 0000000000..de62037285
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/greaterThanEqual.js
@@ -0,0 +1,11 @@
+$.validator.addMethod( "greaterThanEqual", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-greaterThanEqual-blur" ).length ) {
+        target.addClass( "validate-greaterThanEqual-blur" ).on( "blur.validate-greaterThanEqual", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value >= target.val();
+}, "Please enter a greater value." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/iban.js b/civicrm/bower_components/jquery-validation/src/additional/iban.js
index fdde59e473..0a2bfbeecd 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/iban.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/iban.js
@@ -1,27 +1,36 @@
 /**
  * IBAN is the international bank account number.
  * It has a country - specific format, that is checked here too
+ *
+ * Validation is case-insensitive. Please make sure to normalize input yourself.
  */
-$.validator.addMethod("iban", function(value, element) {
-	// some quick simple tests to prevent needless work
-	if (this.optional(element)) {
+$.validator.addMethod( "iban", function( value, element ) {
+
+	// Some quick simple tests to prevent needless work
+	if ( this.optional( element ) ) {
 		return true;
 	}
 
-	// remove spaces and to upper case
-	var iban = value.replace(/ /g, "").toUpperCase(),
+	// Remove spaces and to upper case
+	var iban = value.replace( / /g, "" ).toUpperCase(),
 		ibancheckdigits = "",
 		leadingZeroes = true,
 		cRest = "",
 		cOperator = "",
 		countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
 
-	if (!(/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(iban))) {
+	// Check for IBAN code length.
+	// It contains:
+	// country code ISO 3166-1 - two letters,
+	// two check digits,
+	// Basic Bank Account Number (BBAN) - up to 30 chars
+	var minimalIBANlength = 5;
+	if ( iban.length < minimalIBANlength ) {
 		return false;
 	}
 
-	// check the country code and find the country specific format
-	countrycode = iban.substring(0, 2);
+	// Check the country code and find the country specific format
+	countrycode = iban.substring( 0, 2 );
 	bbancountrypatterns = {
 		"AL": "\\d{8}[\\dA-Z]{16}",
 		"AD": "\\d{8}[\\dA-Z]{12}",
@@ -89,7 +98,8 @@ $.validator.addMethod("iban", function(value, element) {
 		"VG": "[\\dA-Z]{4}\\d{16}"
 	};
 
-	bbanpattern = bbancountrypatterns[countrycode];
+	bbanpattern = bbancountrypatterns[ countrycode ];
+
 	// As new countries will start using IBAN in the
 	// future, we only check if the countrycode is known.
 	// This prevents false negatives, while almost all
@@ -97,30 +107,30 @@ $.validator.addMethod("iban", function(value, element) {
 	// by the checksum validation below anyway.
 	// Strict checking should return FALSE for unknown
 	// countries.
-	if (typeof bbanpattern !== "undefined") {
-		ibanregexp = new RegExp("^[A-Z]{2}\\d{2}" + bbanpattern + "$", "");
-		if (!(ibanregexp.test(iban))) {
-			return false; // invalid country specific format
+	if ( typeof bbanpattern !== "undefined" ) {
+		ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" );
+		if ( !( ibanregexp.test( iban ) ) ) {
+			return false; // Invalid country specific format
 		}
 	}
 
-	// now check the checksum, first convert to digits
-	ibancheck = iban.substring(4, iban.length) + iban.substring(0, 4);
-	for (i = 0; i < ibancheck.length; i++) {
-		charAt = ibancheck.charAt(i);
-		if (charAt !== "0") {
+	// Now check the checksum, first convert to digits
+	ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );
+	for ( i = 0; i < ibancheck.length; i++ ) {
+		charAt = ibancheck.charAt( i );
+		if ( charAt !== "0" ) {
 			leadingZeroes = false;
 		}
-		if (!leadingZeroes) {
-			ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(charAt);
+		if ( !leadingZeroes ) {
+			ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( charAt );
 		}
 	}
 
-	// calculate the result of: ibancheckdigits % 97
-	for (p = 0; p < ibancheckdigits.length; p++) {
-		cChar = ibancheckdigits.charAt(p);
+	// Calculate the result of: ibancheckdigits % 97
+	for ( p = 0; p < ibancheckdigits.length; p++ ) {
+		cChar = ibancheckdigits.charAt( p );
 		cOperator = "" + cRest + "" + cChar;
 		cRest = cOperator % 97;
 	}
 	return cRest === 1;
-}, "Please specify a valid IBAN");
+}, "Please specify a valid IBAN" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/integer.js b/civicrm/bower_components/jquery-validation/src/additional/integer.js
index c854b3c0aa..779431d725 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/integer.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/integer.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("integer", function(value, element) {
-	return this.optional(element) || /^-?\d+$/.test(value);
-}, "A positive or negative non-decimal number please");
+$.validator.addMethod( "integer", function( value, element ) {
+	return this.optional( element ) || /^-?\d+$/.test( value );
+}, "A positive or negative non-decimal number please" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/ipv4.js b/civicrm/bower_components/jquery-validation/src/additional/ipv4.js
index 4825e986ea..2ddefc9df6 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/ipv4.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/ipv4.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("ipv4", function(value, element) {
-	return this.optional(element) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value);
-}, "Please enter a valid IP v4 address.");
+$.validator.addMethod( "ipv4", function( value, element ) {
+	return this.optional( element ) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test( value );
+}, "Please enter a valid IP v4 address." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/ipv6.js b/civicrm/bower_components/jquery-validation/src/additional/ipv6.js
index 10f0b62233..3351d4d464 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/ipv6.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/ipv6.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("ipv6", function(value, element) {
-	return this.optional(element) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);
-}, "Please enter a valid IP v6 address.");
+$.validator.addMethod( "ipv6", function( value, element ) {
+	return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );
+}, "Please enter a valid IP v6 address." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/lessThan.js b/civicrm/bower_components/jquery-validation/src/additional/lessThan.js
new file mode 100644
index 0000000000..2959bc362f
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/lessThan.js
@@ -0,0 +1,11 @@
+$.validator.addMethod( "lessThan", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-lessThan-blur" ).length ) {
+        target.addClass( "validate-lessThan-blur" ).on( "blur.validate-lessThan", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value < target.val();
+}, "Please enter a lesser value." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/lessThanEqual.js b/civicrm/bower_components/jquery-validation/src/additional/lessThanEqual.js
new file mode 100644
index 0000000000..78a1e25a68
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/lessThanEqual.js
@@ -0,0 +1,11 @@
+$.validator.addMethod( "lessThanEqual", function( value, element, param ) {
+    var target = $( param );
+
+    if ( this.settings.onfocusout && target.not( ".validate-lessThanEqual-blur" ).length ) {
+        target.addClass( "validate-lessThanEqual-blur" ).on( "blur.validate-lessThanEqual", function() {
+            $( element ).valid();
+        } );
+    }
+
+    return value <= target.val();
+}, "Please enter a lesser value." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/lettersonly.js b/civicrm/bower_components/jquery-validation/src/additional/lettersonly.js
index 3ef22106a9..893b487a81 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/lettersonly.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/lettersonly.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("lettersonly", function(value, element) {
-	return this.optional(element) || /^[a-z]+$/i.test(value);
-}, "Letters only please");
+$.validator.addMethod( "lettersonly", function( value, element ) {
+	return this.optional( element ) || /^[a-z]+$/i.test( value );
+}, "Letters only please" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/letterswithbasicpunc.js b/civicrm/bower_components/jquery-validation/src/additional/letterswithbasicpunc.js
index b578dee249..9bbb4d9d9d 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/letterswithbasicpunc.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/letterswithbasicpunc.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("letterswithbasicpunc", function(value, element) {
-	return this.optional(element) || /^[a-z\-.,()'"\s]+$/i.test(value);
-}, "Letters or punctuation only please");
+$.validator.addMethod( "letterswithbasicpunc", function( value, element ) {
+	return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value );
+}, "Letters or punctuation only please" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/maxfiles.js b/civicrm/bower_components/jquery-validation/src/additional/maxfiles.js
new file mode 100644
index 0000000000..0cf53e7354
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/maxfiles.js
@@ -0,0 +1,14 @@
+// Limit the number of files in a FileList.
+$.validator.addMethod( "maxfiles", function( value, element, param ) {
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	if ( $( element ).attr( "type" ) === "file" ) {
+		if ( element.files && element.files.length > param ) {
+			return false;
+		}
+	}
+
+	return true;
+}, $.validator.format( "Please select no more than {0} files." ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/maxsize.js b/civicrm/bower_components/jquery-validation/src/additional/maxsize.js
new file mode 100644
index 0000000000..0b9db7cd39
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/maxsize.js
@@ -0,0 +1,18 @@
+// Limit the size of each individual file in a FileList.
+$.validator.addMethod( "maxsize", function( value, element, param ) {
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	if ( $( element ).attr( "type" ) === "file" ) {
+		if ( element.files && element.files.length ) {
+			for ( var i = 0; i < element.files.length; i++ ) {
+				if ( element.files[ i ].size > param ) {
+					return false;
+				}
+			}
+		}
+	}
+
+	return true;
+}, $.validator.format( "File size must not exceed {0} bytes each." ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/maxsizetotal.js b/civicrm/bower_components/jquery-validation/src/additional/maxsizetotal.js
new file mode 100644
index 0000000000..c2f990bca0
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/maxsizetotal.js
@@ -0,0 +1,22 @@
+// Limit the size of all files in a FileList.
+$.validator.addMethod( "maxsizetotal", function( value, element, param ) {
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	if ( $( element ).attr( "type" ) === "file" ) {
+		if ( element.files && element.files.length ) {
+			var totalSize = 0;
+
+			for ( var i = 0; i < element.files.length; i++ ) {
+				totalSize += element.files[ i ].size;
+				if ( totalSize > param ) {
+					return false;
+				}
+			}
+		}
+	}
+
+	return true;
+}, $.validator.format( "Total size of all files must not exceed {0} bytes." ) );
+
diff --git a/civicrm/bower_components/jquery-validation/src/additional/mobileNL.js b/civicrm/bower_components/jquery-validation/src/additional/mobileNL.js
index 6aafed0984..3f1f45a758 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/mobileNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/mobileNL.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("mobileNL", function(value, element) {
-	return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
-}, "Please specify a valid mobile number");
+$.validator.addMethod( "mobileNL", function( value, element ) {
+	return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
+}, "Please specify a valid mobile number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/mobileRU.js b/civicrm/bower_components/jquery-validation/src/additional/mobileRU.js
new file mode 100644
index 0000000000..7006d09b41
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/mobileRU.js
@@ -0,0 +1,4 @@
+$.validator.addMethod( "mobileRU", function( phone_number, element ) {
+	var ruPhone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || ruPhone_number.length > 9 && /^((\+7|7|8)+([0-9]){10})$/.test( ruPhone_number );
+}, "Please specify a valid mobile number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/mobileUK.js b/civicrm/bower_components/jquery-validation/src/additional/mobileUK.js
index 59b5afa2c3..e1c5ce3b2e 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/mobileUK.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/mobileUK.js
@@ -6,8 +6,8 @@
  * A number of very detailed GB telephone number RegEx patterns can also be found at:
  * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
  */
-$.validator.addMethod("mobileUK", function(phone_number, element) {
-	phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/);
-}, "Please specify a valid mobile number");
+$.validator.addMethod( "mobileUK", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ );
+}, "Please specify a valid mobile number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/netmask.js b/civicrm/bower_components/jquery-validation/src/additional/netmask.js
new file mode 100644
index 0000000000..f0ba145291
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/netmask.js
@@ -0,0 +1,3 @@
+$.validator.addMethod( "netmask", function( value, element ) {
+    return this.optional( element ) || /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test( value );
+}, "Please enter a valid netmask." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/nieES.js b/civicrm/bower_components/jquery-validation/src/additional/nieES.js
index 254c0dab96..fb9f9b2543 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/nieES.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/nieES.js
@@ -1,34 +1,39 @@
 /*
- * The número de identidad de extranjero ( NIE )is a code used to identify the non-nationals in Spain
+ * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish
+ * authorities to any foreigner.
+ *
+ * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal
+ * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to
+ * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.
  */
-$.validator.addMethod( "nieES", function( value ) {
+$.validator.addMethod( "nieES", function( value, element ) {
 	"use strict";
 
-	value = value.toUpperCase();
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
+	var nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );
+	var validChars = "TRWAGMYFPDXBNJZSQVHLCKET",
+		letter = value.substr( value.length - 1 ).toUpperCase(),
+		number;
+
+	value = value.toString().toUpperCase();
 
-	// Basic format test
-	if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
+	// Quick format test
+	if ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {
 		return false;
 	}
 
-	// Test NIE
-	//T
-	if ( /^[T]{1}/.test( value ) ) {
-		return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
-	}
+	// X means same number
+	// Y means number + 10000000
+	// Z means number + 20000000
+	value = value.replace( /^[X]/, "0" )
+		.replace( /^[Y]/, "1" )
+		.replace( /^[Z]/, "2" );
 
-	//XYZ
-	if ( /^[XYZ]{1}/.test( value ) ) {
-		return (
-			value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt(
-				value.replace( "X", "0" )
-					.replace( "Y", "1" )
-					.replace( "Z", "2" )
-					.substring( 0, 8 ) % 23
-			)
-		);
-	}
+	number = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );
 
-	return false;
+	return validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;
 
 }, "Please specify a valid NIE number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/nifES.js b/civicrm/bower_components/jquery-validation/src/additional/nifES.js
index 47657474c8..8fe07e3ff5 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/nifES.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/nifES.js
@@ -1,13 +1,17 @@
 /*
  * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
  */
-$.validator.addMethod( "nifES", function( value ) {
+$.validator.addMethod( "nifES", function( value, element ) {
 	"use strict";
 
+	if ( this.optional( element ) ) {
+		return true;
+	}
+
 	value = value.toUpperCase();
 
 	// Basic format test
-	if ( !value.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)") ) {
+	if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
 		return false;
 	}
 
@@ -15,9 +19,10 @@ $.validator.addMethod( "nifES", function( value ) {
 	if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
 		return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
 	}
+
 	// Test specials NIF (starts with K, L or M)
 	if ( /^[KLM]{1}/.test( value ) ) {
-		return ( value[ 8 ] === String.fromCharCode( 64 ) );
+		return ( value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 1 ) % 23 ) );
 	}
 
 	return false;
diff --git a/civicrm/bower_components/jquery-validation/src/additional/nipPL.js b/civicrm/bower_components/jquery-validation/src/additional/nipPL.js
new file mode 100644
index 0000000000..7d38762dd1
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/nipPL.js
@@ -0,0 +1,22 @@
+/*
+ * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies
+ */
+$.validator.addMethod( "nipPL", function( value ) {
+	"use strict";
+
+	value = value.replace( /[^0-9]/g, "" );
+
+	if ( value.length !== 10 ) {
+		return false;
+	}
+
+	var arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];
+	var intSum = 0;
+	for ( var i = 0; i < 9; i++ ) {
+		intSum += arrSteps[ i ] * value[ i ];
+	}
+	var int2 = intSum % 11;
+	var intControlNr = ( int2 === 10 ) ? 0 : int2;
+
+	return ( intControlNr === parseInt( value[ 9 ], 10 ) );
+}, "Please specify a valid NIP number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/nisBR.js b/civicrm/bower_components/jquery-validation/src/additional/nisBR.js
new file mode 100644
index 0000000000..7a685d1cb2
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/nisBR.js
@@ -0,0 +1,57 @@
+/**
+ * Created for project jquery-validation.
+ * @Description Brazillian PIS or NIS number (Número de Identificação Social Pis ou Pasep) is the equivalent of a
+ * Brazilian tax registration number NIS of PIS numbers have 11 digits in total: 10 numbers followed by 1 check numbers
+ * that are being used for validation.
+ * @copyright (c) 21/08/2018 13:14, Cleiton da Silva Mendonça
+ * @author Cleiton da Silva Mendonça <cleiton.mendonca@gmail.com>
+ * @link http://gitlab.com/csmendonca Gitlab of Cleiton da Silva Mendonça
+ * @link http://github.com/csmendonca Github of Cleiton da Silva Mendonça
+ */
+$.validator.addMethod( "nisBR", function( value ) {
+	var number;
+	var cn;
+	var sum = 0;
+	var dv;
+	var count;
+	var multiplier;
+
+	// Removing special characters from value
+	value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
+
+	// Checking value to have 11 digits only
+	if ( value.length !== 11 ) {
+		return false;
+	}
+
+	//Get check number of value
+	cn = parseInt( value.substring( 10, 11 ), 10 );
+
+	//Get number with 10 digits of the value
+	number = parseInt( value.substring( 0, 10 ), 10 );
+
+	for ( count = 2; count < 12; count++ ) {
+		multiplier = count;
+		if ( count === 10 ) {
+			multiplier = 2;
+		}
+		if ( count === 11 ) {
+			multiplier = 3;
+		}
+		sum += ( ( number % 10 ) * multiplier );
+		number = parseInt( number / 10, 10 );
+	}
+	dv = ( sum % 11 );
+
+	if ( dv > 1 ) {
+		dv = ( 11 - dv );
+	} else {
+		dv = 0;
+	}
+
+	if ( cn === dv ) {
+		return true;
+	} else {
+		return false;
+	}
+}, "Please specify a valid NIS/PIS number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/notEqualTo.js b/civicrm/bower_components/jquery-validation/src/additional/notEqualTo.js
new file mode 100644
index 0000000000..bcbdf9890b
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/notEqualTo.js
@@ -0,0 +1,3 @@
+$.validator.addMethod( "notEqualTo", function( value, element, param ) {
+	return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );
+}, "Please enter a different value, values must not be the same." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/nowhitespace.js b/civicrm/bower_components/jquery-validation/src/additional/nowhitespace.js
index 3ad62008c0..7f6c3bd430 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/nowhitespace.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/nowhitespace.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("nowhitespace", function(value, element) {
-	return this.optional(element) || /^\S+$/i.test(value);
-}, "No white space please");
+$.validator.addMethod( "nowhitespace", function( value, element ) {
+	return this.optional( element ) || /^\S+$/i.test( value );
+}, "No white space please" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/pattern.js b/civicrm/bower_components/jquery-validation/src/additional/pattern.js
index 64c8d158cf..0d9de757fc 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/pattern.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/pattern.js
@@ -11,12 +11,12 @@
 * @type Boolean
 * @cat Plugins/Validate/Methods
 */
-$.validator.addMethod("pattern", function(value, element, param) {
-	if (this.optional(element)) {
+$.validator.addMethod( "pattern", function( value, element, param ) {
+	if ( this.optional( element ) ) {
 		return true;
 	}
-	if (typeof param === "string") {
-		param = new RegExp("^(?:" + param + ")$");
+	if ( typeof param === "string" ) {
+		param = new RegExp( "^(?:" + param + ")$" );
 	}
-	return param.test(value);
-}, "Invalid format.");
+	return param.test( value );
+}, "Invalid format." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/phoneNL.js b/civicrm/bower_components/jquery-validation/src/additional/phoneNL.js
index b54d0a4a4f..f7febbecda 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/phoneNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/phoneNL.js
@@ -1,6 +1,6 @@
 /**
  * Dutch phone numbers have 10 digits (or 11 and start with +31).
  */
-$.validator.addMethod("phoneNL", function(value, element) {
-	return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
-}, "Please specify a valid phone number.");
+$.validator.addMethod( "phoneNL", function( value, element ) {
+	return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
+}, "Please specify a valid phone number." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/phonePL.js b/civicrm/bower_components/jquery-validation/src/additional/phonePL.js
new file mode 100644
index 0000000000..cca314df41
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/additional/phonePL.js
@@ -0,0 +1,23 @@
+/**
+ * Polish telephone numbers have 9 digits.
+ *
+ * Mobile phone numbers starts with following digits:
+ * 45, 50, 51, 53, 57, 60, 66, 69, 72, 73, 78, 79, 88.
+ *
+ * Fixed-line numbers starts with area codes:
+ * 12, 13, 14, 15, 16, 17, 18, 22, 23, 24, 25, 29, 32, 33,
+ * 34, 41, 42, 43, 44, 46, 48, 52, 54, 55, 56, 58, 59, 61,
+ * 62, 63, 65, 67, 68, 71, 74, 75, 76, 77, 81, 82, 83, 84,
+ * 85, 86, 87, 89, 91, 94, 95.
+ *
+ * Ministry of National Defence numbers and VoIP numbers starts with 26 and 39.
+ *
+ * Excludes intelligent networks (premium rate, shared cost, free phone numbers).
+ *
+ * Poland National Numbering Plan http://www.itu.int/oth/T02020000A8/en
+ */
+$.validator.addMethod( "phonePL", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\s+/g, "" );
+	var regexp = /^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;
+	return this.optional( element ) || regexp.test( phone_number );
+}, "Please specify a valid phone number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/phoneUK.js b/civicrm/bower_components/jquery-validation/src/additional/phoneUK.js
index ae35a06ef3..b97866f096 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/phoneUK.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/phoneUK.js
@@ -6,8 +6,8 @@
  * A number of very detailed GB telephone number RegEx patterns can also be found at:
  * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
  */
-$.validator.addMethod("phoneUK", function(phone_number, element) {
-	phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/);
-}, "Please specify a valid phone number");
+$.validator.addMethod( "phoneUK", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ );
+}, "Please specify a valid phone number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/phoneUS.js b/civicrm/bower_components/jquery-validation/src/additional/phoneUS.js
index 15d0645ca9..894a25c679 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/phoneUS.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/phoneUS.js
@@ -1,5 +1,5 @@
 /**
- * matches US phone number format
+ * Matches US phone number format
  *
  * where the area code may not start with 1 and the prefix may not start with 1
  * allows '-' or ' ' as a separator and allows parens around area code
@@ -14,8 +14,8 @@
  * and not
  * 212 123 4567
  */
-$.validator.addMethod("phoneUS", function(phone_number, element) {
-	phone_number = phone_number.replace(/\s+/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/);
-}, "Please specify a valid phone number");
+$.validator.addMethod( "phoneUS", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\s+/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/ );
+}, "Please specify a valid phone number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/phonesUK.js b/civicrm/bower_components/jquery-validation/src/additional/phonesUK.js
index 9752cc5c14..fa04167d53 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/phonesUK.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/phonesUK.js
@@ -6,9 +6,10 @@
  * A number of very detailed GB telephone number RegEx patterns can also be found at:
  * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
  */
-//Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
-$.validator.addMethod("phonesUK", function(phone_number, element) {
-	phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
-	return this.optional(element) || phone_number.length > 9 &&
-		phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/);
-}, "Please specify a valid uk phone number");
+
+// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
+$.validator.addMethod( "phonesUK", function( phone_number, element ) {
+	phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
+	return this.optional( element ) || phone_number.length > 9 &&
+		phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ );
+}, "Please specify a valid uk phone number" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/postalCodeCA.js b/civicrm/bower_components/jquery-validation/src/additional/postalCodeCA.js
index 976b316c9e..ba3bb4a4e5 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/postalCodeCA.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/postalCodeCA.js
@@ -12,5 +12,5 @@
  * @cat Plugins/Validate/Methods
  */
 $.validator.addMethod( "postalCodeCA", function( value, element ) {
-	return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test( value );
+	return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value );
 }, "Please specify a valid postal code" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/postalcodeBR.js b/civicrm/bower_components/jquery-validation/src/additional/postalcodeBR.js
index b006297749..609f21b4f6 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/postalcodeBR.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/postalcodeBR.js
@@ -6,6 +6,6 @@
 * 99.999-999
 * 99999999
 */
-$.validator.addMethod("postalcodeBR", function(cep_value, element) {
-	return this.optional(element) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
-}, "Informe um CEP válido.");
+$.validator.addMethod( "postalcodeBR", function( cep_value, element ) {
+	return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
+}, "Informe um CEP válido." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/postalcodeIT.js b/civicrm/bower_components/jquery-validation/src/additional/postalcodeIT.js
index cae6463db9..38ea89d2b1 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/postalcodeIT.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/postalcodeIT.js
@@ -1,4 +1,4 @@
 /* Matches Italian postcode (CAP) */
-$.validator.addMethod("postalcodeIT", function(value, element) {
-	return this.optional(element) || /^\d{5}$/.test(value);
-}, "Please specify a valid postal code");
+$.validator.addMethod( "postalcodeIT", function( value, element ) {
+	return this.optional( element ) || /^\d{5}$/.test( value );
+}, "Please specify a valid postal code" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/postalcodeNL.js b/civicrm/bower_components/jquery-validation/src/additional/postalcodeNL.js
index e01a95ef21..38a547623a 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/postalcodeNL.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/postalcodeNL.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("postalcodeNL", function(value, element) {
-	return this.optional(element) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(value);
-}, "Please specify a valid postal code");
+$.validator.addMethod( "postalcodeNL", function( value, element ) {
+	return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value );
+}, "Please specify a valid postal code" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/postcodeUK.js b/civicrm/bower_components/jquery-validation/src/additional/postcodeUK.js
index de1413787b..26a4743c80 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/postcodeUK.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/postcodeUK.js
@@ -1,4 +1,4 @@
 // Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
-$.validator.addMethod("postcodeUK", function(value, element) {
-	return this.optional(element) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(value);
-}, "Please specify a valid UK postcode");
+$.validator.addMethod( "postcodeUK", function( value, element ) {
+	return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value );
+}, "Please specify a valid UK postcode" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/require_from_group.js b/civicrm/bower_components/jquery-validation/src/additional/require_from_group.js
index 41640c8071..c80d8337b8 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/require_from_group.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/require_from_group.js
@@ -14,24 +14,24 @@
  * options[0]: number of fields that must be filled in the group
  * options[1]: CSS selector that defines the group of conditionally required fields
  */
-$.validator.addMethod("require_from_group", function(value, element, options) {
-	var $fields = $(options[1], element.form),
-		$fieldsFirst = $fields.eq(0),
-		validator = $fieldsFirst.data("valid_req_grp") ? $fieldsFirst.data("valid_req_grp") : $.extend({}, this),
-		isValid = $fields.filter(function() {
-			return validator.elementValue(this);
-		}).length >= options[0];
+$.validator.addMethod( "require_from_group", function( value, element, options ) {
+	var $fields = $( options[ 1 ], element.form ),
+		$fieldsFirst = $fields.eq( 0 ),
+		validator = $fieldsFirst.data( "valid_req_grp" ) ? $fieldsFirst.data( "valid_req_grp" ) : $.extend( {}, this ),
+		isValid = $fields.filter( function() {
+			return validator.elementValue( this );
+		} ).length >= options[ 0 ];
 
 	// Store the cloned validator for future validation
-	$fieldsFirst.data("valid_req_grp", validator);
+	$fieldsFirst.data( "valid_req_grp", validator );
 
 	// If element isn't being validated, run each require_from_group field's validation rules
-	if (!$(element).data("being_validated")) {
-		$fields.data("being_validated", true);
-		$fields.each(function() {
-			validator.element(this);
-		});
-		$fields.data("being_validated", false);
+	if ( !$( element ).data( "being_validated" ) ) {
+		$fields.data( "being_validated", true );
+		$fields.each( function() {
+			validator.element( this );
+		} );
+		$fields.data( "being_validated", false );
 	}
 	return isValid;
-}, $.validator.format("Please fill at least {0} of these fields."));
+}, $.validator.format( "Please fill at least {0} of these fields." ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/skip_or_fill_minimum.js b/civicrm/bower_components/jquery-validation/src/additional/skip_or_fill_minimum.js
index eaaa750843..73bb6b555b 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/skip_or_fill_minimum.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/skip_or_fill_minimum.js
@@ -19,25 +19,25 @@
  * options[1]: CSS selector that defines the group of conditionally required fields
  *
  */
-$.validator.addMethod("skip_or_fill_minimum", function(value, element, options) {
-	var $fields = $(options[1], element.form),
-		$fieldsFirst = $fields.eq(0),
-		validator = $fieldsFirst.data("valid_skip") ? $fieldsFirst.data("valid_skip") : $.extend({}, this),
-		numberFilled = $fields.filter(function() {
-			return validator.elementValue(this);
-		}).length,
-		isValid = numberFilled === 0 || numberFilled >= options[0];
+$.validator.addMethod( "skip_or_fill_minimum", function( value, element, options ) {
+	var $fields = $( options[ 1 ], element.form ),
+		$fieldsFirst = $fields.eq( 0 ),
+		validator = $fieldsFirst.data( "valid_skip" ) ? $fieldsFirst.data( "valid_skip" ) : $.extend( {}, this ),
+		numberFilled = $fields.filter( function() {
+			return validator.elementValue( this );
+		} ).length,
+		isValid = numberFilled === 0 || numberFilled >= options[ 0 ];
 
 	// Store the cloned validator for future validation
-	$fieldsFirst.data("valid_skip", validator);
+	$fieldsFirst.data( "valid_skip", validator );
 
 	// If element isn't being validated, run each skip_or_fill_minimum field's validation rules
-	if (!$(element).data("being_validated")) {
-		$fields.data("being_validated", true);
-		$fields.each(function() {
-			validator.element(this);
-		});
-		$fields.data("being_validated", false);
+	if ( !$( element ).data( "being_validated" ) ) {
+		$fields.data( "being_validated", true );
+		$fields.each( function() {
+			validator.element( this );
+		} );
+		$fields.data( "being_validated", false );
 	}
 	return isValid;
-}, $.validator.format("Please either skip these fields or fill at least {0} of them."));
+}, $.validator.format( "Please either skip these fields or fill at least {0} of them." ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/statesUS.js b/civicrm/bower_components/jquery-validation/src/additional/statesUS.js
index ae3ccdfe27..015894f3b3 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/statesUS.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/statesUS.js
@@ -31,28 +31,24 @@
  *     includeMilitary: true
  *  }
  *
- *
- *
  */
-
-jQuery.validator.addMethod("stateUS", function(value, element, options) {
+$.validator.addMethod( "stateUS", function( value, element, options ) {
 	var isDefault = typeof options === "undefined",
 		caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
 		includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
 		includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
 		regex;
 
-	if (!includeTerritories && !includeMilitary) {
+	if ( !includeTerritories && !includeMilitary ) {
 		regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
-	} else if (includeTerritories && includeMilitary) {
+	} else if ( includeTerritories && includeMilitary ) {
 		regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
-	} else if (includeTerritories) {
+	} else if ( includeTerritories ) {
 		regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
 	} else {
 		regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
 	}
 
-	regex = caseSensitive ? new RegExp(regex) : new RegExp(regex, "i");
-	return this.optional(element) || regex.test(value);
-},
-"Please specify a valid state");
+	regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" );
+	return this.optional( element ) || regex.test( value );
+}, "Please specify a valid state" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/strippedminlength.js b/civicrm/bower_components/jquery-validation/src/additional/strippedminlength.js
index e170f71a20..e5bf73434f 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/strippedminlength.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/strippedminlength.js
@@ -1,4 +1,4 @@
 // TODO check if value starts with <, otherwise don't try stripping anything
-$.validator.addMethod("strippedminlength", function(value, element, param) {
-	return $(value).text().length >= param;
-}, $.validator.format("Please enter at least {0} characters"));
+$.validator.addMethod( "strippedminlength", function( value, element, param ) {
+	return $( value ).text().length >= param;
+}, $.validator.format( "Please enter at least {0} characters" ) );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/time.js b/civicrm/bower_components/jquery-validation/src/additional/time.js
index a66bb40ad9..2bcbce13e7 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/time.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/time.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("time", function(value, element) {
-	return this.optional(element) || /^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(value);
-}, "Please enter a valid time, between 00:00 and 23:59");
+$.validator.addMethod( "time", function( value, element ) {
+	return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value );
+}, "Please enter a valid time, between 00:00 and 23:59" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/time12h.js b/civicrm/bower_components/jquery-validation/src/additional/time12h.js
index a5f61211cf..fcd3fa2881 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/time12h.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/time12h.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("time12h", function(value, element) {
-	return this.optional(element) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(value);
-}, "Please enter a valid time in 12-hour am/pm format");
+$.validator.addMethod( "time12h", function( value, element ) {
+	return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value );
+}, "Please enter a valid time in 12-hour am/pm format" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/url2.js b/civicrm/bower_components/jquery-validation/src/additional/url2.js
index 3a5f6f0d9d..2baaf617f4 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/url2.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/url2.js
@@ -1,4 +1,4 @@
-// same as url, but TLD is optional
-$.validator.addMethod("url2", function(value, element) {
-	return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
-}, $.validator.messages.url);
+// Same as url, but TLD is optional
+$.validator.addMethod( "url2", function( value, element ) {
+	return this.optional( element ) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
+}, $.validator.messages.url );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/vinUS.js b/civicrm/bower_components/jquery-validation/src/additional/vinUS.js
index 2afd500da4..15460d7254 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/vinUS.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/vinUS.js
@@ -10,8 +10,8 @@
  * @type Boolean
  * @cat Plugins/Validate/Methods
  */
-$.validator.addMethod("vinUS", function(v) {
-	if (v.length !== 17) {
+$.validator.addMethod( "vinUS", function( v ) {
+	if ( v.length !== 17 ) {
 		return false;
 	}
 
@@ -21,21 +21,21 @@ $.validator.addMethod("vinUS", function(v) {
 		rs = 0,
 		i, n, d, f, cd, cdv;
 
-	for (i = 0; i < 17; i++) {
-		f = FL[i];
-		d = v.slice(i, i + 1);
-		if (i === 8) {
+	for ( i = 0; i < 17; i++ ) {
+		f = FL[ i ];
+		d = v.slice( i, i + 1 );
+		if ( i === 8 ) {
 			cdv = d;
 		}
-		if (!isNaN(d)) {
+		if ( !isNaN( d ) ) {
 			d *= f;
 		} else {
-			for (n = 0; n < LL.length; n++) {
-				if (d.toUpperCase() === LL[n]) {
-					d = VL[n];
+			for ( n = 0; n < LL.length; n++ ) {
+				if ( d.toUpperCase() === LL[ n ] ) {
+					d = VL[ n ];
 					d *= f;
-					if (isNaN(cdv) && n === 8) {
-						cdv = LL[n];
+					if ( isNaN( cdv ) && n === 8 ) {
+						cdv = LL[ n ];
 					}
 					break;
 				}
@@ -44,11 +44,11 @@ $.validator.addMethod("vinUS", function(v) {
 		rs += d;
 	}
 	cd = rs % 11;
-	if (cd === 10) {
+	if ( cd === 10 ) {
 		cd = "X";
 	}
-	if (cd === cdv) {
+	if ( cd === cdv ) {
 		return true;
 	}
 	return false;
-}, "The specified vehicle identification number (VIN) is invalid.");
+}, "The specified vehicle identification number (VIN) is invalid." );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/zipcodeUS.js b/civicrm/bower_components/jquery-validation/src/additional/zipcodeUS.js
index b631068934..8d52ac0b56 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/zipcodeUS.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/zipcodeUS.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("zipcodeUS", function(value, element) {
-	return this.optional(element) || /^\d{5}(-\d{4})?$/.test(value);
-}, "The specified US ZIP Code is invalid");
+$.validator.addMethod( "zipcodeUS", function( value, element ) {
+	return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value );
+}, "The specified US ZIP Code is invalid" );
diff --git a/civicrm/bower_components/jquery-validation/src/additional/ziprange.js b/civicrm/bower_components/jquery-validation/src/additional/ziprange.js
index 75b4d176cf..48dc6836d2 100644
--- a/civicrm/bower_components/jquery-validation/src/additional/ziprange.js
+++ b/civicrm/bower_components/jquery-validation/src/additional/ziprange.js
@@ -1,3 +1,3 @@
-$.validator.addMethod("ziprange", function(value, element) {
-	return this.optional(element) || /^90[2-5]\d\{2\}-\d{4}$/.test(value);
-}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx");
+$.validator.addMethod( "ziprange", function( value, element ) {
+	return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value );
+}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx" );
diff --git a/civicrm/bower_components/jquery-validation/src/ajax.js b/civicrm/bower_components/jquery-validation/src/ajax.js
index 4026ad2f32..fb56de4b33 100644
--- a/civicrm/bower_components/jquery-validation/src/ajax.js
+++ b/civicrm/bower_components/jquery-validation/src/ajax.js
@@ -1,33 +1,35 @@
-// ajax mode: abort
+// Ajax mode: abort
 // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
 // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
 
 var pendingRequests = {},
 	ajax;
+
 // Use a prefilter if available (1.5+)
 if ( $.ajaxPrefilter ) {
-	$.ajaxPrefilter(function( settings, _, xhr ) {
+	$.ajaxPrefilter( function( settings, _, xhr ) {
 		var port = settings.port;
 		if ( settings.mode === "abort" ) {
-			if ( pendingRequests[port] ) {
-				pendingRequests[port].abort();
+			if ( pendingRequests[ port ] ) {
+				pendingRequests[ port ].abort();
 			}
-			pendingRequests[port] = xhr;
+			pendingRequests[ port ] = xhr;
 		}
-	});
+	} );
 } else {
+
 	// Proxy ajax
 	ajax = $.ajax;
 	$.ajax = function( settings ) {
 		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
 			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
 		if ( mode === "abort" ) {
-			if ( pendingRequests[port] ) {
-				pendingRequests[port].abort();
+			if ( pendingRequests[ port ] ) {
+				pendingRequests[ port ].abort();
 			}
-			pendingRequests[port] = ajax.apply(this, arguments);
-			return pendingRequests[port];
+			pendingRequests[ port ] = ajax.apply( this, arguments );
+			return pendingRequests[ port ];
 		}
-		return ajax.apply(this, arguments);
+		return ajax.apply( this, arguments );
 	};
 }
diff --git a/civicrm/bower_components/jquery-validation/src/core.js b/civicrm/bower_components/jquery-validation/src/core.js
index 4630a9fe99..ccb8d4cbe4 100644
--- a/civicrm/bower_components/jquery-validation/src/core.js
+++ b/civicrm/bower_components/jquery-validation/src/core.js
@@ -1,8 +1,9 @@
-$.extend($.fn, {
-	// http://jqueryvalidation.org/validate/
+$.extend( $.fn, {
+
+	// https://jqueryvalidation.org/validate/
 	validate: function( options ) {
 
-		// if nothing is selected, return nothing; can't chain anyway
+		// If nothing is selected, return nothing; can't chain anyway
 		if ( !this.length ) {
 			if ( options && options.debug && window.console ) {
 				console.warn( "Nothing selected, can't validate, returning nothing." );
@@ -10,7 +11,7 @@ $.extend($.fn, {
 			return;
 		}
 
-		// check if a validator for this form was already created
+		// Check if a validator for this form was already created
 		var validator = $.data( this[ 0 ], "validator" );
 		if ( validator ) {
 			return validator;
@@ -24,40 +25,51 @@ $.extend($.fn, {
 
 		if ( validator.settings.onsubmit ) {
 
-			this.validateDelegate( ":submit", "click", function( event ) {
-				if ( validator.settings.submitHandler ) {
-					validator.submitButton = event.target;
-				}
-				// allow suppressing validation by adding a cancel class to the submit button
-				if ( $( event.target ).hasClass( "cancel" ) ) {
+			this.on( "click.validate", ":submit", function( event ) {
+
+				// Track the used submit button to properly handle scripted
+				// submits later.
+				validator.submitButton = event.currentTarget;
+
+				// Allow suppressing validation by adding a cancel class to the submit button
+				if ( $( this ).hasClass( "cancel" ) ) {
 					validator.cancelSubmit = true;
 				}
 
-				// allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
-				if ( $( event.target ).attr( "formnovalidate" ) !== undefined ) {
+				// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
+				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
 					validator.cancelSubmit = true;
 				}
-			});
+			} );
 
-			// validate the form on submit
-			this.submit( function( event ) {
+			// Validate the form on submit
+			this.on( "submit.validate", function( event ) {
 				if ( validator.settings.debug ) {
-					// prevent form submit to be able to see console output
+
+					// Prevent form submit to be able to see console output
 					event.preventDefault();
 				}
+
 				function handle() {
 					var hidden, result;
-					if ( validator.settings.submitHandler ) {
-						if ( validator.submitButton ) {
-							// insert a hidden input as a replacement for the missing submit button
-							hidden = $( "<input type='hidden'/>" )
-								.attr( "name", validator.submitButton.name )
-								.val( $( validator.submitButton ).val() )
-								.appendTo( validator.currentForm );
-						}
+
+					// Insert a hidden input as a replacement for the missing submit button
+					// The hidden input is inserted in two cases:
+					//   - A user defined a `submitHandler`
+					//   - There was a pending request due to `remote` method and `stopRequest()`
+					//     was called to submit the form in case it's valid
+					if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
+						hidden = $( "<input type='hidden'/>" )
+							.attr( "name", validator.submitButton.name )
+							.val( $( validator.submitButton ).val() )
+							.appendTo( validator.currentForm );
+					}
+
+					if ( validator.settings.submitHandler && !validator.settings.debug ) {
 						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
-						if ( validator.submitButton ) {
-							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
+						if ( hidden ) {
+
+							// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
 							hidden.remove();
 						}
 						if ( result !== undefined ) {
@@ -68,7 +80,7 @@ $.extend($.fn, {
 					return true;
 				}
 
-				// prevent submit for invalid forms or custom submit handlers
+				// Prevent submit for invalid forms or custom submit handlers
 				if ( validator.cancelSubmit ) {
 					validator.cancelSubmit = false;
 					return handle();
@@ -83,41 +95,53 @@ $.extend($.fn, {
 					validator.focusInvalid();
 					return false;
 				}
-			});
+			} );
 		}
 
 		return validator;
 	},
-	// http://jqueryvalidation.org/valid/
+
+	// https://jqueryvalidation.org/valid/
 	valid: function() {
-		var valid, validator;
+		var valid, validator, errorList;
 
 		if ( $( this[ 0 ] ).is( "form" ) ) {
 			valid = this.validate().form();
 		} else {
+			errorList = [];
 			valid = true;
 			validator = $( this[ 0 ].form ).validate();
 			this.each( function() {
 				valid = validator.element( this ) && valid;
-			});
+				if ( !valid ) {
+					errorList = errorList.concat( validator.errorList );
+				}
+			} );
+			validator.errorList = errorList;
 		}
 		return valid;
 	},
-	// attributes: space separated list of attributes to retrieve and remove
-	removeAttrs: function( attributes ) {
-		var result = {},
-			$element = this;
-		$.each( attributes.split( /\s/ ), function( index, value ) {
-			result[ value ] = $element.attr( value );
-			$element.removeAttr( value );
-		});
-		return result;
-	},
-	// http://jqueryvalidation.org/rules/
+
+	// https://jqueryvalidation.org/rules/
 	rules: function( command, argument ) {
 		var element = this[ 0 ],
+			isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
 			settings, staticRules, existingRules, data, param, filtered;
 
+		// If nothing is selected, return empty object; can't chain anyway
+		if ( element == null ) {
+			return;
+		}
+
+		if ( !element.form && isContentEditable ) {
+			element.form = this.closest( "form" )[ 0 ];
+			element.name = this.attr( "name" );
+		}
+
+		if ( element.form == null ) {
+			return;
+		}
+
 		if ( command ) {
 			settings = $.data( element.form, "validator" ).settings;
 			staticRules = settings.rules;
@@ -125,7 +149,8 @@ $.extend($.fn, {
 			switch ( command ) {
 			case "add":
 				$.extend( existingRules, $.validator.normalizeRule( argument ) );
-				// remove messages from rules, but allow them to be set separately
+
+				// Remove messages from rules, but allow them to be set separately
 				delete existingRules.messages;
 				staticRules[ element.name ] = existingRules;
 				if ( argument.messages ) {
@@ -141,10 +166,7 @@ $.extend($.fn, {
 				$.each( argument.split( /\s/ ), function( index, method ) {
 					filtered[ method ] = existingRules[ method ];
 					delete existingRules[ method ];
-					if ( method === "required" ) {
-						$( element ).removeAttr( "aria-required" );
-					}
-				});
+				} );
 				return filtered;
 			}
 		}
@@ -158,49 +180,52 @@ $.extend($.fn, {
 			$.validator.staticRules( element )
 		), element );
 
-		// make sure required is at front
+		// Make sure required is at front
 		if ( data.required ) {
 			param = data.required;
 			delete data.required;
 			data = $.extend( { required: param }, data );
-			$( element ).attr( "aria-required", "true" );
 		}
 
-		// make sure remote is at back
+		// Make sure remote is at back
 		if ( data.remote ) {
 			param = data.remote;
 			delete data.remote;
-			data = $.extend( data, { remote: param });
+			data = $.extend( data, { remote: param } );
 		}
 
 		return data;
 	}
-});
+} );
 
 // Custom selectors
-$.extend( $.expr[ ":" ], {
-	// http://jqueryvalidation.org/blank-selector/
+$.extend( $.expr.pseudos || $.expr[ ":" ], {		// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support
+
+	// https://jqueryvalidation.org/blank-selector/
 	blank: function( a ) {
 		return !$.trim( "" + $( a ).val() );
 	},
-	// http://jqueryvalidation.org/filled-selector/
+
+	// https://jqueryvalidation.org/filled-selector/
 	filled: function( a ) {
-		return !!$.trim( "" + $( a ).val() );
+		var val = $( a ).val();
+		return val !== null && !!$.trim( "" + val );
 	},
-	// http://jqueryvalidation.org/unchecked-selector/
+
+	// https://jqueryvalidation.org/unchecked-selector/
 	unchecked: function( a ) {
 		return !$( a ).prop( "checked" );
 	}
-});
+} );
 
-// constructor for validator
+// Constructor for validator
 $.validator = function( options, form ) {
 	this.settings = $.extend( true, {}, $.validator.defaults, options );
 	this.currentForm = form;
 	this.init();
 };
 
-// http://jqueryvalidation.org/jQuery.validator.format/
+// https://jqueryvalidation.org/jQuery.validator.format/
 $.validator.format = function( source, params ) {
 	if ( arguments.length === 1 ) {
 		return function() {
@@ -209,6 +234,9 @@ $.validator.format = function( source, params ) {
 			return $.validator.format.apply( this, args );
 		};
 	}
+	if ( params === undefined ) {
+		return source;
+	}
 	if ( arguments.length > 2 && params.constructor !== Array  ) {
 		params = $.makeArray( arguments ).slice( 1 );
 	}
@@ -218,8 +246,8 @@ $.validator.format = function( source, params ) {
 	$.each( params, function( i, n ) {
 		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
 			return n;
-		});
-	});
+		} );
+	} );
 	return source;
 };
 
@@ -230,6 +258,7 @@ $.extend( $.validator, {
 		groups: {},
 		rules: {},
 		errorClass: "error",
+		pendingClass: "pending",
 		validClass: "valid",
 		errorElement: "label",
 		focusCleanup: false,
@@ -256,18 +285,39 @@ $.extend( $.validator, {
 			}
 		},
 		onkeyup: function( element, event ) {
-			if ( event.which === 9 && this.elementValue( element ) === "" ) {
+
+			// Avoid revalidate the field when pressing one of the following keys
+			// Shift       => 16
+			// Ctrl        => 17
+			// Alt         => 18
+			// Caps lock   => 20
+			// End         => 35
+			// Home        => 36
+			// Left arrow  => 37
+			// Up arrow    => 38
+			// Right arrow => 39
+			// Down arrow  => 40
+			// Insert      => 45
+			// Num lock    => 144
+			// AltGr key   => 225
+			var excludedKeys = [
+				16, 17, 18, 20, 35, 36, 37,
+				38, 39, 40, 45, 144, 225
+			];
+
+			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
 				return;
-			} else if ( element.name in this.submitted || element === this.lastElement ) {
+			} else if ( element.name in this.submitted || element.name in this.invalid ) {
 				this.element( element );
 			}
 		},
 		onclick: function( element ) {
-			// click on selects, radiobuttons and checkboxes
+
+			// Click on selects, radiobuttons and checkboxes
 			if ( element.name in this.submitted ) {
 				this.element( element );
 
-			// or option elements, check parent select in that case
+			// Or option elements, check parent select in that case
 			} else if ( element.parentNode.name in this.submitted ) {
 				this.element( element.parentNode );
 			}
@@ -288,7 +338,7 @@ $.extend( $.validator, {
 		}
 	},
 
-	// http://jqueryvalidation.org/jQuery.validator.setDefaults/
+	// https://jqueryvalidation.org/jQuery.validator.setDefaults/
 	setDefaults: function( settings ) {
 		$.extend( $.validator.defaults, settings );
 	},
@@ -299,17 +349,17 @@ $.extend( $.validator, {
 		email: "Please enter a valid email address.",
 		url: "Please enter a valid URL.",
 		date: "Please enter a valid date.",
-		dateISO: "Please enter a valid date ( ISO ).",
+		dateISO: "Please enter a valid date (ISO).",
 		number: "Please enter a valid number.",
 		digits: "Please enter only digits.",
-		creditcard: "Please enter a valid credit card number.",
 		equalTo: "Please enter the same value again.",
 		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
 		minlength: $.validator.format( "Please enter at least {0} characters." ),
 		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
 		range: $.validator.format( "Please enter a value between {0} and {1}." ),
 		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
-		min: $.validator.format( "Please enter a value greater than or equal to {0}." )
+		min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
+		step: $.validator.format( "Please enter a multiple of {0}." )
 	},
 
 	autoCreateRanges: false,
@@ -327,7 +377,8 @@ $.extend( $.validator, {
 			this.invalid = {};
 			this.reset();
 
-			var groups = ( this.groups = {} ),
+			var currentForm = this.currentForm,
+				groups = ( this.groups = {} ),
 				rules;
 			$.each( this.settings.groups, function( key, value ) {
 				if ( typeof value === "string" ) {
@@ -335,48 +386,59 @@ $.extend( $.validator, {
 				}
 				$.each( value, function( index, name ) {
 					groups[ name ] = key;
-				});
-			});
+				} );
+			} );
 			rules = this.settings.rules;
 			$.each( rules, function( key, value ) {
 				rules[ key ] = $.validator.normalizeRule( value );
-			});
+			} );
 
 			function delegate( event ) {
-				var validator = $.data( this[ 0 ].form, "validator" ),
+				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
+
+				// Set form expando on contenteditable
+				if ( !this.form && isContentEditable ) {
+					this.form = $( this ).closest( "form" )[ 0 ];
+					this.name = $( this ).attr( "name" );
+				}
+
+				// Ignore the element if it belongs to another form. This will happen mainly
+				// when setting the `form` attribute of an input to the id of another form.
+				if ( currentForm !== this.form ) {
+					return;
+				}
+
+				var validator = $.data( this.form, "validator" ),
 					eventType = "on" + event.type.replace( /^validate/, "" ),
 					settings = validator.settings;
-				if ( settings[ eventType ] && !this.is( settings.ignore ) ) {
-					settings[ eventType ].call( validator, this[ 0 ], event );
+				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
+					settings[ eventType ].call( validator, this, event );
 				}
 			}
+
 			$( this.currentForm )
-				.validateDelegate( ":text, [type='password'], [type='file'], select, textarea, " +
-					"[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
-					"[type='email'], [type='datetime'], [type='date'], [type='month'], " +
-					"[type='week'], [type='time'], [type='datetime-local'], " +
-					"[type='range'], [type='color'], [type='radio'], [type='checkbox']",
-					"focusin focusout keyup", delegate)
+				.on( "focusin.validate focusout.validate keyup.validate",
+					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
+					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
+					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
+					"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )
+
 				// Support: Chrome, oldIE
 				// "select" is provided as event.target when clicking a option
-				.validateDelegate("select, option, [type='radio'], [type='checkbox']", "click", delegate);
+				.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );
 
 			if ( this.settings.invalidHandler ) {
-				$( this.currentForm ).bind( "invalid-form.validate", this.settings.invalidHandler );
+				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
 			}
-
-			// Add aria-required to any Static/Data/Class required fields before first validation
-			// Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
-			$( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
 		},
 
-		// http://jqueryvalidation.org/Validator.form/
+		// https://jqueryvalidation.org/Validator.form/
 		form: function() {
 			this.checkForm();
 			$.extend( this.submitted, this.errorMap );
-			this.invalid = $.extend({}, this.errorMap );
+			this.invalid = $.extend( {}, this.errorMap );
 			if ( !this.valid() ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
+				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
 			}
 			this.showErrors();
 			return this.valid();
@@ -390,13 +452,13 @@ $.extend( $.validator, {
 			return this.valid();
 		},
 
-		// http://jqueryvalidation.org/Validator.element/
+		// https://jqueryvalidation.org/Validator.element/
 		element: function( element ) {
 			var cleanElement = this.clean( element ),
 				checkElement = this.validationTargetFor( cleanElement ),
-				result = true;
-
-			this.lastElement = checkElement;
+				v = this,
+				result = true,
+				rs, group;
 
 			if ( checkElement === undefined ) {
 				delete this.invalid[ cleanElement.name ];
@@ -404,40 +466,61 @@ $.extend( $.validator, {
 				this.prepareElement( checkElement );
 				this.currentElements = $( checkElement );
 
-				result = this.check( checkElement ) !== false;
-				if ( result ) {
-					delete this.invalid[ checkElement.name ];
+				// If this element is grouped, then validate all group elements already
+				// containing a value
+				group = this.groups[ checkElement.name ];
+				if ( group ) {
+					$.each( this.groups, function( name, testgroup ) {
+						if ( testgroup === group && name !== checkElement.name ) {
+							cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
+							if ( cleanElement && cleanElement.name in v.invalid ) {
+								v.currentElements.push( cleanElement );
+								result = v.check( cleanElement ) && result;
+							}
+						}
+					} );
+				}
+
+				rs = this.check( checkElement ) !== false;
+				result = result && rs;
+				if ( rs ) {
+					this.invalid[ checkElement.name ] = false;
 				} else {
 					this.invalid[ checkElement.name ] = true;
 				}
-			}
-			// Add aria-invalid status for screen readers
-			$( element ).attr( "aria-invalid", !result );
 
-			if ( !this.numberOfInvalids() ) {
-				// Hide error containers on last error
-				this.toHide = this.toHide.add( this.containers );
+				if ( !this.numberOfInvalids() ) {
+
+					// Hide error containers on last error
+					this.toHide = this.toHide.add( this.containers );
+				}
+				this.showErrors();
+
+				// Add aria-invalid status for screen readers
+				$( element ).attr( "aria-invalid", !rs );
 			}
-			this.showErrors();
+
 			return result;
 		},
 
-		// http://jqueryvalidation.org/Validator.showErrors/
+		// https://jqueryvalidation.org/Validator.showErrors/
 		showErrors: function( errors ) {
 			if ( errors ) {
-				// add items to error list and map
+				var validator = this;
+
+				// Add items to error list and map
 				$.extend( this.errorMap, errors );
-				this.errorList = [];
-				for ( var name in errors ) {
-					this.errorList.push({
-						message: errors[ name ],
-						element: this.findByName( name )[ 0 ]
-					});
-				}
-				// remove items from success list
+				this.errorList = $.map( this.errorMap, function( message, name ) {
+					return {
+						message: message,
+						element: validator.findByName( name )[ 0 ]
+					};
+				} );
+
+				// Remove items from success list
 				this.successList = $.grep( this.successList, function( element ) {
 					return !( element.name in errors );
-				});
+				} );
 			}
 			if ( this.settings.showErrors ) {
 				this.settings.showErrors.call( this, this.errorMap, this.errorList );
@@ -446,19 +529,36 @@ $.extend( $.validator, {
 			}
 		},
 
-		// http://jqueryvalidation.org/Validator.resetForm/
+		// https://jqueryvalidation.org/Validator.resetForm/
 		resetForm: function() {
 			if ( $.fn.resetForm ) {
 				$( this.currentForm ).resetForm();
 			}
+			this.invalid = {};
 			this.submitted = {};
-			this.lastElement = null;
 			this.prepareForm();
 			this.hideErrors();
-			this.elements()
+			var elements = this.elements()
+				.removeData( "previousValue" )
+				.removeAttr( "aria-invalid" );
+
+			this.resetElements( elements );
+		},
+
+		resetElements: function( elements ) {
+			var i;
+
+			if ( this.settings.unhighlight ) {
+				for ( i = 0; elements[ i ]; i++ ) {
+					this.settings.unhighlight.call( this, elements[ i ],
+						this.settings.errorClass, "" );
+					this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
+				}
+			} else {
+				elements
 					.removeClass( this.settings.errorClass )
-					.removeData( "previousValue" )
-					.removeAttr( "aria-invalid" );
+					.removeClass( this.settings.validClass );
+			}
 		},
 
 		numberOfInvalids: function() {
@@ -470,7 +570,12 @@ $.extend( $.validator, {
 			var count = 0,
 				i;
 			for ( i in obj ) {
-				count++;
+
+				// This check allows counting elements with empty error
+				// message as invalid elements
+				if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
+					count++;
+				}
 			}
 			return count;
 		},
@@ -495,13 +600,15 @@ $.extend( $.validator, {
 		focusInvalid: function() {
 			if ( this.settings.focusInvalid ) {
 				try {
-					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
+					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
 					.filter( ":visible" )
-					.focus()
-					// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
+					.trigger( "focus" )
+
+					// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
 					.trigger( "focusin" );
 				} catch ( e ) {
-					// ignore IE throwing errors when focusing hidden elements
+
+					// Ignore IE throwing errors when focusing hidden elements
 				}
 			}
 		},
@@ -510,31 +617,45 @@ $.extend( $.validator, {
 			var lastActive = this.lastActive;
 			return lastActive && $.grep( this.errorList, function( n ) {
 				return n.element.name === lastActive.name;
-			}).length === 1 && lastActive;
+			} ).length === 1 && lastActive;
 		},
 
 		elements: function() {
 			var validator = this,
 				rulesCache = {};
 
-			// select all valid inputs inside the form (no submit or reset buttons)
+			// Select all valid inputs inside the form (no submit or reset buttons)
 			return $( this.currentForm )
-			.find( "input, select, textarea" )
-			.not( ":submit, :reset, :image, [disabled], [readonly]" )
+			.find( "input, select, textarea, [contenteditable]" )
+			.not( ":submit, :reset, :image, :disabled" )
 			.not( this.settings.ignore )
 			.filter( function() {
-				if ( !this.name && validator.settings.debug && window.console ) {
+				var name = this.name || $( this ).attr( "name" ); // For contenteditable
+				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";
+
+				if ( !name && validator.settings.debug && window.console ) {
 					console.error( "%o has no name assigned", this );
 				}
 
-				// select only the first element for each name, and only those with rules specified
-				if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
+				// Set form expando on contenteditable
+				if ( isContentEditable ) {
+					this.form = $( this ).closest( "form" )[ 0 ];
+					this.name = name;
+				}
+
+				// Ignore elements that belong to other/nested forms
+				if ( this.form !== validator.currentForm ) {
+					return false;
+				}
+
+				// Select only the first element for each name, and only those with rules specified
+				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
 					return false;
 				}
 
-				rulesCache[ this.name ] = true;
+				rulesCache[ name ] = true;
 				return true;
-			});
+			} );
 		},
 
 		clean: function( selector ) {
@@ -546,12 +667,16 @@ $.extend( $.validator, {
 			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
 		},
 
-		reset: function() {
+		resetInternals: function() {
 			this.successList = [];
 			this.errorList = [];
 			this.errorMap = {};
 			this.toShow = $( [] );
 			this.toHide = $( [] );
+		},
+
+		reset: function() {
+			this.resetInternals();
 			this.currentElements = $( [] );
 		},
 
@@ -566,19 +691,49 @@ $.extend( $.validator, {
 		},
 
 		elementValue: function( element ) {
-			var val,
-				$element = $( element ),
-				type = element.type;
+			var $element = $( element ),
+				type = element.type,
+				isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
+				val, idx;
 
 			if ( type === "radio" || type === "checkbox" ) {
-				return $( "input[name='" + element.name + "']:checked" ).val();
+				return this.findByName( element.name ).filter( ":checked" ).val();
 			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
-				return element.validity.badInput ? false : $element.val();
+				return element.validity.badInput ? "NaN" : $element.val();
+			}
+
+			if ( isContentEditable ) {
+				val = $element.text();
+			} else {
+				val = $element.val();
+			}
+
+			if ( type === "file" ) {
+
+				// Modern browser (chrome & safari)
+				if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
+					return val.substr( 12 );
+				}
+
+				// Legacy browsers
+				// Unix-based path
+				idx = val.lastIndexOf( "/" );
+				if ( idx >= 0 ) {
+					return val.substr( idx + 1 );
+				}
+
+				// Windows-based path
+				idx = val.lastIndexOf( "\\" );
+				if ( idx >= 0 ) {
+					return val.substr( idx + 1 );
+				}
+
+				// Just the file name
+				return val;
 			}
 
-			val = $element.val();
 			if ( typeof val === "string" ) {
-				return val.replace(/\r/g, "" );
+				return val.replace( /\r/g, "" );
 			}
 			return val;
 		},
@@ -589,18 +744,35 @@ $.extend( $.validator, {
 			var rules = $( element ).rules(),
 				rulesCount = $.map( rules, function( n, i ) {
 					return i;
-				}).length,
+				} ).length,
 				dependencyMismatch = false,
 				val = this.elementValue( element ),
-				result, method, rule;
+				result, method, rule, normalizer;
+
+			// Prioritize the local normalizer defined for this element over the global one
+			// if the former exists, otherwise user the global one in case it exists.
+			if ( typeof rules.normalizer === "function" ) {
+				normalizer = rules.normalizer;
+			} else if (	typeof this.settings.normalizer === "function" ) {
+				normalizer = this.settings.normalizer;
+			}
+
+			// If normalizer is defined, then call it to retreive the changed value instead
+			// of using the real one.
+			// Note that `this` in the normalizer is `element`.
+			if ( normalizer ) {
+				val = normalizer.call( element, val );
+
+				// Delete the normalizer from rules to avoid treating it as a pre-defined method.
+				delete rules.normalizer;
+			}
 
 			for ( method in rules ) {
 				rule = { method: method, parameters: rules[ method ] };
 				try {
-
 					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
 
-					// if a method indicates that the field is optional and therefore valid,
+					// If a method indicates that the field is optional and therefore valid,
 					// don't mark it as valid when there are no other rules
 					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
 						dependencyMismatch = true;
@@ -621,6 +793,10 @@ $.extend( $.validator, {
 					if ( this.settings.debug && window.console ) {
 						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
 					}
+					if ( e instanceof TypeError ) {
+						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
+					}
+
 					throw e;
 				}
 			}
@@ -633,7 +809,7 @@ $.extend( $.validator, {
 			return true;
 		},
 
-		// return the custom message for the given element and validation method
+		// Return the custom message for the given element and validation method
 		// specified in the element's HTML5 data attribute
 		// return the generic message if present and no method specific message is present
 		customDataMessage: function( element, method ) {
@@ -641,15 +817,15 @@ $.extend( $.validator, {
 				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
 		},
 
-		// return the custom message for the given element name and validation method
+		// Return the custom message for the given element name and validation method
 		customMessage: function( name, method ) {
 			var m = this.settings.messages[ name ];
-			return m && ( m.constructor === String ? m : m[ method ]);
+			return m && ( m.constructor === String ? m : m[ method ] );
 		},
 
-		// return the first defined argument, allowing empty strings
+		// Return the first defined argument, allowing empty strings
 		findDefined: function() {
-			for ( var i = 0; i < arguments.length; i++) {
+			for ( var i = 0; i < arguments.length; i++ ) {
 				if ( arguments[ i ] !== undefined ) {
 					return arguments[ i ];
 				}
@@ -657,30 +833,47 @@ $.extend( $.validator, {
 			return undefined;
 		},
 
-		defaultMessage: function( element, method ) {
-			return this.findDefined(
-				this.customMessage( element.name, method ),
-				this.customDataMessage( element, method ),
-				// title is never undefined, so handle empty string as undefined
-				!this.settings.ignoreTitle && element.title || undefined,
-				$.validator.messages[ method ],
-				"<strong>Warning: No message defined for " + element.name + "</strong>"
-			);
-		},
+		// The second parameter 'rule' used to be a string, and extended to an object literal
+		// of the following form:
+		// rule = {
+		//     method: "method name",
+		//     parameters: "the given method parameters"
+		// }
+		//
+		// The old behavior still supported, kept to maintain backward compatibility with
+		// old code, and will be removed in the next major release.
+		defaultMessage: function( element, rule ) {
+			if ( typeof rule === "string" ) {
+				rule = { method: rule };
+			}
 
-		formatAndAdd: function( element, rule ) {
-			var message = this.defaultMessage( element, rule.method ),
+			var message = this.findDefined(
+					this.customMessage( element.name, rule.method ),
+					this.customDataMessage( element, rule.method ),
+
+					// 'title' is never undefined, so handle empty string as undefined
+					!this.settings.ignoreTitle && element.title || undefined,
+					$.validator.messages[ rule.method ],
+					"<strong>Warning: No message defined for " + element.name + "</strong>"
+				),
 				theregex = /\$?\{(\d+)\}/g;
 			if ( typeof message === "function" ) {
 				message = message.call( this, rule.parameters, element );
 			} else if ( theregex.test( message ) ) {
 				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
 			}
-			this.errorList.push({
+
+			return message;
+		},
+
+		formatAndAdd: function( element, rule ) {
+			var message = this.defaultMessage( element, rule );
+
+			this.errorList.push( {
 				message: message,
 				element: element,
 				method: rule.method
-			});
+			} );
 
 			this.errorMap[ element.name ] = message;
 			this.submitted[ element.name ] = message;
@@ -725,23 +918,27 @@ $.extend( $.validator, {
 		},
 
 		invalidElements: function() {
-			return $( this.errorList ).map(function() {
+			return $( this.errorList ).map( function() {
 				return this.element;
-			});
+			} );
 		},
 
 		showLabel: function( element, message ) {
-			var place, group, errorID,
+			var place, group, errorID, v,
 				error = this.errorsFor( element ),
 				elementID = this.idOrName( element ),
 				describedBy = $( element ).attr( "aria-describedby" );
+
 			if ( error.length ) {
-				// refresh error/success class
+
+				// Refresh error/success class
 				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
-				// replace message on existing label
+
+				// Replace message on existing label
 				error.html( message );
 			} else {
-				// create error element
+
+				// Create error element
 				error = $( "<" + this.settings.errorElement + ">" )
 					.attr( "id", elementID + "-error" )
 					.addClass( this.settings.errorClass )
@@ -750,31 +947,35 @@ $.extend( $.validator, {
 				// Maintain reference to the element to be placed into the DOM
 				place = error;
 				if ( this.settings.wrapper ) {
-					// make sure the element is visible, even in IE
+
+					// Make sure the element is visible, even in IE
 					// actually showing the wrapped element is handled elsewhere
 					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
 				}
 				if ( this.labelContainer.length ) {
 					this.labelContainer.append( place );
 				} else if ( this.settings.errorPlacement ) {
-					this.settings.errorPlacement( place, $( element ) );
+					this.settings.errorPlacement.call( this, place, $( element ) );
 				} else {
 					place.insertAfter( element );
 				}
 
 				// Link error back to the element
 				if ( error.is( "label" ) ) {
+
 					// If the error is a label, then associate using 'for'
 					error.attr( "for", elementID );
-				} else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
+
 					// If the element is not a child of an associated label, then it's necessary
 					// to explicitly apply aria-describedby
+				} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
+					errorID = error.attr( "id" );
 
-					errorID = error.attr( "id" ).replace( /(:|\.|\[|\])/g, "\\$1");
 					// Respect existing non-error aria-describedby
 					if ( !describedBy ) {
 						describedBy = errorID;
-					} else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
+					} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {
+
 						// Add to end of list if not already present
 						describedBy += " " + errorID;
 					}
@@ -783,12 +984,13 @@ $.extend( $.validator, {
 					// If this element is grouped, then assign to all elements in the same group
 					group = this.groups[ element.name ];
 					if ( group ) {
-						$.each( this.groups, function( name, testgroup ) {
+						v = this;
+						$.each( v.groups, function( name, testgroup ) {
 							if ( testgroup === group ) {
-								$( "[name='" + name + "']", this.currentForm )
+								$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
 									.attr( "aria-describedby", error.attr( "id" ) );
 							}
-						});
+						} );
 					}
 				}
 			}
@@ -804,19 +1006,28 @@ $.extend( $.validator, {
 		},
 
 		errorsFor: function( element ) {
-			var name = this.idOrName( element ),
+			var name = this.escapeCssMeta( this.idOrName( element ) ),
 				describer = $( element ).attr( "aria-describedby" ),
 				selector = "label[for='" + name + "'], label[for='" + name + "'] *";
 
-			// aria-describedby should directly reference the error element
+			// 'aria-describedby' should directly reference the error element
 			if ( describer ) {
-				selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
+				selector = selector + ", #" + this.escapeCssMeta( describer )
+					.replace( /\s+/g, ", #" );
 			}
+
 			return this
 				.errors()
 				.filter( selector );
 		},
 
+		// See https://api.jquery.com/category/selectors/, for CSS
+		// meta-characters that should be escaped in order to be used with JQuery
+		// as a literal part of a name/id or any selector.
+		escapeCssMeta: function( string ) {
+			return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
+		},
+
 		idOrName: function( element ) {
 			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
 		},
@@ -837,7 +1048,7 @@ $.extend( $.validator, {
 		},
 
 		findByName: function( name ) {
-			return $( this.currentForm ).find( "[name='" + name + "']" );
+			return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
 		},
 
 		getLength: function( value, element ) {
@@ -853,7 +1064,7 @@ $.extend( $.validator, {
 		},
 
 		depend: function( param, element ) {
-			return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
+			return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
 		},
 
 		dependTypes: {
@@ -876,32 +1087,70 @@ $.extend( $.validator, {
 		startRequest: function( element ) {
 			if ( !this.pending[ element.name ] ) {
 				this.pendingRequest++;
+				$( element ).addClass( this.settings.pendingClass );
 				this.pending[ element.name ] = true;
 			}
 		},
 
 		stopRequest: function( element, valid ) {
 			this.pendingRequest--;
-			// sometimes synchronization fails, make sure pendingRequest is never < 0
+
+			// Sometimes synchronization fails, make sure pendingRequest is never < 0
 			if ( this.pendingRequest < 0 ) {
 				this.pendingRequest = 0;
 			}
 			delete this.pending[ element.name ];
+			$( element ).removeClass( this.settings.pendingClass );
 			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
 				$( this.currentForm ).submit();
+
+				// Remove the hidden input that was used as a replacement for the
+				// missing submit button. The hidden input is added by `handle()`
+				// to ensure that the value of the used submit button is passed on
+				// for scripted submits triggered by this method
+				if ( this.submitButton ) {
+					$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
+				}
+
 				this.formSubmitted = false;
-			} else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
-				$( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
+			} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
+				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
 				this.formSubmitted = false;
 			}
 		},
 
-		previousValue: function( element ) {
+		previousValue: function( element, method ) {
+			method = typeof method === "string" && method || "remote";
+
 			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
 				old: null,
 				valid: true,
-				message: this.defaultMessage( element, "remote" )
-			});
+				message: this.defaultMessage( element, { method: method } )
+			} );
+		},
+
+		// Cleans up all forms and elements, removes validator-specific events
+		destroy: function() {
+			this.resetForm();
+
+			$( this.currentForm )
+				.off( ".validate" )
+				.removeData( "validator" )
+				.find( ".validate-equalTo-blur" )
+					.off( ".validate-equalTo" )
+					.removeClass( "validate-equalTo-blur" )
+				.find( ".validate-lessThan-blur" )
+					.off( ".validate-lessThan" )
+					.removeClass( "validate-lessThan-blur" )
+				.find( ".validate-lessThanEqual-blur" )
+					.off( ".validate-lessThanEqual" )
+					.removeClass( "validate-lessThanEqual-blur" )
+				.find( ".validate-greaterThanEqual-blur" )
+					.off( ".validate-greaterThanEqual" )
+					.removeClass( "validate-greaterThanEqual-blur" )
+				.find( ".validate-greaterThan-blur" )
+					.off( ".validate-greaterThan" )
+					.removeClass( "validate-greaterThan-blur" );
 		}
 
 	},
@@ -932,13 +1181,36 @@ $.extend( $.validator, {
 		if ( classes ) {
 			$.each( classes.split( " " ), function() {
 				if ( this in $.validator.classRuleSettings ) {
-					$.extend( rules, $.validator.classRuleSettings[ this ]);
+					$.extend( rules, $.validator.classRuleSettings[ this ] );
 				}
-			});
+			} );
 		}
 		return rules;
 	},
 
+	normalizeAttributeRule: function( rules, type, method, value ) {
+
+		// Convert the value to a number for number inputs, and for text for backwards compability
+		// allows type="date" and others to be compared as strings
+		if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
+			value = Number( value );
+
+			// Support Opera Mini, which returns NaN for undefined minlength
+			if ( isNaN( value ) ) {
+				value = undefined;
+			}
+		}
+
+		if ( value || value === 0 ) {
+			rules[ method ] = value;
+		} else if ( type === method && type !== "range" ) {
+
+			// Exception: the jquery validate 'range' method
+			// does not test for the html5 'range' type
+			rules[ method ] = true;
+		}
+	},
+
 	attributeRules: function( element ) {
 		var rules = {},
 			$element = $( element ),
@@ -947,36 +1219,26 @@ $.extend( $.validator, {
 
 		for ( method in $.validator.methods ) {
 
-			// support for <input required> in both html5 and older browsers
+			// Support for <input required> in both html5 and older browsers
 			if ( method === "required" ) {
 				value = element.getAttribute( method );
+
 				// Some browsers return an empty string for the required attribute
 				// and non-HTML5 browsers might have required="" markup
 				if ( value === "" ) {
 					value = true;
 				}
-				// force non-HTML5 browsers to return bool
+
+				// Force non-HTML5 browsers to return bool
 				value = !!value;
 			} else {
 				value = $element.attr( method );
 			}
 
-			// convert the value to a number for number inputs, and for text for backwards compability
-			// allows type="date" and others to be compared as strings
-			if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
-				value = Number( value );
-			}
-
-			if ( value || value === 0 ) {
-				rules[ method ] = value;
-			} else if ( type === method && type !== "range" ) {
-				// exception: the jquery validate 'range' method
-				// does not test for the html5 'range' type
-				rules[ method ] = true;
-			}
+			this.normalizeAttributeRule( rules, type, method, value );
 		}
 
-		// maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
+		// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
 		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
 			delete rules.maxlength;
 		}
@@ -985,13 +1247,20 @@ $.extend( $.validator, {
 	},
 
 	dataRules: function( element ) {
-		var method, value,
-			rules = {}, $element = $( element );
+		var rules = {},
+			$element = $( element ),
+			type = element.getAttribute( "type" ),
+			method, value;
+
 		for ( method in $.validator.methods ) {
 			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
-			if ( value !== undefined ) {
-				rules[ method ] = value;
+
+			// Cast empty attributes like `data-rule-required` to `true`
+			if ( value === "" ) {
+				value = true;
 			}
+
+			this.normalizeAttributeRule( rules, type, method, value );
 		}
 		return rules;
 	},
@@ -1007,9 +1276,11 @@ $.extend( $.validator, {
 	},
 
 	normalizeRules: function( rules, element ) {
-		// handle dependency check
+
+		// Handle dependency check
 		$.each( rules, function( prop, val ) {
-			// ignore rule when param is explicitly false, eg. required:false
+
+			// Ignore rule when param is explicitly false, eg. required:false
 			if ( val === false ) {
 				delete rules[ prop ];
 				return;
@@ -1027,36 +1298,38 @@ $.extend( $.validator, {
 				if ( keepRule ) {
 					rules[ prop ] = val.param !== undefined ? val.param : true;
 				} else {
+					$.data( element.form, "validator" ).resetElements( $( element ) );
 					delete rules[ prop ];
 				}
 			}
-		});
+		} );
 
-		// evaluate parameters
+		// Evaluate parameters
 		$.each( rules, function( rule, parameter ) {
-			rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
-		});
+			rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter;
+		} );
 
-		// clean number parameters
-		$.each([ "minlength", "maxlength" ], function() {
+		// Clean number parameters
+		$.each( [ "minlength", "maxlength" ], function() {
 			if ( rules[ this ] ) {
 				rules[ this ] = Number( rules[ this ] );
 			}
-		});
-		$.each([ "rangelength", "range" ], function() {
+		} );
+		$.each( [ "rangelength", "range" ], function() {
 			var parts;
 			if ( rules[ this ] ) {
 				if ( $.isArray( rules[ this ] ) ) {
-					rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
+					rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
 				} else if ( typeof rules[ this ] === "string" ) {
-					parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
-					rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
+					parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
+					rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
 				}
 			}
-		});
+		} );
 
 		if ( $.validator.autoCreateRanges ) {
-			// auto-create ranges
+
+			// Auto-create ranges
 			if ( rules.min != null && rules.max != null ) {
 				rules.range = [ rules.min, rules.max ];
 				delete rules.min;
@@ -1078,13 +1351,13 @@ $.extend( $.validator, {
 			var transformed = {};
 			$.each( data.split( /\s/ ), function() {
 				transformed[ this ] = true;
-			});
+			} );
 			data = transformed;
 		}
 		return data;
 	},
 
-	// http://jqueryvalidation.org/jQuery.validator.addMethod/
+	// https://jqueryvalidation.org/jQuery.validator.addMethod/
 	addMethod: function( name, method, message ) {
 		$.validator.methods[ name ] = method;
 		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
@@ -1093,172 +1366,198 @@ $.extend( $.validator, {
 		}
 	},
 
+	// https://jqueryvalidation.org/jQuery.validator.methods/
 	methods: {
 
-		// http://jqueryvalidation.org/required-method/
+		// https://jqueryvalidation.org/required-method/
 		required: function( value, element, param ) {
-			// check if dependency is met
+
+			// Check if dependency is met
 			if ( !this.depend( param, element ) ) {
 				return "dependency-mismatch";
 			}
 			if ( element.nodeName.toLowerCase() === "select" ) {
-				// could be an array for select-multiple or a string, both are fine this way
+
+				// Could be an array for select-multiple or a string, both are fine this way
 				var val = $( element ).val();
 				return val && val.length > 0;
 			}
 			if ( this.checkable( element ) ) {
 				return this.getLength( value, element ) > 0;
 			}
-			return $.trim( value ).length > 0;
+			return value !== undefined && value !== null && value.length > 0;
 		},
 
-		// http://jqueryvalidation.org/email-method/
+		// https://jqueryvalidation.org/email-method/
 		email: function( value, element ) {
-			// From http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29
+
+			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
 			// Retrieved 2014-01-14
 			// If you have a problem with this implementation, report a bug against the above spec
 			// Or use custom methods to implement your own email validation
 			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/url-method/
+		// https://jqueryvalidation.org/url-method/
 		url: function( value, element ) {
-			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
-			return this.optional( element ) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
-		},
 
-		// http://jqueryvalidation.org/date-method/
-		date: function( value, element ) {
-			return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
+			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
+			// https://gist.github.com/dperini/729294
+			// see also https://mathiasbynens.be/demo/url-regex
+			// modified to allow protocol-relative URLs
+			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
 		},
 
-		// http://jqueryvalidation.org/dateISO-method/
+		// https://jqueryvalidation.org/date-method/
+		date: ( function() {
+			var called = false;
+
+			return function( value, element ) {
+				if ( !called ) {
+					called = true;
+					if ( this.settings.debug && window.console ) {
+						console.warn(
+							"The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
+							"Please don't use it, since it relies on the Date constructor, which\n" +
+							"behaves very differently across browsers and locales. Use `dateISO`\n" +
+							"instead or one of the locale specific methods in `localizations/`\n" +
+							"and `additional-methods.js`."
+						);
+					}
+				}
+
+				return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
+			};
+		}() ),
+
+		// https://jqueryvalidation.org/dateISO-method/
 		dateISO: function( value, element ) {
 			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/number-method/
+		// https://jqueryvalidation.org/number-method/
 		number: function( value, element ) {
-			return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
+			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/digits-method/
+		// https://jqueryvalidation.org/digits-method/
 		digits: function( value, element ) {
 			return this.optional( element ) || /^\d+$/.test( value );
 		},
 
-		// http://jqueryvalidation.org/creditcard-method/
-		// based on http://en.wikipedia.org/wiki/Luhn/
-		creditcard: function( value, element ) {
-			if ( this.optional( element ) ) {
-				return "dependency-mismatch";
-			}
-			// accept only spaces, digits and dashes
-			if ( /[^0-9 \-]+/.test( value ) ) {
-				return false;
-			}
-			var nCheck = 0,
-				nDigit = 0,
-				bEven = false,
-				n, cDigit;
-
-			value = value.replace( /\D/g, "" );
-
-			// Basing min and max length on
-			// http://developer.ean.com/general_info/Valid_Credit_Card_Types
-			if ( value.length < 13 || value.length > 19 ) {
-				return false;
-			}
-
-			for ( n = value.length - 1; n >= 0; n--) {
-				cDigit = value.charAt( n );
-				nDigit = parseInt( cDigit, 10 );
-				if ( bEven ) {
-					if ( ( nDigit *= 2 ) > 9 ) {
-						nDigit -= 9;
-					}
-				}
-				nCheck += nDigit;
-				bEven = !bEven;
-			}
-
-			return ( nCheck % 10 ) === 0;
-		},
-
-		// http://jqueryvalidation.org/minlength-method/
+		// https://jqueryvalidation.org/minlength-method/
 		minlength: function( value, element, param ) {
 			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
 			return this.optional( element ) || length >= param;
 		},
 
-		// http://jqueryvalidation.org/maxlength-method/
+		// https://jqueryvalidation.org/maxlength-method/
 		maxlength: function( value, element, param ) {
 			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
 			return this.optional( element ) || length <= param;
 		},
 
-		// http://jqueryvalidation.org/rangelength-method/
+		// https://jqueryvalidation.org/rangelength-method/
 		rangelength: function( value, element, param ) {
 			var length = $.isArray( value ) ? value.length : this.getLength( value, element );
 			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
 		},
 
-		// http://jqueryvalidation.org/min-method/
+		// https://jqueryvalidation.org/min-method/
 		min: function( value, element, param ) {
 			return this.optional( element ) || value >= param;
 		},
 
-		// http://jqueryvalidation.org/max-method/
+		// https://jqueryvalidation.org/max-method/
 		max: function( value, element, param ) {
 			return this.optional( element ) || value <= param;
 		},
 
-		// http://jqueryvalidation.org/range-method/
+		// https://jqueryvalidation.org/range-method/
 		range: function( value, element, param ) {
 			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
 		},
 
-		// http://jqueryvalidation.org/equalTo-method/
+		// https://jqueryvalidation.org/step-method/
+		step: function( value, element, param ) {
+			var type = $( element ).attr( "type" ),
+				errorMessage = "Step attribute on input type " + type + " is not supported.",
+				supportedTypes = [ "text", "number", "range" ],
+				re = new RegExp( "\\b" + type + "\\b" ),
+				notSupported = type && !re.test( supportedTypes.join() ),
+				decimalPlaces = function( num ) {
+					var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
+					if ( !match ) {
+						return 0;
+					}
+
+					// Number of digits right of decimal point.
+					return match[ 1 ] ? match[ 1 ].length : 0;
+				},
+				toInt = function( num ) {
+					return Math.round( num * Math.pow( 10, decimals ) );
+				},
+				valid = true,
+				decimals;
+
+			// Works only for text, number and range input types
+			// TODO find a way to support input types date, datetime, datetime-local, month, time and week
+			if ( notSupported ) {
+				throw new Error( errorMessage );
+			}
+
+			decimals = decimalPlaces( param );
+
+			// Value can't have too many decimals
+			if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
+				valid = false;
+			}
+
+			return this.optional( element ) || valid;
+		},
+
+		// https://jqueryvalidation.org/equalTo-method/
 		equalTo: function( value, element, param ) {
-			// bind to the blur event of the target in order to revalidate whenever the target field is updated
-			// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
+
+			// Bind to the blur event of the target in order to revalidate whenever the target field is updated
 			var target = $( param );
-			if ( this.settings.onfocusout ) {
-				target.unbind( ".validate-equalTo" ).bind( "blur.validate-equalTo", function() {
+			if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
+				target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
 					$( element ).valid();
-				});
+				} );
 			}
 			return value === target.val();
 		},
 
-		// http://jqueryvalidation.org/remote-method/
-		remote: function( value, element, param ) {
+		// https://jqueryvalidation.org/remote-method/
+		remote: function( value, element, param, method ) {
 			if ( this.optional( element ) ) {
 				return "dependency-mismatch";
 			}
 
-			var previous = this.previousValue( element ),
-				validator, data;
+			method = typeof method === "string" && method || "remote";
 
-			if (!this.settings.messages[ element.name ] ) {
+			var previous = this.previousValue( element, method ),
+				validator, data, optionDataString;
+
+			if ( !this.settings.messages[ element.name ] ) {
 				this.settings.messages[ element.name ] = {};
 			}
-			previous.originalMessage = this.settings.messages[ element.name ].remote;
-			this.settings.messages[ element.name ].remote = previous.message;
+			previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
+			this.settings.messages[ element.name ][ method ] = previous.message;
 
 			param = typeof param === "string" && { url: param } || param;
-
-			if ( previous.old === value ) {
+			optionDataString = $.param( $.extend( { data: value }, param.data ) );
+			if ( previous.old === optionDataString ) {
 				return previous.valid;
 			}
 
-			previous.old = value;
+			previous.old = optionDataString;
 			validator = this;
 			this.startRequest( element );
 			data = {};
 			data[ element.name ] = value;
 			$.ajax( $.extend( true, {
-				url: param,
 				mode: "abort",
 				port: "validate" + element.name,
 				dataType: "json",
@@ -1268,18 +1567,19 @@ $.extend( $.validator, {
 					var valid = response === true || response === "true",
 						errors, message, submitted;
 
-					validator.settings.messages[ element.name ].remote = previous.originalMessage;
+					validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
 					if ( valid ) {
 						submitted = validator.formSubmitted;
-						validator.prepareElement( element );
+						validator.resetInternals();
+						validator.toHide = validator.errorsFor( element );
 						validator.formSubmitted = submitted;
 						validator.successList.push( element );
-						delete validator.invalid[ element.name ];
+						validator.invalid[ element.name ] = false;
 						validator.showErrors();
 					} else {
 						errors = {};
-						message = response || validator.defaultMessage( element, "remote" );
-						errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
+						message = response || validator.defaultMessage( element, { method: method, parameters: value } );
+						errors[ element.name ] = previous.message = message;
 						validator.invalid[ element.name ] = true;
 						validator.showErrors( errors );
 					}
@@ -1289,11 +1589,6 @@ $.extend( $.validator, {
 			}, param ) );
 			return "pending";
 		}
-
 	}
 
-});
-
-$.format = function deprecated() {
-	throw "$.format has been deprecated. Please use $.validator.format instead.";
-};
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/delegate.js b/civicrm/bower_components/jquery-validation/src/delegate.js
deleted file mode 100644
index 07cf8503aa..0000000000
--- a/civicrm/bower_components/jquery-validation/src/delegate.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
-// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
-
-$.extend($.fn, {
-	validateDelegate: function( delegate, type, handler ) {
-		return this.bind(type, function( event ) {
-			var target = $(event.target);
-			if ( target.is(delegate) ) {
-				return handler.apply(target, arguments);
-			}
-		});
-	}
-});
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ar.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ar.js
index 819a8c8327..dad165e583 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ar.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ar.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: AR (Arabic; العربية)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "هذا الحقل إلزامي",
 	remote: "يرجى تصحيح هذا الحقل للمتابعة",
 	email: "رجاء إدخال عنوان بريد إلكتروني صحيح",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "رجاء إدخال رقم بطاقة ائتمان صحيح",
 	equalTo: "رجاء إدخال نفس القيمة",
 	extension: "رجاء إدخال ملف بامتداد موافق عليه",
-	maxlength: $.validator.format("الحد الأقصى لعدد الحروف هو {0}"),
-	minlength: $.validator.format("الحد الأدنى لعدد الحروف هو {0}"),
-	rangelength: $.validator.format("عدد الحروف يجب أن يكون بين {0} و {1}"),
-	range: $.validator.format("رجاء إدخال عدد قيمته بين {0} و {1}"),
-	max: $.validator.format("رجاء إدخال عدد أقل من أو يساوي (0}"),
-	min: $.validator.format("رجاء إدخال عدد أكبر من أو يساوي (0}")
-});
+	maxlength: $.validator.format( "الحد الأقصى لعدد الحروف هو {0}" ),
+	minlength: $.validator.format( "الحد الأدنى لعدد الحروف هو {0}" ),
+	rangelength: $.validator.format( "عدد الحروف يجب أن يكون بين {0} و {1}" ),
+	range: $.validator.format( "رجاء إدخال عدد قيمته بين {0} و {1}" ),
+	max: $.validator.format( "رجاء إدخال عدد أقل من أو يساوي {0}" ),
+	min: $.validator.format( "رجاء إدخال عدد أكبر من أو يساوي {0}" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_az.js b/civicrm/bower_components/jquery-validation/src/localization/messages_az.js
new file mode 100644
index 0000000000..61956a2d46
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_az.js
@@ -0,0 +1,23 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: Az (Azeri; azərbaycan dili)
+ */
+$.extend( $.validator.messages, {
+	required: "Bu xana mütləq doldurulmalıdır.",
+	remote: "Zəhmət olmasa, düzgün məna daxil edin.",
+	email: "Zəhmət olmasa, düzgün elektron poçt daxil edin.",
+	url: "Zəhmət olmasa, düzgün URL daxil edin.",
+	date: "Zəhmət olmasa, düzgün tarix daxil edin.",
+	dateISO: "Zəhmət olmasa, düzgün ISO formatlı tarix daxil edin.",
+	number: "Zəhmət olmasa, düzgün rəqəm daxil edin.",
+	digits: "Zəhmət olmasa, yalnız rəqəm daxil edin.",
+	creditcard: "Zəhmət olmasa, düzgün kredit kart nömrəsini daxil edin.",
+	equalTo: "Zəhmət olmasa, eyni mənanı bir daha daxil edin.",
+	extension: "Zəhmət olmasa, düzgün genişlənməyə malik faylı seçin.",
+	maxlength: $.validator.format( "Zəhmət olmasa, {0} simvoldan çox olmayaraq daxil edin." ),
+	minlength: $.validator.format( "Zəhmət olmasa, {0} simvoldan az olmayaraq daxil edin." ),
+	rangelength: $.validator.format( "Zəhmət olmasa, {0} - {1} aralığında uzunluğa malik simvol daxil edin." ),
+	range: $.validator.format( "Zəhmət olmasa, {0} - {1} aralığında rəqəm daxil edin." ),
+	max: $.validator.format( "Zəhmət olmasa, {0} və ondan kiçik rəqəm daxil edin." ),
+	min: $.validator.format( "Zəhmət olmasa, {0} və ondan böyük rəqəm daxil edin" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_bg.js b/civicrm/bower_components/jquery-validation/src/localization/messages_bg.js
index 5880e3cb31..f92c6f073c 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_bg.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_bg.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: BG (Bulgarian; български език)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Полето е задължително.",
 	remote: "Моля, въведете правилната стойност.",
 	email: "Моля, въведете валиден email.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Моля, въведете валиден номер на кредитна карта.",
 	equalTo: "Моля, въведете същата стойност отново.",
 	extension: "Моля, въведете стойност с валидно разширение.",
-	maxlength: $.validator.format("Моля, въведете повече от {0} символа."),
-	minlength: $.validator.format("Моля, въведете поне {0} символа."),
-	rangelength: $.validator.format("Моля, въведете стойност с дължина между {0} и {1} символа."),
-	range: $.validator.format("Моля, въведете стойност между {0} и {1}."),
-	max: $.validator.format("Моля, въведете стойност по-малка или равна на {0}."),
-	min: $.validator.format("Моля, въведете стойност по-голяма или равна на {0}.")
-});
+	maxlength: $.validator.format( "Моля, въведете не повече от {0} символа." ),
+	minlength: $.validator.format( "Моля, въведете поне {0} символа." ),
+	rangelength: $.validator.format( "Моля, въведете стойност с дължина между {0} и {1} символа." ),
+	range: $.validator.format( "Моля, въведете стойност между {0} и {1}." ),
+	max: $.validator.format( "Моля, въведете стойност по-малка или равна на {0}." ),
+	min: $.validator.format( "Моля, въведете стойност по-голяма или равна на {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_bn_BD.js b/civicrm/bower_components/jquery-validation/src/localization/messages_bn_BD.js
new file mode 100644
index 0000000000..2ec5b937e9
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_bn_BD.js
@@ -0,0 +1,23 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: bn_BD (Bengali, Bangladesh)
+ */
+$.extend( $.validator.messages, {
+	required: "এই তথ্যটি আবশ্যক।",
+	remote: "এই তথ্যটি ঠিক করুন।",
+	email: "অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",
+	url: "অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",
+	date: "তারিখ সঠিক নয়।",
+	dateISO: "অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",
+	number: "অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",
+	digits: "এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",
+	creditcard: "অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",
+	equalTo: "একই মান আবার লিখুন।",
+	extension: "সঠিক ধরনের ফাইল আপলোড করুন।",
+	maxlength: $.validator.format( "{0}টির বেশি অক্ষর লেখা যাবে না।" ),
+	minlength: $.validator.format( "{0}টির কম অক্ষর লেখা যাবে না।" ),
+	rangelength: $.validator.format( "{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।" ),
+	range: $.validator.format( "{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।" ),
+	max: $.validator.format( "অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।" ),
+	min: $.validator.format( "অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ca.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ca.js
index a8b13fc068..2d650bc86e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ca.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ca.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: CA (Catalan; català)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Aquest camp és obligatori.",
 	remote: "Si us plau, omple aquest camp.",
 	email: "Si us plau, escriu una adreça de correu-e vàlida",
@@ -12,12 +12,12 @@ $.extend($.validator.messages, {
 	number: "Si us plau, escriu un número enter vàlid.",
 	digits: "Si us plau, escriu només dígits.",
 	creditcard: "Si us plau, escriu un número de tarjeta vàlid.",
-	equalTo: "Si us plau, escriu el maateix valor de nou.",
+	equalTo: "Si us plau, escriu el mateix valor de nou.",
 	extension: "Si us plau, escriu un valor amb una extensió acceptada.",
-	maxlength: $.validator.format("Si us plau, no escriguis més de {0} caracters."),
-	minlength: $.validator.format("Si us plau, no escriguis menys de {0} caracters."),
-	rangelength: $.validator.format("Si us plau, escriu un valor entre {0} i {1} caracters."),
-	range: $.validator.format("Si us plau, escriu un valor entre {0} i {1}."),
-	max: $.validator.format("Si us plau, escriu un valor menor o igual a {0}."),
-	min: $.validator.format("Si us plau, escriu un valor major o igual a {0}.")
-});
+	maxlength: $.validator.format( "Si us plau, no escriguis més de {0} caracters." ),
+	minlength: $.validator.format( "Si us plau, no escriguis menys de {0} caracters." ),
+	rangelength: $.validator.format( "Si us plau, escriu un valor entre {0} i {1} caracters." ),
+	range: $.validator.format( "Si us plau, escriu un valor entre {0} i {1}." ),
+	max: $.validator.format( "Si us plau, escriu un valor menor o igual a {0}." ),
+	min: $.validator.format( "Si us plau, escriu un valor major o igual a {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_cs.js b/civicrm/bower_components/jquery-validation/src/localization/messages_cs.js
index 2f2f8d89c4..434fdb7524 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_cs.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_cs.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: CS (Czech; čeština, český jazyk)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Tento údaj je povinný.",
 	remote: "Prosím, opravte tento údaj.",
 	email: "Prosím, zadejte platný e-mail.",
@@ -14,10 +14,11 @@ $.extend($.validator.messages, {
 	creditcard: "Prosím, zadejte číslo kreditní karty.",
 	equalTo: "Prosím, zadejte znovu stejnou hodnotu.",
 	extension: "Prosím, zadejte soubor se správnou příponou.",
-	maxlength: $.validator.format("Prosím, zadejte nejvíce {0} znaků."),
-	minlength: $.validator.format("Prosím, zadejte nejméně {0} znaků."),
-	rangelength: $.validator.format("Prosím, zadejte od {0} do {1} znaků."),
-	range: $.validator.format("Prosím, zadejte hodnotu od {0} do {1}."),
-	max: $.validator.format("Prosím, zadejte hodnotu menší nebo rovnu {0}."),
-	min: $.validator.format("Prosím, zadejte hodnotu větší nebo rovnu {0}.")
-});
+	maxlength: $.validator.format( "Prosím, zadejte nejvíce {0} znaků." ),
+	minlength: $.validator.format( "Prosím, zadejte nejméně {0} znaků." ),
+	rangelength: $.validator.format( "Prosím, zadejte od {0} do {1} znaků." ),
+	range: $.validator.format( "Prosím, zadejte hodnotu od {0} do {1}." ),
+	max: $.validator.format( "Prosím, zadejte hodnotu menší nebo rovnu {0}." ),
+	min: $.validator.format( "Prosím, zadejte hodnotu větší nebo rovnu {0}." ),
+	step: $.validator.format( "Musí být násobkem čísla {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_da.js b/civicrm/bower_components/jquery-validation/src/localization/messages_da.js
index f6a7dba0df..4c0efcc1b1 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_da.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_da.js
@@ -2,19 +2,33 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: DA (Danish; dansk)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Dette felt er påkrævet.",
-	maxlength: $.validator.format("Indtast højst {0} tegn."),
-	minlength: $.validator.format("Indtast mindst {0} tegn."),
-	rangelength: $.validator.format("Indtast mindst {0} og højst {1} tegn."),
+	remote: "Ret venligst dette felt",
 	email: "Indtast en gyldig email-adresse.",
 	url: "Indtast en gyldig URL.",
 	date: "Indtast en gyldig dato.",
 	number: "Indtast et tal.",
 	digits: "Indtast kun cifre.",
+	creditcard: "Indtast et gyldigt kreditkortnummer.",
 	equalTo: "Indtast den samme værdi igen.",
-	range: $.validator.format("Angiv en værdi mellem {0} og {1}."),
-	max: $.validator.format("Angiv en værdi der højst er {0}."),
-	min: $.validator.format("Angiv en værdi der mindst er {0}."),
-	creditcard: "Indtast et gyldigt kreditkortnummer."
-});
+	time: "Angiv en gyldig tid mellem kl. 00:00 og 23:59.",
+	ipv4: "Angiv venligst en gyldig IPv4-adresse.",
+	ipv6: "Angiv venligst en gyldig IPv6-adresse.",
+	require_from_group:  $.validator.format( "Angiv mindst {0} af disse felter." ),
+	extension: "Indtast venligst en værdi med en gyldig endelse",
+	pattern: "Ugyldigt format",
+	lettersonly: "Angiv venligst kun bogstaver.",
+	nowhitespace: "MÃ¥ ikke indholde mellemrum",
+	maxlength: $.validator.format( "Indtast højst {0} tegn." ),
+	minlength: $.validator.format( "Indtast mindst {0} tegn." ),
+	rangelength: $.validator.format( "Indtast mindst {0} og højst {1} tegn." ),
+	range: $.validator.format( "Angiv en værdi mellem {0} og {1}." ),
+	max: $.validator.format( "Angiv en værdi der højst er {0}." ),
+	min: $.validator.format( "Angiv en værdi der mindst er {0}." ),
+	minWords: $.validator.format( "Indtast venligst mindst {0} ord" ),
+	maxWords:  $.validator.format( "Indtast venligst højst {0} ord" ),
+	step: $.validator.format( "Angiv en værdi gange {0}." ),
+	notEqualTo: "Angiv en anden værdi, værdierne må ikke være det samme.",
+	integer: "Angiv et ikke-decimaltal, der er positivt eller negativt."
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_de.js b/civicrm/bower_components/jquery-validation/src/localization/messages_de.js
index f9344331c1..bf68e6667e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_de.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_de.js
@@ -2,19 +2,69 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: DE (German, Deutsch)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Dieses Feld ist ein Pflichtfeld.",
-	maxlength: $.validator.format("Geben Sie bitte maximal {0} Zeichen ein."),
-	minlength: $.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),
-	rangelength: $.validator.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),
-	email: "Geben Sie bitte eine gültige E-Mail Adresse ein.",
+	maxlength: $.validator.format( "Geben Sie bitte maximal {0} Zeichen ein." ),
+	minlength: $.validator.format( "Geben Sie bitte mindestens {0} Zeichen ein." ),
+	rangelength: $.validator.format( "Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein." ),
+	email: "Geben Sie bitte eine gültige E-Mail-Adresse ein.",
 	url: "Geben Sie bitte eine gültige URL ein.",
-	date: "Bitte geben Sie ein gültiges Datum ein.",
+	date: "Geben Sie bitte ein gültiges Datum ein.",
 	number: "Geben Sie bitte eine Nummer ein.",
 	digits: "Geben Sie bitte nur Ziffern ein.",
-	equalTo: "Bitte denselben Wert wiederholen.",
-	range: $.validator.format("Geben Sie bitte einen Wert zwischen {0} und {1} ein."),
-	max: $.validator.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),
-	min: $.validator.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),
-	creditcard: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein."
-});
+	equalTo: "Wiederholen Sie bitte denselben Wert.",
+	range: $.validator.format( "Geben Sie bitte einen Wert zwischen {0} und {1} ein." ),
+	max: $.validator.format( "Geben Sie bitte einen Wert kleiner oder gleich {0} ein." ),
+	min: $.validator.format( "Geben Sie bitte einen Wert größer oder gleich {0} ein." ),
+	creditcard: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein.",
+	remote: "Korrigieren Sie bitte dieses Feld.",
+	dateISO: "Geben Sie bitte ein gültiges Datum ein (ISO-Format).",
+	step: $.validator.format( "Geben Sie bitte ein Vielfaches von {0} ein." ),
+	maxWords: $.validator.format( "Geben Sie bitte {0} Wörter oder weniger ein." ),
+	minWords: $.validator.format( "Geben Sie bitte mindestens {0} Wörter ein." ),
+	rangeWords: $.validator.format( "Geben Sie bitte zwischen {0} und {1} Wörtern ein." ),
+	accept: "Geben Sie bitte einen Wert mit einem gültigen MIME-Typ ein.",
+	alphanumeric: "Geben Sie bitte nur Buchstaben (keine Umlaute), Zahlen oder Unterstriche ein.",
+	bankaccountNL: "Geben Sie bitte eine gültige Kontonummer ein.",
+	bankorgiroaccountNL: "Geben Sie bitte eine gültige Bank- oder Girokontonummer ein.",
+	bic: "Geben Sie bitte einen gültigen BIC-Code ein.",
+	cifES: "Geben Sie bitte eine gültige CIF-Nummer ein.",
+	cpfBR: "Geben Sie bitte eine gültige CPF-Nummer ein.",
+	creditcardtypes: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein.",
+	currency: "Geben Sie bitte eine gültige Währung ein.",
+	extension: "Geben Sie bitte einen Wert mit einer gültigen Erweiterung ein.",
+	giroaccountNL: "Geben Sie bitte eine gültige Girokontonummer ein.",
+	iban: "Geben Sie bitte eine gültige IBAN ein.",
+	integer:  "Geben Sie bitte eine positive oder negative Nicht-Dezimalzahl ein.",
+	ipv4: "Geben Sie bitte eine gültige IPv4-Adresse ein.",
+	ipv6: "Geben Sie bitte eine gültige IPv6-Adresse ein.",
+	lettersonly: "Geben Sie bitte nur Buchstaben ein.",
+	letterswithbasicpunc: "Geben Sie bitte nur Buchstaben oder Interpunktion ein.",
+	mobileNL: "Geben Sie bitte eine gültige Handynummer ein.",
+	mobileUK: "Geben Sie bitte eine gültige Handynummer ein.",
+	netmask:  "Geben Sie bitte eine gültige Netzmaske ein.",
+	nieES: "Geben Sie bitte eine gültige NIE-Nummer ein.",
+	nifES: "Geben Sie bitte eine gültige NIF-Nummer ein.",
+	nipPL: "Geben Sie bitte eine gültige NIP-Nummer ein.",
+	notEqualTo: "Geben Sie bitte einen anderen Wert ein. Die Werte dürfen nicht gleich sein.",
+	nowhitespace: "Kein Leerzeichen bitte.",
+	pattern: "Ungültiges Format.",
+	phoneNL: "Geben Sie bitte eine gültige Telefonnummer ein.",
+	phonesUK: "Geben Sie bitte eine gültige britische Telefonnummer ein.",
+	phoneUK: "Geben Sie bitte eine gültige Telefonnummer ein.",
+	phoneUS: "Geben Sie bitte eine gültige Telefonnummer ein.",
+	postalcodeBR: "Geben Sie bitte eine gültige brasilianische Postleitzahl ein.",
+	postalCodeCA: "Geben Sie bitte eine gültige kanadische Postleitzahl ein.",
+	postalcodeIT: "Geben Sie bitte eine gültige italienische Postleitzahl ein.",
+	postalcodeNL: "Geben Sie bitte eine gültige niederländische Postleitzahl ein.",
+	postcodeUK: "Geben Sie bitte eine gültige britische Postleitzahl ein.",
+	require_from_group: $.validator.format( "Füllen Sie bitte mindestens {0} dieser Felder aus." ),
+	skip_or_fill_minimum: $.validator.format( "Überspringen Sie bitte diese Felder oder füllen Sie mindestens {0} von ihnen aus." ),
+	stateUS: "Geben Sie bitte einen gültigen US-Bundesstaat ein.",
+	strippedminlength: $.validator.format( "Geben Sie bitte mindestens {0} Zeichen ein." ),
+	time: "Geben Sie bitte eine gültige Uhrzeit zwischen 00:00 und 23:59 ein.",
+	time12h: "Geben Sie bitte eine gültige Uhrzeit im 12-Stunden-Format ein.",
+	vinUS: "Die angegebene Fahrzeugidentifikationsnummer (VIN) ist ungültig.",
+	zipcodeUS: "Die angegebene US-Postleitzahl ist ungültig.",
+	ziprange: "Ihre Postleitzahl muss im Bereich 902xx-xxxx bis 905xx-xxxx liegen."
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_el.js b/civicrm/bower_components/jquery-validation/src/localization/messages_el.js
index ddf9ac782a..784f9106f1 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_el.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_el.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: EL (Greek; ελληνικά)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Αυτό το πεδίο είναι υποχρεωτικό.",
 	remote: "Παρακαλώ διορθώστε αυτό το πεδίο.",
 	email: "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",
 	equalTo: "Παρακαλώ εισάγετε την ίδια τιμή ξανά.",
 	extension: "Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",
-	maxlength: $.validator.format("Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες."),
-	minlength: $.validator.format("Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες."),
-	rangelength: $.validator.format("Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων."),
-	range: $.validator.format("Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}."),
-	max: $.validator.format("Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}."),
-	min: $.validator.format("Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}.")
-});
+	maxlength: $.validator.format( "Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες." ),
+	minlength: $.validator.format( "Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες." ),
+	rangelength: $.validator.format( "Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων." ),
+	range: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}." ),
+	max: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}." ),
+	min: $.validator.format( "Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_es.js b/civicrm/bower_components/jquery-validation/src/localization/messages_es.js
index 85a8d459df..06462c5a7b 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_es.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_es.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: ES (Spanish; Español)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Este campo es obligatorio.",
 	remote: "Por favor, rellena este campo.",
 	email: "Por favor, escribe una dirección de correo válida.",
@@ -14,13 +14,13 @@ $.extend($.validator.messages, {
 	creditcard: "Por favor, escribe un número de tarjeta válido.",
 	equalTo: "Por favor, escribe el mismo valor de nuevo.",
 	extension: "Por favor, escribe un valor con una extensión aceptada.",
-	maxlength: $.validator.format("Por favor, no escribas más de {0} caracteres."),
-	minlength: $.validator.format("Por favor, no escribas menos de {0} caracteres."),
-	rangelength: $.validator.format("Por favor, escribe un valor entre {0} y {1} caracteres."),
-	range: $.validator.format("Por favor, escribe un valor entre {0} y {1}."),
-	max: $.validator.format("Por favor, escribe un valor menor o igual a {0}."),
-	min: $.validator.format("Por favor, escribe un valor mayor o igual a {0}."),
+	maxlength: $.validator.format( "Por favor, no escribas más de {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, no escribas menos de {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, escribe un valor entre {0} y {1} caracteres." ),
+	range: $.validator.format( "Por favor, escribe un valor entre {0} y {1}." ),
+	max: $.validator.format( "Por favor, escribe un valor menor o igual a {0}." ),
+	min: $.validator.format( "Por favor, escribe un valor mayor o igual a {0}." ),
 	nifES: "Por favor, escribe un NIF válido.",
 	nieES: "Por favor, escribe un NIE válido.",
 	cifES: "Por favor, escribe un CIF válido."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_es_AR.js b/civicrm/bower_components/jquery-validation/src/localization/messages_es_AR.js
index 47b83a2763..5504876ad8 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_es_AR.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_es_AR.js
@@ -3,7 +3,7 @@
  * Locale: ES (Spanish; Español)
  * Region: AR (Argentina)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Este campo es obligatorio.",
 	remote: "Por favor, completá este campo.",
 	email: "Por favor, escribí una dirección de correo válida.",
@@ -15,13 +15,13 @@ $.extend($.validator.messages, {
 	creditcard: "Por favor, escribí un número de tarjeta válido.",
 	equalTo: "Por favor, escribí el mismo valor de nuevo.",
 	extension: "Por favor, escribí un valor con una extensión aceptada.",
-	maxlength: $.validator.format("Por favor, no escribas más de {0} caracteres."),
-	minlength: $.validator.format("Por favor, no escribas menos de {0} caracteres."),
-	rangelength: $.validator.format("Por favor, escribí un valor entre {0} y {1} caracteres."),
-	range: $.validator.format("Por favor, escribí un valor entre {0} y {1}."),
-	max: $.validator.format("Por favor, escribí un valor menor o igual a {0}."),
-	min: $.validator.format("Por favor, escribí un valor mayor o igual a {0}."),
+	maxlength: $.validator.format( "Por favor, no escribas más de {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, no escribas menos de {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, escribí un valor entre {0} y {1} caracteres." ),
+	range: $.validator.format( "Por favor, escribí un valor entre {0} y {1}." ),
+	max: $.validator.format( "Por favor, escribí un valor menor o igual a {0}." ),
+	min: $.validator.format( "Por favor, escribí un valor mayor o igual a {0}." ),
 	nifES: "Por favor, escribí un NIF válido.",
 	nieES: "Por favor, escribí un NIE válido.",
 	cifES: "Por favor, escribí un CIF válido."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_es_PE.js b/civicrm/bower_components/jquery-validation/src/localization/messages_es_PE.js
new file mode 100644
index 0000000000..261e2bfc15
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_es_PE.js
@@ -0,0 +1,27 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: ES (Spanish; Español)
+ * Region: PE (Perú)
+ */
+$.extend( $.validator.messages, {
+	required: "Este campo es obligatorio.",
+	remote: "Por favor, llene este campo.",
+	email: "Por favor, escriba un correo electrónico válido.",
+	url: "Por favor, escriba una URL válida.",
+	date: "Por favor, escriba una fecha válida.",
+	dateISO: "Por favor, escriba una fecha (ISO) válida.",
+	number: "Por favor, escriba un número válido.",
+	digits: "Por favor, escriba sólo dígitos.",
+	creditcard: "Por favor, escriba un número de tarjeta válido.",
+	equalTo: "Por favor, escriba el mismo valor de nuevo.",
+	extension: "Por favor, escriba un valor con una extensión permitida.",
+	maxlength: $.validator.format( "Por favor, no escriba más de {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, no escriba menos de {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, escriba un valor entre {0} y {1} caracteres." ),
+	range: $.validator.format( "Por favor, escriba un valor entre {0} y {1}." ),
+	max: $.validator.format( "Por favor, escriba un valor menor o igual a {0}." ),
+	min: $.validator.format( "Por favor, escriba un valor mayor o igual a {0}." ),
+	nifES: "Por favor, escriba un NIF válido.",
+	nieES: "Por favor, escriba un NIE válido.",
+	cifES: "Por favor, escriba un CIF válido."
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_et.js b/civicrm/bower_components/jquery-validation/src/localization/messages_et.js
index bbc24aa972..ed1e78049e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_et.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_et.js
@@ -2,11 +2,11 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: ET (Estonian; eesti, eesti keel)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "See väli peab olema täidetud.",
-	maxlength: $.validator.format("Palun sisestage vähem kui {0} tähemärki."),
-	minlength: $.validator.format("Palun sisestage vähemalt {0} tähemärki."),
-	rangelength: $.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki."),
+	maxlength: $.validator.format( "Palun sisestage vähem kui {0} tähemärki." ),
+	minlength: $.validator.format( "Palun sisestage vähemalt {0} tähemärki." ),
+	rangelength: $.validator.format( "Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki." ),
 	email: "Palun sisestage korrektne e-maili aadress.",
 	url: "Palun sisestage korrektne URL.",
 	date: "Palun sisestage korrektne kuupäev.",
@@ -14,8 +14,8 @@ $.extend($.validator.messages, {
 	number: "Palun sisestage korrektne number.",
 	digits: "Palun sisestage ainult numbreid.",
 	equalTo: "Palun sisestage sama väärtus uuesti.",
-	range: $.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1}."),
-	max: $.validator.format("Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}."),
-	min: $.validator.format("Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}."),
+	range: $.validator.format( "Palun sisestage väärtus vahemikus {0} kuni {1}." ),
+	max: $.validator.format( "Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}." ),
+	min: $.validator.format( "Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}." ),
 	creditcard: "Palun sisestage korrektne krediitkaardi number."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_eu.js b/civicrm/bower_components/jquery-validation/src/localization/messages_eu.js
index 1b07a65d29..05ab5c6e82 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_eu.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_eu.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: EU (Basque; euskara, euskera)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Eremu hau beharrezkoa da.",
 	remote: "Mesedez, bete eremu hau.",
 	email: "Mesedez, idatzi baliozko posta helbide bat.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Mesedez, idatzi baliozko txartel zenbaki bat.",
 	equalTo: "Mesedez, idatzi berdina berriro ere.",
 	extension: "Mesedez, idatzi onartutako luzapena duen balio bat.",
-	maxlength: $.validator.format("Mesedez, ez idatzi {0} karaktere baino gehiago."),
-	minlength: $.validator.format("Mesedez, ez idatzi {0} karaktere baino gutxiago."),
-	rangelength: $.validator.format("Mesedez, idatzi {0} eta {1} karaktere arteko balio bat."),
-	range: $.validator.format("Mesedez, idatzi {0} eta {1} arteko balio bat."),
-	max: $.validator.format("Mesedez, idatzi {0} edo txikiagoa den balio bat."),
-	min: $.validator.format("Mesedez, idatzi {0} edo handiagoa den balio bat.")
-});
+	maxlength: $.validator.format( "Mesedez, ez idatzi {0} karaktere baino gehiago." ),
+	minlength: $.validator.format( "Mesedez, ez idatzi {0} karaktere baino gutxiago." ),
+	rangelength: $.validator.format( "Mesedez, idatzi {0} eta {1} karaktere arteko balio bat." ),
+	range: $.validator.format( "Mesedez, idatzi {0} eta {1} arteko balio bat." ),
+	max: $.validator.format( "Mesedez, idatzi {0} edo txikiagoa den balio bat." ),
+	min: $.validator.format( "Mesedez, idatzi {0} edo handiagoa den balio bat." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_fa.js b/civicrm/bower_components/jquery-validation/src/localization/messages_fa.js
index 78204b3f94..234687bd72 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_fa.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_fa.js
@@ -2,25 +2,26 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: FA (Persian; فارسی)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "تکمیل این فیلد اجباری است.",
 	remote: "لطفا این فیلد را تصحیح کنید.",
-	email: ".لطفا یک ایمیل صحیح وارد کنید",
+	email: "لطفا یک ایمیل صحیح وارد کنید.",
 	url: "لطفا آدرس صحیح وارد کنید.",
-	date: "لطفا یک تاریخ صحیح وارد کنید",
-	dateFA: "لطفا یک تاریخ صحیح وارد کنید",
+	date: "لطفا تاریخ صحیح وارد کنید.",
+	dateFA: "لطفا یک تاریخ صحیح وارد کنید.",
 	dateISO: "لطفا تاریخ صحیح وارد کنید (ISO).",
 	number: "لطفا عدد صحیح وارد کنید.",
-	digits: "لطفا تنها رقم وارد کنید",
+	digits: "لطفا تنها رقم وارد کنید.",
 	creditcard: "لطفا کریدیت کارت صحیح وارد کنید.",
-	equalTo: "لطفا مقدار برابری وارد کنید",
-	extension: "لطفا مقداری وارد کنید که ",
-	maxlength: $.validator.format("لطفا بیشتر از {0} حرف وارد نکنید."),
-	minlength: $.validator.format("لطفا کمتر از {0} حرف وارد نکنید."),
-	rangelength: $.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),
-	range: $.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),
-	max: $.validator.format("لطفا مقداری کمتر از {0} حرف وارد کنید."),
-	min: $.validator.format("لطفا مقداری بیشتر از {0} حرف وارد کنید."),
-	minWords: $.validator.format("لطفا حداقل {0} کلمه وارد کنید."),
-	maxWords: $.validator.format("لطفا حداکثر {0} کلمه وارد کنید.")
-});
+	equalTo: "لطفا مقدار برابری وارد کنید.",
+	extension: "لطفا مقداری وارد کنید که",
+	alphanumeric: "لطفا مقدار را عدد (انگلیسی) وارد کنید.",
+	maxlength: $.validator.format( "لطفا بیشتر از {0} حرف وارد نکنید." ),
+	minlength: $.validator.format( "لطفا کمتر از {0} حرف وارد نکنید." ),
+	rangelength: $.validator.format( "لطفا مقداری بین {0} تا {1} حرف وارد کنید." ),
+	range: $.validator.format( "لطفا مقداری بین {0} تا {1} حرف وارد کنید." ),
+	max: $.validator.format( "لطفا مقداری کمتر از {0} وارد کنید." ),
+	min: $.validator.format( "لطفا مقداری بیشتر از {0} وارد کنید." ),
+	minWords: $.validator.format( "لطفا حداقل {0} کلمه وارد کنید." ),
+	maxWords: $.validator.format( "لطفا حداکثر {0} کلمه وارد کنید." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_fi.js b/civicrm/bower_components/jquery-validation/src/localization/messages_fi.js
index 18d4df8d66..8b9759cdac 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_fi.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_fi.js
@@ -2,20 +2,20 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: FI (Finnish; suomi, suomen kieli)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "T&auml;m&auml; kentt&auml; on pakollinen.",
 	email: "Sy&ouml;t&auml; oikea s&auml;hk&ouml;postiosoite.",
-	url: "Sy&ouml;t&auml; oikea URL osoite.",
-	date: "Sy&ouml;t&auml; oike p&auml;iv&auml;m&auml;&auml;r&auml;.",
-	dateISO: "Sy&ouml;t&auml; oike p&auml;iv&auml;m&auml;&auml;r&auml; (VVVV-MM-DD).",
-	number: "Sy&ouml;t&auml; numero.",
+	url: "Sy&ouml;t&auml; oikea URL-osoite.",
+	date: "Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml;.",
+	dateISO: "Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; muodossa VVVV-KK-PP.",
+	number: "Sy&ouml;t&auml; luku.",
 	creditcard: "Sy&ouml;t&auml; voimassa oleva luottokorttinumero.",
 	digits: "Sy&ouml;t&auml; pelk&auml;st&auml;&auml;n numeroita.",
 	equalTo: "Sy&ouml;t&auml; sama arvo uudestaan.",
-	maxlength: $.validator.format("Voit sy&ouml;tt&auml;&auml; enint&auml;&auml;n {0} merkki&auml;."),
-	minlength: $.validator.format("V&auml;hint&auml;&auml;n {0} merkki&auml;."),
-	rangelength: $.validator.format("Sy&ouml;t&auml; v&auml;hint&auml;&auml;n {0} ja enint&auml;&auml;n {1} merkki&auml;."),
-	range: $.validator.format("Sy&ouml;t&auml; arvo {0} ja {1} v&auml;lilt&auml;."),
-	max: $.validator.format("Sy&ouml;t&auml; arvo joka on pienempi tai yht&auml; suuri kuin {0}."),
-	min: $.validator.format("Sy&ouml;t&auml; arvo joka on yht&auml; suuri tai suurempi kuin {0}.")
-});
+	maxlength: $.validator.format( "Voit sy&ouml;tt&auml;&auml; enint&auml;&auml;n {0} merkki&auml;." ),
+	minlength: $.validator.format( "V&auml;hint&auml;&auml;n {0} merkki&auml;." ),
+	rangelength: $.validator.format( "Sy&ouml;t&auml; v&auml;hint&auml;&auml;n {0} ja enint&auml;&auml;n {1} merkki&auml;." ),
+	range: $.validator.format( "Sy&ouml;t&auml; arvo v&auml;lilt&auml; {0}&ndash;{1}." ),
+	max: $.validator.format( "Sy&ouml;t&auml; arvo, joka on enint&auml;&auml;n {0}." ),
+	min: $.validator.format( "Sy&ouml;t&auml; arvo, joka on v&auml;hint&auml;&auml;n {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_fr.js b/civicrm/bower_components/jquery-validation/src/localization/messages_fr.js
index e82ccea3d9..0f804632ae 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_fr.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_fr.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: FR (French; français)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Ce champ est obligatoire.",
 	remote: "Veuillez corriger ce champ.",
 	email: "Veuillez fournir une adresse électronique valide.",
@@ -13,16 +13,18 @@ $.extend($.validator.messages, {
 	digits: "Veuillez fournir seulement des chiffres.",
 	creditcard: "Veuillez fournir un numéro de carte de crédit valide.",
 	equalTo: "Veuillez fournir encore la même valeur.",
+	notEqualTo: "Veuillez fournir une valeur différente, les valeurs ne doivent pas être identiques.",
 	extension: "Veuillez fournir une valeur avec une extension valide.",
-	maxlength: $.validator.format("Veuillez fournir au plus {0} caractères."),
-	minlength: $.validator.format("Veuillez fournir au moins {0} caractères."),
-	rangelength: $.validator.format("Veuillez fournir une valeur qui contient entre {0} et {1} caractères."),
-	range: $.validator.format("Veuillez fournir une valeur entre {0} et {1}."),
-	max: $.validator.format("Veuillez fournir une valeur inférieure ou égale à {0}."),
-	min: $.validator.format("Veuillez fournir une valeur supérieure ou égale à {0}."),
-	maxWords: $.validator.format("Veuillez fournir au plus {0} mots."),
-	minWords: $.validator.format("Veuillez fournir au moins {0} mots."),
-	rangeWords: $.validator.format("Veuillez fournir entre {0} et {1} mots."),
+	maxlength: $.validator.format( "Veuillez fournir au plus {0} caractères." ),
+	minlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
+	rangelength: $.validator.format( "Veuillez fournir une valeur qui contient entre {0} et {1} caractères." ),
+	range: $.validator.format( "Veuillez fournir une valeur entre {0} et {1}." ),
+	max: $.validator.format( "Veuillez fournir une valeur inférieure ou égale à {0}." ),
+	min: $.validator.format( "Veuillez fournir une valeur supérieure ou égale à {0}." ),
+	step: $.validator.format( "Veuillez fournir une valeur multiple de {0}." ),
+	maxWords: $.validator.format( "Veuillez fournir au plus {0} mots." ),
+	minWords: $.validator.format( "Veuillez fournir au moins {0} mots." ),
+	rangeWords: $.validator.format( "Veuillez fournir entre {0} et {1} mots." ),
 	letterswithbasicpunc: "Veuillez fournir seulement des lettres et des signes de ponctuation.",
 	alphanumeric: "Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",
 	lettersonly: "Veuillez fournir seulement des lettres.",
@@ -35,15 +37,15 @@ $.extend($.validator.messages, {
 	phoneUS: "Veuillez fournir un numéro de téléphone valide.",
 	phoneUK: "Veuillez fournir un numéro de téléphone valide.",
 	mobileUK: "Veuillez fournir un numéro de téléphone mobile valide.",
-	strippedminlength: $.validator.format("Veuillez fournir au moins {0} caractères."),
+	strippedminlength: $.validator.format( "Veuillez fournir au moins {0} caractères." ),
 	email2: "Veuillez fournir une adresse électronique valide.",
 	url2: "Veuillez fournir une adresse URL valide.",
 	creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.",
 	ipv4: "Veuillez fournir une adresse IP v4 valide.",
 	ipv6: "Veuillez fournir une adresse IP v6 valide.",
-	require_from_group: "Veuillez fournir au moins {0} de ces champs.",
+	require_from_group: $.validator.format( "Veuillez fournir au moins {0} de ces champs." ),
 	nifES: "Veuillez fournir un numéro NIF valide.",
 	nieES: "Veuillez fournir un numéro NIE valide.",
 	cifES: "Veuillez fournir un numéro CIF valide.",
 	postalCodeCA: "Veuillez fournir un code postal valide."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ge.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ge.js
new file mode 100644
index 0000000000..95c40d4fa4
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ge.js
@@ -0,0 +1,23 @@
+/**
+ * @author  @tatocaster <kutaliatato@gmail.com>
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: GE (Georgian; ქართული)
+ */
+$.extend( $.validator.messages, {
+	required: "ეს ველი სავალდებულოა",
+	remote: "გთხოვთ შეასწოროთ.",
+	email: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
+	url: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
+	date: "გთხოვთ შეიყვანოთ სწორი თარიღი.",
+	dateISO: "გთხოვთ შეიყვანოთ სწორი ფორმატით (ISO).",
+	number: "გთხოვთ შეიყვანოთ რიცხვი.",
+	digits: "დაშვებულია მხოლოდ ციფრები.",
+	creditcard: "გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",
+	equalTo: "გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",
+	maxlength: $.validator.format( "გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი." ),
+	minlength: $.validator.format( "შეიყვანეთ მინიმუმ {0} სიმბოლო." ),
+	rangelength: $.validator.format( "გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები." ),
+	range: $.validator.format( "შეიყვანეთ {0} -სა {1} -ს შორის." ),
+	max: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს." ),
+	min: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_gl.js b/civicrm/bower_components/jquery-validation/src/localization/messages_gl.js
index 76fadb2e00..cf7e3b0c8f 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_gl.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_gl.js
@@ -2,8 +2,8 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: GL (Galician; Galego)
  */
-(function($) {
-	$.extend($.validator.messages, {
+( function( $ ) {
+	$.extend( $.validator.messages, {
 		required: "Este campo é obrigatorio.",
 		remote: "Por favor, cubre este campo.",
 		email: "Por favor, escribe unha dirección de correo válida.",
@@ -15,14 +15,14 @@
 		creditcard: "Por favor, escribe un número de tarxeta válido.",
 		equalTo: "Por favor, escribe o mesmo valor de novo.",
 		extension: "Por favor, escribe un valor cunha extensión aceptada.",
-		maxlength: $.validator.format("Por favor, non escribas máis de {0} caracteres."),
-		minlength: $.validator.format("Por favor, non escribas menos de {0} caracteres."),
-		rangelength: $.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),
-		range: $.validator.format("Por favor, escribe un valor entre {0} e {1}."),
-		max: $.validator.format("Por favor, escribe un valor menor ou igual a {0}."),
-		min: $.validator.format("Por favor, escribe un valor maior ou igual a {0}."),
+		maxlength: $.validator.format( "Por favor, non escribas máis de {0} caracteres." ),
+		minlength: $.validator.format( "Por favor, non escribas menos de {0} caracteres." ),
+		rangelength: $.validator.format( "Por favor, escribe un valor entre {0} e {1} caracteres." ),
+		range: $.validator.format( "Por favor, escribe un valor entre {0} e {1}." ),
+		max: $.validator.format( "Por favor, escribe un valor menor ou igual a {0}." ),
+		min: $.validator.format( "Por favor, escribe un valor maior ou igual a {0}." ),
 		nifES: "Por favor, escribe un NIF válido.",
 		nieES: "Por favor, escribe un NIE válido.",
 		cifES: "Por favor, escribe un CIF válido."
-	});
-}(jQuery));
+	} );
+}( jQuery ) );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_he.js b/civicrm/bower_components/jquery-validation/src/localization/messages_he.js
index f54cd2eec7..6abd2fa837 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_he.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_he.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: HE (Hebrew; עברית)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "השדה הזה הינו שדה חובה",
 	remote: "נא לתקן שדה זה",
 	email: "נא למלא כתובת דוא\"ל חוקית",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "נא למלא מספר כרטיס אשראי חוקי",
 	equalTo: "נא למלא את אותו ערך שוב",
 	extension: "נא למלא ערך עם סיומת חוקית",
-	maxlength: $.validator.format(".נא לא למלא יותר מ- {0} תווים"),
-	minlength: $.validator.format("נא למלא לפחות {0} תווים"),
-	rangelength: $.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),
-	range: $.validator.format("נא למלא ערך בין {0} ל- {1}"),
-	max: $.validator.format("נא למלא ערך קטן או שווה ל- {0}"),
-	min: $.validator.format("נא למלא ערך גדול או שווה ל- {0}")
-});
+	maxlength: $.validator.format( ".נא לא למלא יותר מ- {0} תווים" ),
+	minlength: $.validator.format( "נא למלא לפחות {0} תווים" ),
+	rangelength: $.validator.format( "נא למלא ערך בין {0} ל- {1} תווים" ),
+	range: $.validator.format( "נא למלא ערך בין {0} ל- {1}" ),
+	max: $.validator.format( "נא למלא ערך קטן או שווה ל- {0}" ),
+	min: $.validator.format( "נא למלא ערך גדול או שווה ל- {0}" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_hr.js b/civicrm/bower_components/jquery-validation/src/localization/messages_hr.js
index 710dbb6dc2..d829550e49 100755
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_hr.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_hr.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: HR (Croatia; hrvatski jezik)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Ovo polje je obavezno.",
 	remote: "Ovo polje treba popraviti.",
 	email: "Unesite ispravnu e-mail adresu.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Unesite ispravan broj kreditne kartice.",
 	equalTo: "Unesite ponovo istu vrijednost.",
 	extension: "Unesite vrijednost sa ispravnom ekstenzijom.",
-	maxlength: $.validator.format("Maksimalni broj znakova je {0} ."),
-	minlength: $.validator.format("Minimalni broj znakova je {0} ."),
-	rangelength: $.validator.format("Unesite vrijednost između {0} i {1} znakova."),
-	range: $.validator.format("Unesite vrijednost između {0} i {1}."),
-	max: $.validator.format("Unesite vrijednost manju ili jednaku {0}."),
-	min: $.validator.format("Unesite vrijednost veću ili jednaku {0}.")
-});
+	maxlength: $.validator.format( "Maksimalni broj znakova je {0} ." ),
+	minlength: $.validator.format( "Minimalni broj znakova je {0} ." ),
+	rangelength: $.validator.format( "Unesite vrijednost između {0} i {1} znakova." ),
+	range: $.validator.format( "Unesite vrijednost između {0} i {1}." ),
+	max: $.validator.format( "Unesite vrijednost manju ili jednaku {0}." ),
+	min: $.validator.format( "Unesite vrijednost veću ili jednaku {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_hu.js b/civicrm/bower_components/jquery-validation/src/localization/messages_hu.js
index f2d3bc0d55..fc65bffdab 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_hu.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_hu.js
@@ -2,21 +2,22 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: HU (Hungarian; Magyar)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Kötelező megadni.",
-	maxlength: $.validator.format("Legfeljebb {0} karakter hosszú legyen."),
-	minlength: $.validator.format("Legalább {0} karakter hosszú legyen."),
-	rangelength: $.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),
+	maxlength: $.validator.format( "Legfeljebb {0} karakter hosszú legyen." ),
+	minlength: $.validator.format( "Legalább {0} karakter hosszú legyen." ),
+	rangelength: $.validator.format( "Legalább {0} és legfeljebb {1} karakter hosszú legyen." ),
 	email: "Érvényes e-mail címnek kell lennie.",
 	url: "Érvényes URL-nek kell lennie.",
 	date: "Dátumnak kell lennie.",
 	number: "Számnak kell lennie.",
 	digits: "Csak számjegyek lehetnek.",
 	equalTo: "Meg kell egyeznie a két értéknek.",
-	range: $.validator.format("{0} és {1} közé kell esnie."),
-	max: $.validator.format("Nem lehet nagyobb, mint {0}."),
-	min: $.validator.format("Nem lehet kisebb, mint {0}."),
+	range: $.validator.format( "{0} és {1} közé kell esnie." ),
+	max: $.validator.format( "Nem lehet nagyobb, mint {0}." ),
+	min: $.validator.format( "Nem lehet kisebb, mint {0}." ),
 	creditcard: "Érvényes hitelkártyaszámnak kell lennie.",
 	remote: "Kérem javítsa ki ezt a mezőt.",
-	dateISO: "Kérem írjon be egy érvényes dátumot (ISO)."
-});
+	dateISO: "Kérem írjon be egy érvényes dátumot (ISO).",
+	step: $.validator.format( "A {0} egyik többszörösét adja meg." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_hy_AM.js b/civicrm/bower_components/jquery-validation/src/localization/messages_hy_AM.js
new file mode 100644
index 0000000000..c0dea09bc4
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_hy_AM.js
@@ -0,0 +1,23 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: HY_AM (Armenian; Õ°Õ¡ÕµÕ¥Ö€Õ¥Õ¶ Õ¬Õ¥Õ¦Õ¸Ö‚)
+ */
+$.extend( $.validator.messages, {
+	required: "Պարտադիր լրացման դաշտ",
+	remote: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ³Õ«Õ·Õ¿ Õ¡Ö€ÕªÕ¥Ö„Õ¨",
+	email: "Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",
+	url: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¾Õ¡Õ¾Õ¥Ö€ URL",
+	date: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¾Õ¡Õ¾Õ¥Ö€ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾",
+	dateISO: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ ISO Ö†Õ¸Ö€Õ´Õ¡Õ¿Õ¸Õ¾ Õ¾Õ¡Õ¾Õ¥Ö€ Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾Ö‰",
+	number: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ©Õ«Õ¾",
+	digits: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ´Õ«Õ¡ÕµÕ¶ Õ©Õ¾Õ¥Ö€",
+	creditcard: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ³Õ«Õ·Õ¿ Õ¢Õ¡Õ¶Õ¯Õ¡ÕµÕ«Õ¶ Ö„Õ¡Ö€Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö€",
+	equalTo: "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ´Õ«Ö‡Õ¶Õ¸Ö‚Õ¶ Õ¡Ö€ÕªÕ¥Ö„Õ¨ Ö‡Õ½ Õ´Õ¥Õ¯ Õ¡Õ¶Õ£Õ¡Õ´",
+	extension: "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ³Õ«Õ·Õ¿ Õ¨Õ¶Õ¤Õ¬Õ¡Õ¶Õ¸Ö‚Õ´Õ¸Õ¾ Ö†Õ¡ÕµÕ¬",
+	maxlength: $.validator.format( "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬ Ö„Õ¡Õ¶ {0} Õ¶Õ«Õ·" ),
+	minlength: $.validator.format( "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ¸Õ¹ ÕºÕ¡Õ¯Õ¡Õ½ Ö„Õ¡Õ¶ {0} Õ¶Õ«Õ·" ),
+	rangelength: $.validator.format( "Ներմուծեք {0}֊ից {1} երկարությամբ արժեք" ),
+	range: $.validator.format( "Ներմուծեք թիվ {0}֊ից {1} միջակայքում" ),
+	max: $.validator.format( "Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին" ),
+	min: $.validator.format( "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Ö„ Õ©Õ«Õ¾, Õ¸Ö€Õ¨ Õ´Õ¥Õ® Õ¯Õ¡Õ´ Õ°Õ¡Õ¾Õ¡Õ½Õ¡Ö€ Õ§ {0}ÖŠÕ«Õ¶" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_id.js b/civicrm/bower_components/jquery-validation/src/localization/messages_id.js
index 7d388717ce..efd729b3a7 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_id.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_id.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: ID (Indonesia; Indonesian)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Kolom ini diperlukan.",
 	remote: "Harap benarkan kolom ini.",
 	email: "Silakan masukkan format email yang benar.",
@@ -13,10 +13,10 @@ $.extend($.validator.messages, {
 	digits: "Harap masukan angka saja.",
 	creditcard: "Harap masukkan format kartu kredit yang benar.",
 	equalTo: "Harap masukkan nilai yg sama dengan sebelumnya.",
-	maxlength: $.validator.format("Input dibatasi hanya {0} karakter."),
-	minlength: $.validator.format("Input tidak kurang dari {0} karakter."),
-	rangelength: $.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),
-	range: $.validator.format("Harap masukkan nilai antara {0} dan {1}."),
-	max: $.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),
-	min: $.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")
-});
+	maxlength: $.validator.format( "Input dibatasi hanya {0} karakter." ),
+	minlength: $.validator.format( "Input tidak kurang dari {0} karakter." ),
+	rangelength: $.validator.format( "Panjang karakter yg diizinkan antara {0} dan {1} karakter." ),
+	range: $.validator.format( "Harap masukkan nilai antara {0} dan {1}." ),
+	max: $.validator.format( "Harap masukkan nilai lebih kecil atau sama dengan {0}." ),
+	min: $.validator.format( "Harap masukkan nilai lebih besar atau sama dengan {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_is.js b/civicrm/bower_components/jquery-validation/src/localization/messages_is.js
index 1776fb4512..4040909d92 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_is.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_is.js
@@ -2,20 +2,20 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: IS (Icelandic; íslenska)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Þessi reitur er nauðsynlegur.",
 	remote: "Lagaðu þennan reit.",
-	maxlength: $.validator.format("Sláðu inn mest {0} stafi."),
-	minlength: $.validator.format("Sláðu inn minnst {0} stafi."),
-	rangelength: $.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),
+	maxlength: $.validator.format( "Sláðu inn mest {0} stafi." ),
+	minlength: $.validator.format( "Sláðu inn minnst {0} stafi." ),
+	rangelength: $.validator.format( "Sláðu inn minnst {0} og mest {1} stafi." ),
 	email: "Sláðu inn gilt netfang.",
 	url: "Sláðu inn gilda vefslóð.",
 	date: "Sláðu inn gilda dagsetningu.",
 	number: "Sláðu inn tölu.",
 	digits: "Sláðu inn tölustafi eingöngu.",
 	equalTo: "Sláðu sama gildi inn aftur.",
-	range: $.validator.format("Sláðu inn gildi milli {0} og {1}."),
-	max: $.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),
-	min: $.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),
+	range: $.validator.format( "Sláðu inn gildi milli {0} og {1}." ),
+	max: $.validator.format( "Sláðu inn gildi sem er minna en eða jafnt og {0}." ),
+	min: $.validator.format( "Sláðu inn gildi sem er stærra en eða jafnt og {0}." ),
 	creditcard: "Sláðu inn gilt greiðslukortanúmer."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_it.js b/civicrm/bower_components/jquery-validation/src/localization/messages_it.js
index 32428f9012..54f07e106e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_it.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_it.js
@@ -2,25 +2,26 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: IT (Italian; Italiano)
  */
-$.extend($.validator.messages, {
-	required: "Campo obbligatorio.",
-	remote: "Controlla questo campo.",
-	email: "Inserisci un indirizzo email valido.",
-	url: "Inserisci un indirizzo web valido.",
-	date: "Inserisci una data valida.",
-	dateISO: "Inserisci una data valida (ISO).",
-	number: "Inserisci un numero valido.",
-	digits: "Inserisci solo numeri.",
-	creditcard: "Inserisci un numero di carta di credito valido.",
-	equalTo: "Il valore non corrisponde.",
-	extension: "Inserisci un valore con un&apos;estensione valida.",
-	maxlength: $.validator.format("Non inserire pi&ugrave; di {0} caratteri."),
-	minlength: $.validator.format("Inserisci almeno {0} caratteri."),
-	rangelength: $.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri."),
-	range: $.validator.format("Inserisci un valore compreso tra {0} e {1}."),
-	max: $.validator.format("Inserisci un valore minore o uguale a {0}."),
-	min: $.validator.format("Inserisci un valore maggiore o uguale a {0}."),
-	nifES: "Inserisci un NIF valido.",
-	nieES: "Inserisci un NIE valido.",
-	cifES: "Inserisci un CIF valido."
-});
+$.extend( $.validator.messages, {
+	required: "Campo obbligatorio",
+	remote: "Controlla questo campo",
+	email: "Inserisci un indirizzo email valido",
+	url: "Inserisci un indirizzo web valido",
+	date: "Inserisci una data valida",
+	dateISO: "Inserisci una data valida (ISO)",
+	number: "Inserisci un numero valido",
+	digits: "Inserisci solo numeri",
+	creditcard: "Inserisci un numero di carta di credito valido",
+	equalTo: "Il valore non corrisponde",
+	extension: "Inserisci un valore con un&apos;estensione valida",
+	maxlength: $.validator.format( "Non inserire pi&ugrave; di {0} caratteri" ),
+	minlength: $.validator.format( "Inserisci almeno {0} caratteri" ),
+	rangelength: $.validator.format( "Inserisci un valore compreso tra {0} e {1} caratteri" ),
+	range: $.validator.format( "Inserisci un valore compreso tra {0} e {1}" ),
+	max: $.validator.format( "Inserisci un valore minore o uguale a {0}" ),
+	min: $.validator.format( "Inserisci un valore maggiore o uguale a {0}" ),
+	nifES: "Inserisci un NIF valido",
+	nieES: "Inserisci un NIE valido",
+	cifES: "Inserisci un CIF valido",
+	currency: "Inserisci una valuta valida"
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ja.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ja.js
index f422703d99..a5dcf08d17 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ja.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ja.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: JA (Japanese; 日本語)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "このフィールドは必須です。",
 	remote: "このフィールドを修正してください。",
 	email: "有効なEメールアドレスを入力してください。",
@@ -14,10 +14,11 @@ $.extend($.validator.messages, {
 	creditcard: "有効なクレジットカード番号を入力してください。",
 	equalTo: "同じ値をもう一度入力してください。",
 	extension: "有効な拡張子を含む値を入力してください。",
-	maxlength: $.validator.format("{0} 文字以内で入力してください。"),
-	minlength: $.validator.format("{0} 文字以上で入力してください。"),
-	rangelength: $.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),
-	range: $.validator.format("{0} から {1} までの値を入力してください。"),
-	max: $.validator.format("{0} 以下の値を入力してください。"),
-	min: $.validator.format("{0} 以上の値を入力してください。")
-});
+	maxlength: $.validator.format( "{0} 文字以内で入力してください。" ),
+	minlength: $.validator.format( "{0} 文字以上で入力してください。" ),
+	rangelength: $.validator.format( "{0} 文字から {1} 文字までの値を入力してください。" ),
+	range: $.validator.format( "{0} から {1} までの値を入力してください。" ),
+	step: $.validator.format( "{0} の倍数を入力してください。" ),
+	max: $.validator.format( "{0} 以下の値を入力してください。" ),
+	min: $.validator.format( "{0} 以上の値を入力してください。" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ka.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ka.js
index 18f57dbaea..8849022921 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ka.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ka.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: KA (Georgian; ქართული)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "ამ ველის შევსება აუცილებელია.",
 	remote: "გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",
 	email: "გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",
 	equalTo: "გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",
 	extension: "გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",
-	maxlength: $.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),
-	minlength: $.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),
-	rangelength: $.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),
-	range: $.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),
-	max: $.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),
-	min: $.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")
-});
+	maxlength: $.validator.format( "დასაშვებია არაუმეტეს {0} სიმბოლო." ),
+	minlength: $.validator.format( "აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო." ),
+	rangelength: $.validator.format( "ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე." ),
+	range: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე." ),
+	max: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს." ),
+	min: $.validator.format( "გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_kk.js b/civicrm/bower_components/jquery-validation/src/localization/messages_kk.js
index 6f49c0b25c..41ca4829a8 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_kk.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_kk.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: KK (Kazakh; қазақ тілі)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Бұл өрісті міндетті түрде толтырыңыз.",
 	remote: "Дұрыс мағына енгізуіңізді сұраймыз.",
 	email: "Нақты электронды поштаңызды енгізуіңізді сұраймыз.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",
 	equalTo: "Осы мәнді қайта енгізуіңізді сұраймыз.",
 	extension: "Файлдың кеңейтуін дұрыс таңдаңыз.",
-	maxlength: $.validator.format("Ұзындығы {0} символдан көр болмасын."),
-	minlength: $.validator.format("Ұзындығы {0} символдан аз болмасын."),
-	rangelength: $.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),
-	range: $.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),
-	max: $.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),
-	min: $.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")
-});
+	maxlength: $.validator.format( "Ұзындығы {0} символдан көр болмасын." ),
+	minlength: $.validator.format( "Ұзындығы {0} символдан аз болмасын." ),
+	rangelength: $.validator.format( "Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз." ),
+	range: $.validator.format( "Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз." ),
+	max: $.validator.format( "{0} аз немесе тең санын енгізуіңіді сұраймыз." ),
+	min: $.validator.format( "{0} көп немесе тең санын енгізуіңізді сұраймыз." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ko.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ko.js
index 2ae08a9812..d9f4ab0907 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ko.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ko.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: KO (Korean; 한국어)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "필수 항목입니다.",
 	remote: "항목을 수정하세요.",
 	email: "유효하지 않은 E-Mail주소입니다.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "신용카드 번호가 바르지 않습니다.",
 	equalTo: "같은 값을 다시 입력하세요.",
 	extension: "올바른 확장자가 아닙니다.",
-	maxlength: $.validator.format("{0}자를 넘을 수 없습니다. "),
-	minlength: $.validator.format("{0}자 이상 입력하세요."),
-	rangelength: $.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),
-	range: $.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),
-	max: $.validator.format("{0} 이하의 값을 입력하세요."),
-	min: $.validator.format("{0} 이상의 값을 입력하세요.")
-});
+	maxlength: $.validator.format( "{0}자를 넘을 수 없습니다. " ),
+	minlength: $.validator.format( "{0}자 이상 입력하세요." ),
+	rangelength: $.validator.format( "문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요." ),
+	range: $.validator.format( "{0} 에서 {1} 사이의 값을 입력하세요." ),
+	max: $.validator.format( "{0} 이하의 값을 입력하세요." ),
+	min: $.validator.format( "{0} 이상의 값을 입력하세요." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_lt.js b/civicrm/bower_components/jquery-validation/src/localization/messages_lt.js
index 061feacf24..9d4ed3503f 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_lt.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_lt.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: LT (Lithuanian; lietuvių kalba)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Å is laukas yra privalomas.",
 	remote: "Prašau pataisyti šį lauką.",
 	email: "Prašau įvesti teisingą elektroninio pašto adresą.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Prašau įvesti teisingą kreditinės kortelės numerį.",
 	equalTo: "Prašau įvestį tą pačią reikšmę dar kartą.",
 	extension: "Prašau įvesti reikšmę su teisingu plėtiniu.",
-	maxlength: $.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),
-	minlength: $.validator.format("Prašau įvesti bent {0} simbolius."),
-	rangelength: $.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),
-	range: $.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),
-	max: $.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),
-	min: $.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")
-});
+	maxlength: $.validator.format( "Prašau įvesti ne daugiau kaip {0} simbolių." ),
+	minlength: $.validator.format( "Prašau įvesti bent {0} simbolius." ),
+	rangelength: $.validator.format( "Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių." ),
+	range: $.validator.format( "Prašau įvesti reikšmę intervale nuo {0} iki {1}." ),
+	max: $.validator.format( "Prašau įvesti reikšmę mažesnę arba lygią {0}." ),
+	min: $.validator.format( "Prašau įvesti reikšmę didesnę arba lygią {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_lv.js b/civicrm/bower_components/jquery-validation/src/localization/messages_lv.js
index 6c00a1bfec..bc5632b245 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_lv.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_lv.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: LV (Latvian; latviešu valoda)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Šis lauks ir obligāts.",
 	remote: "Lūdzu, pārbaudiet šo lauku.",
 	email: "Lūdzu, ievadiet derīgu e-pasta adresi.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Lūdzu, ievadiet derīgu kredītkartes numuru.",
 	equalTo: "Lūdzu, ievadiet to pašu vēlreiz.",
 	extension: "Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",
-	maxlength: $.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),
-	minlength: $.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),
-	rangelength: $.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),
-	range: $.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),
-	max: $.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),
-	min: $.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")
-});
+	maxlength: $.validator.format( "Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes." ),
+	minlength: $.validator.format( "Lūdzu, ievadiet vismaz {0} rakstzīmes." ),
+	rangelength: $.validator.format( "Lūdzu ievadiet {0} līdz {1} rakstzīmes." ),
+	range: $.validator.format( "Lūdzu, ievadiet skaitli no {0} līdz {1}." ),
+	max: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}." ),
+	min: $.validator.format( "Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_mk.js b/civicrm/bower_components/jquery-validation/src/localization/messages_mk.js
new file mode 100644
index 0000000000..21da3282f7
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_mk.js
@@ -0,0 +1,23 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: MK (Macedonian; македонски јазик)
+ */
+$.extend( $.validator.messages, {
+	required: "Полето е задолжително.",
+	remote: "Поправете го ова поле",
+	email: "Внесете правилна e-mail адреса",
+	url: "Внесете правилен URL.",
+	date: "Внесете правилен датум",
+	dateISO: "Внесете правилен датум (ISO).",
+	number: "Внесете правилен број.",
+	digits: "Внесете само бројки.",
+	creditcard: "Внесете правилен број на кредитната картичка.",
+	equalTo: "Внесете ја истата вредност повторно.",
+	extension: "Внесете вредност со соодветна екстензија.",
+	maxlength: $.validator.format( "Внесете максимално {0} знаци." ),
+	minlength: $.validator.format( "Внесете барем {0} знаци." ),
+	rangelength: $.validator.format( "Внесете вредност со должина помеѓу {0} и {1} знаци." ),
+	range: $.validator.format( "Внесете вредност помеѓу {0} и {1}." ),
+	max: $.validator.format( "Внесете вредност помала или еднаква на {0}." ),
+	min: $.validator.format( "Внесете вредност поголема или еднаква на {0}" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_my.js b/civicrm/bower_components/jquery-validation/src/localization/messages_my.js
index 22dbe9c34f..f652345812 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_my.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_my.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: MY (Malay; Melayu)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Medan ini diperlukan.",
 	remote: "Sila betulkan medan ini.",
 	email: "Sila masukkan alamat emel yang betul.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Sila masukkan nombor kredit kad yang betul.",
 	equalTo: "Sila masukkan nilai yang sama semula.",
 	extension: "Sila masukkan nilai yang telah diterima.",
-	maxlength: $.validator.format("Sila masukkan nilai tidak lebih dari {0} aksara."),
-	minlength: $.validator.format("Sila masukkan nilai sekurang-kurangnya {0} aksara."),
-	rangelength: $.validator.format("Sila masukkan panjang nilai antara {0} dan {1} aksara."),
-	range: $.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),
-	max: $.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),
-	min: $.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")
-});
+	maxlength: $.validator.format( "Sila masukkan tidak lebih dari {0} aksara." ),
+	minlength: $.validator.format( "Sila masukkan sekurang-kurangnya {0} aksara." ),
+	rangelength: $.validator.format( "Sila masukkan antara {0} dan {1} panjang aksara." ),
+	range: $.validator.format( "Sila masukkan nilai antara {0} dan {1} aksara." ),
+	max: $.validator.format( "Sila masukkan nilai yang kurang atau sama dengan {0}." ),
+	min: $.validator.format( "Sila masukkan nilai yang lebih atau sama dengan {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_nl.js b/civicrm/bower_components/jquery-validation/src/localization/messages_nl.js
index 52a7111da3..2d6a6970ef 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_nl.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_nl.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: NL (Dutch; Nederlands, Vlaams)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Dit is een verplicht veld.",
 	remote: "Controleer dit veld.",
 	email: "Vul hier een geldig e-mailadres in.",
@@ -14,14 +14,15 @@ $.extend($.validator.messages, {
 	creditcard: "Vul hier een geldig creditcardnummer in.",
 	equalTo: "Vul hier dezelfde waarde in.",
 	extension: "Vul hier een waarde in met een geldige extensie.",
-	maxlength: $.validator.format("Vul hier maximaal {0} tekens in."),
-	minlength: $.validator.format("Vul hier minimaal {0} tekens in."),
-	rangelength: $.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),
-	range: $.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),
-	max: $.validator.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),
-	min: $.validator.format("Vul hier een waarde in groter dan of gelijk aan {0}."),
+	maxlength: $.validator.format( "Vul hier maximaal {0} tekens in." ),
+	minlength: $.validator.format( "Vul hier minimaal {0} tekens in." ),
+	rangelength: $.validator.format( "Vul hier een waarde in van minimaal {0} en maximaal {1} tekens." ),
+	range: $.validator.format( "Vul hier een waarde in van minimaal {0} en maximaal {1}." ),
+	max: $.validator.format( "Vul hier een waarde in kleiner dan of gelijk aan {0}." ),
+	min: $.validator.format( "Vul hier een waarde in groter dan of gelijk aan {0}." ),
+	step: $.validator.format( "Vul hier een veelvoud van {0} in." ),
 
-	// for validations in additional-methods.js
+	// For validations in additional-methods.js
 	iban: "Vul hier een geldig IBAN in.",
 	dateNL: "Vul hier een geldige datum in.",
 	phoneNL: "Vul hier een geldig Nederlands telefoonnummer in.",
@@ -30,4 +31,4 @@ $.extend($.validator.messages, {
 	bankaccountNL: "Vul hier een geldig bankrekeningnummer in.",
 	giroaccountNL: "Vul hier een geldig gironummer in.",
 	bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_no.js b/civicrm/bower_components/jquery-validation/src/localization/messages_no.js
index 7d55a370dd..cd47c6cdc5 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_no.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_no.js
@@ -2,22 +2,22 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: NO (Norwegian; Norsk)
  */
-$.extend($.validator.messages, {
-	required: "Dette feltet er obligatorisk.",
-	maxlength: $.validator.format("Maksimalt {0} tegn."),
-	minlength: $.validator.format("Minimum {0} tegn."),
-	rangelength: $.validator.format("Angi minimum {0} og maksimum {1} tegn."),
-	email: "Oppgi en gyldig epostadresse.",
+$.extend( $.validator.messages, {
+	required: "Angi en verdi.",
+	remote: "Ugyldig verdi.",
+	email: "Angi en gyldig epostadresse.",
 	url: "Angi en gyldig URL.",
 	date: "Angi en gyldig dato.",
 	dateISO: "Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",
-	dateSE: "Angi en gyldig dato.",
-	number: "Angi et gyldig nummer.",
-	numberSE: "Angi et gyldig nummer.",
+	number: "Angi et gyldig tall.",
 	digits: "Skriv kun tall.",
 	equalTo: "Skriv samme verdi igjen.",
-	range: $.validator.format("Angi en verdi mellom {0} og {1}."),
-	max: $.validator.format("Angi en verdi som er mindre eller lik {0}."),
-	min: $.validator.format("Angi en verdi som er st&oslash;rre eller lik {0}."),
+	maxlength: $.validator.format( "Maksimalt {0} tegn." ),
+	minlength: $.validator.format( "Minimum {0} tegn." ),
+	rangelength: $.validator.format( "Angi minimum {0} og maksimum {1} tegn." ),
+	range: $.validator.format( "Angi en verdi mellom {0} og {1}." ),
+	max: $.validator.format( "Angi en verdi som er mindre eller lik {0}." ),
+	min: $.validator.format( "Angi en verdi som er st&oslash;rre eller lik {0}." ),
+	step: $.validator.format( "Angi en verdi ganger {0}." ),
 	creditcard: "Angi et gyldig kredittkortnummer."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_pl.js b/civicrm/bower_components/jquery-validation/src/localization/messages_pl.js
index 17fc0c4321..1f77009ecf 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_pl.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_pl.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: PL (Polish; język polski, polszczyzna)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "To pole jest wymagane.",
 	remote: "Proszę o wypełnienie tego pola.",
 	email: "Proszę o podanie prawidłowego adresu email.",
@@ -14,10 +14,13 @@ $.extend($.validator.messages, {
 	creditcard: "Proszę o podanie prawidłowej karty kredytowej.",
 	equalTo: "Proszę o podanie tej samej wartości ponownie.",
 	extension: "Proszę o podanie wartości z prawidłowym rozszerzeniem.",
-	maxlength: $.validator.format("Proszę o podanie nie więcej niż {0} znaków."),
-	minlength: $.validator.format("Proszę o podanie przynajmniej {0} znaków."),
-	rangelength: $.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),
-	range: $.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),
-	max: $.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),
-	min: $.validator.format("Proszę o podanie wartości większej bądź równej {0}.")
-});
+	nipPL: "Proszę o podanie prawidłowego numeru NIP.",
+	phonePL: "Proszę o podanie prawidłowego numeru telefonu",
+	maxlength: $.validator.format( "Proszę o podanie nie więcej niż {0} znaków." ),
+	minlength: $.validator.format( "Proszę o podanie przynajmniej {0} znaków." ),
+	rangelength: $.validator.format( "Proszę o podanie wartości o długości od {0} do {1} znaków." ),
+	range: $.validator.format( "Proszę o podanie wartości z przedziału od {0} do {1}." ),
+	max: $.validator.format( "Proszę o podanie wartości mniejszej bądź równej {0}." ),
+	min: $.validator.format( "Proszę o podanie wartości większej bądź równej {0}." ),
+	pattern: $.validator.format( "Pole zawiera niedozwolone znaki." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_pt_BR.js b/civicrm/bower_components/jquery-validation/src/localization/messages_pt_BR.js
index b356f5146d..cfd018de8e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_pt_BR.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_pt_BR.js
@@ -3,7 +3,9 @@
  * Locale: PT (Portuguese; português)
  * Region: BR (Brazil)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
+
+	// Core
 	required: "Este campo &eacute; requerido.",
 	remote: "Por favor, corrija este campo.",
 	email: "Por favor, forne&ccedil;a um endere&ccedil;o de email v&aacute;lido.",
@@ -14,15 +16,64 @@ $.extend($.validator.messages, {
 	digits: "Por favor, forne&ccedil;a somente d&iacute;gitos.",
 	creditcard: "Por favor, forne&ccedil;a um cart&atilde;o de cr&eacute;dito v&aacute;lido.",
 	equalTo: "Por favor, forne&ccedil;a o mesmo valor novamente.",
+	maxlength: $.validator.format( "Por favor, forne&ccedil;a n&atilde;o mais que {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, forne&ccedil;a ao menos {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, forne&ccedil;a um valor entre {0} e {1} caracteres de comprimento." ),
+	range: $.validator.format( "Por favor, forne&ccedil;a um valor entre {0} e {1}." ),
+	max: $.validator.format( "Por favor, forne&ccedil;a um valor menor ou igual a {0}." ),
+	min: $.validator.format( "Por favor, forne&ccedil;a um valor maior ou igual a {0}." ),
+	step: $.validator.format( "Por favor, forne&ccedil;a um valor m&uacute;ltiplo de {0}." ),
+
+	// Metodos Adicionais
+	maxWords: $.validator.format( "Por favor, forne&ccedil;a com {0} palavras ou menos." ),
+	minWords: $.validator.format( "Por favor, forne&ccedil;a pelo menos {0} palavras." ),
+	rangeWords: $.validator.format( "Por favor, forne&ccedil;a entre {0} e {1} palavras." ),
+	accept: "Por favor, forne&ccedil;a um tipo v&aacute;lido.",
+	alphanumeric: "Por favor, forne&ccedil;a somente com letras, n&uacute;meros e sublinhados.",
+	bankaccountNL: "Por favor, forne&ccedil;a com um n&uacute;mero de conta banc&aacute;ria v&aacute;lida.",
+	bankorgiroaccountNL: "Por favor, forne&ccedil;a um banco v&aacute;lido ou n&uacute;mero de conta.",
+	bic: "Por favor, forne&ccedil;a um c&oacute;digo BIC v&aacute;lido.",
+	cifES: "Por favor, forne&ccedil;a um c&oacute;digo CIF v&aacute;lido.",
+	creditcardtypes: "Por favor, forne&ccedil;a um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",
+	currency: "Por favor, forne&ccedil;a uma moeda v&aacute;lida.",
+	dateFA: "Por favor, forne&ccedil;a uma data correta.",
+	dateITA: "Por favor, forne&ccedil;a uma data correta.",
+	dateNL: "Por favor, forne&ccedil;a uma data correta.",
 	extension: "Por favor, forne&ccedil;a um valor com uma extens&atilde;o v&aacute;lida.",
-	maxlength: $.validator.format("Por favor, forne&ccedil;a n&atilde;o mais que {0} caracteres."),
-	minlength: $.validator.format("Por favor, forne&ccedil;a ao menos {0} caracteres."),
-	rangelength: $.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1} caracteres de comprimento."),
-	range: $.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1}."),
-	max: $.validator.format("Por favor, forne&ccedil;a um valor menor ou igual a {0}."),
-	min: $.validator.format("Por favor, forne&ccedil;a um valor maior ou igual a {0}."),
-	nifES: "Por favor, forne&ccedil;a um NIF v&aacute;lido.",
+	giroaccountNL: "Por favor, forne&ccedil;a um n&uacute;mero de conta corrente v&aacute;lido.",
+	iban: "Por favor, forne&ccedil;a um c&oacute;digo IBAN v&aacute;lido.",
+	integer: "Por favor, forne&ccedil;a um n&uacute;mero n&atilde;o decimal.",
+	ipv4: "Por favor, forne&ccedil;a um IPv4 v&aacute;lido.",
+	ipv6: "Por favor, forne&ccedil;a um IPv6 v&aacute;lido.",
+	lettersonly: "Por favor, forne&ccedil;a apenas com letras.",
+	letterswithbasicpunc: "Por favor, forne&ccedil;a apenas letras ou pontua&ccedil;ões.",
+	mobileNL: "Por favor, fornece&ccedil;a um n&uacute;mero v&aacute;lido de telefone.",
+	mobileUK: "Por favor, fornece&ccedil;a um n&uacute;mero v&aacute;lido de telefone.",
 	nieES: "Por favor, forne&ccedil;a um NIE v&aacute;lido.",
-	cifEE: "Por favor, forne&ccedil;a um CIF v&aacute;lido.",
-	postalcodeBR: "Por favor, forne&ccedil;a um CEP v&aacute;lido."
-});
+	nifES: "Por favor, forne&ccedil;a um NIF v&aacute;lido.",
+	nowhitespace: "Por favor, n&atilde;o utilize espa&ccedil;os em branco.",
+	pattern: "O formato fornecido &eacute; inv&aacute;lido.",
+	phoneNL: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	phoneUK: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	phoneUS: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	phonesUK: "Por favor, forne&ccedil;a um n&uacute;mero de telefone v&aacute;lido.",
+	postalCodeCA: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postalcodeIT: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postalcodeNL: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postcodeUK: "Por favor, forne&ccedil;a um n&uacute;mero de c&oacute;digo postal v&aacute;lido.",
+	postalcodeBR: "Por favor, forne&ccedil;a um CEP v&aacute;lido.",
+	require_from_group: $.validator.format( "Por favor, forne&ccedil;a pelo menos {0} destes campos." ),
+	skip_or_fill_minimum: $.validator.format( "Por favor, optar entre ignorar esses campos ou preencher pelo menos {0} deles." ),
+	stateUS: "Por favor, forne&ccedil;a um estado v&aacute;lido.",
+	strippedminlength: $.validator.format( "Por favor, forne&ccedil;a pelo menos {0} caracteres." ),
+	time: "Por favor, forne&ccedil;a um hor&aacute;rio v&aacute;lido, no intervado de 00:00 a 23:59.",
+	time12h: "Por favor, forne&ccedil;a um hor&aacute;rio v&aacute;lido, no intervado de 01:00 a 12:59 am/pm.",
+	url2: "Por favor, forne&ccedil;a uma URL v&aacute;lida.",
+	vinUS: "O n&uacute;mero de identifica&ccedil;&atilde;o de ve&iacute;culo informado (VIN) &eacute; inv&aacute;lido.",
+	zipcodeUS: "Por favor, forne&ccedil;a um c&oacute;digo postal americano v&aacute;lido.",
+	ziprange: "O c&oacute;digo postal deve estar entre 902xx-xxxx e 905xx-xxxx",
+	cpfBR: "Por favor, forne&ccedil;a um CPF v&aacute;lido.",
+	nisBR: "Por favor, forne&ccedil;a um NIS/PIS v&aacute;lido",
+	cnhBR: "Por favor, forne&ccedil;a um CNH v&aacute;lido.",
+	cnpjBR: "Por favor, forne&ccedil;a um CNPJ v&aacute;lido."
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_pt_PT.js b/civicrm/bower_components/jquery-validation/src/localization/messages_pt_PT.js
index e3be7fc25b..0a41b89c19 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_pt_PT.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_pt_PT.js
@@ -3,7 +3,7 @@
  * Locale: PT (Portuguese; português)
  * Region: PT (Portugal)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Campo de preenchimento obrigat&oacute;rio.",
 	remote: "Por favor, corrija este campo.",
 	email: "Por favor, introduza um endere&ccedil;o eletr&oacute;nico v&aacute;lido.",
@@ -15,13 +15,13 @@ $.extend($.validator.messages, {
 	creditcard: "Por favor, introduza um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",
 	equalTo: "Por favor, introduza de novo o mesmo valor.",
 	extension: "Por favor, introduza um ficheiro com uma extens&atilde;o v&aacute;lida.",
-	maxlength: $.validator.format("Por favor, n&atilde;o introduza mais do que {0} caracteres."),
-	minlength: $.validator.format("Por favor, introduza pelo menos {0} caracteres."),
-	rangelength: $.validator.format("Por favor, introduza entre {0} e {1} caracteres."),
-	range: $.validator.format("Por favor, introduza um valor entre {0} e {1}."),
-	max: $.validator.format("Por favor, introduza um valor menor ou igual a {0}."),
-	min: $.validator.format("Por favor, introduza um valor maior ou igual a {0}."),
+	maxlength: $.validator.format( "Por favor, n&atilde;o introduza mais do que {0} caracteres." ),
+	minlength: $.validator.format( "Por favor, introduza pelo menos {0} caracteres." ),
+	rangelength: $.validator.format( "Por favor, introduza entre {0} e {1} caracteres." ),
+	range: $.validator.format( "Por favor, introduza um valor entre {0} e {1}." ),
+	max: $.validator.format( "Por favor, introduza um valor menor ou igual a {0}." ),
+	min: $.validator.format( "Por favor, introduza um valor maior ou igual a {0}." ),
 	nifES: "Por favor, introduza um NIF v&aacute;lido.",
 	nieES: "Por favor, introduza um NIE v&aacute;lido.",
 	cifES: "Por favor, introduza um CIF v&aacute;lido."
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ro.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ro.js
index 3e74733077..7ea626b425 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ro.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ro.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: RO (Romanian, limba română)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Acest câmp este obligatoriu.",
 	remote: "Te rugăm să completezi acest câmp.",
 	email: "Te rugăm să introduci o adresă de email validă",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Te rugăm să introduci un numar de carte de credit valid.",
 	equalTo: "Te rugăm să reintroduci valoarea.",
 	extension: "Te rugăm să introduci o valoare cu o extensie validă.",
-	maxlength: $.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),
-	minlength: $.validator.format("Te rugăm să introduci cel puțin {0} caractere."),
-	rangelength: $.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),
-	range: $.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),
-	max: $.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),
-	min: $.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")
-});
+	maxlength: $.validator.format( "Te rugăm să nu introduci mai mult de {0} caractere." ),
+	minlength: $.validator.format( "Te rugăm să introduci cel puțin {0} caractere." ),
+	rangelength: $.validator.format( "Te rugăm să introduci o valoare între {0} și {1} caractere." ),
+	range: $.validator.format( "Te rugăm să introduci o valoare între {0} și {1}." ),
+	max: $.validator.format( "Te rugăm să introduci o valoare egal sau mai mică decât {0}." ),
+	min: $.validator.format( "Te rugăm să introduci o valoare egal sau mai mare decât {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ru.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ru.js
index a93d53986d..7cc5363206 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_ru.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ru.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: RU (Russian; русский язык)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Это поле необходимо заполнить.",
 	remote: "Пожалуйста, введите правильное значение.",
 	email: "Пожалуйста, введите корректный адрес электронной почты.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Пожалуйста, введите правильный номер кредитной карты.",
 	equalTo: "Пожалуйста, введите такое же значение ещё раз.",
 	extension: "Пожалуйста, выберите файл с правильным расширением.",
-	maxlength: $.validator.format("Пожалуйста, введите не больше {0} символов."),
-	minlength: $.validator.format("Пожалуйста, введите не меньше {0} символов."),
-	rangelength: $.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),
-	range: $.validator.format("Пожалуйста, введите число от {0} до {1}."),
-	max: $.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),
-	min: $.validator.format("Пожалуйста, введите число, большее или равное {0}.")
-});
+	maxlength: $.validator.format( "Пожалуйста, введите не больше {0} символов." ),
+	minlength: $.validator.format( "Пожалуйста, введите не меньше {0} символов." ),
+	rangelength: $.validator.format( "Пожалуйста, введите значение длиной от {0} до {1} символов." ),
+	range: $.validator.format( "Пожалуйста, введите число от {0} до {1}." ),
+	max: $.validator.format( "Пожалуйста, введите число, меньшее или равное {0}." ),
+	min: $.validator.format( "Пожалуйста, введите число, большее или равное {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_sd.js b/civicrm/bower_components/jquery-validation/src/localization/messages_sd.js
new file mode 100644
index 0000000000..0fee5cba57
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_sd.js
@@ -0,0 +1,23 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: SD (Sindhi; سنڌي)
+ */
+$.extend( $.validator.messages, {
+    required: "هنن جاين جي ضرورت آهي",
+    remote: "هنن جاين جي ضرورت آهي",
+    email: "لکيل اي ميل غلط آهي",
+    url: "لکيل ايڊريس غلط آهي",
+    date: "لکيل تاريخ غلط آهي",
+    dateISO: "جي معيار جي مطابق نه آهي (ISO) لکيل تاريخ",
+    number: "لکيل انگ صحيح ناهي",
+    digits: "رڳو انگ داخل ڪري سگهجي ٿو",
+    creditcard: "لکيل ڪارڊ نمبر صحيح نه آهي",
+    equalTo: "داخل ٿيل ڀيٽ صحيح نه آهي",
+    extension: "لکيل غلط آهي",
+    maxlength: $.validator.format( "وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي" ),
+    minlength: $.validator.format( "گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي" ),
+    rangelength: $.validator.format( "داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي" ),
+    range: $.validator.format( "داخلا جو {0} ۽ {1}جي وچ ۾ هجڻ ضروري آهي" ),
+    max: $.validator.format( "وڌ کان وڌ {0} جي داخلا ڪري سگهجي ٿي" ),
+    min: $.validator.format( "گهٽ ۾ گهٽ {0} جي داخلا ڪرڻ ضروري آهي" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_si.js b/civicrm/bower_components/jquery-validation/src/localization/messages_si.js
index 011fb07829..5a94020121 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_si.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_si.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: SI (Slovenian)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "To polje je obvezno.",
 	remote: "Vpis v tem polju ni v pravi obliki.",
 	email: "Prosimo, vnesite pravi email naslov.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Prosimo, vnesite pravo Å¡tevilko kreditne kartice.",
 	equalTo: "Prosimo, ponovno vnesite enako vsebino.",
 	extension: "Prosimo, vnesite vsebino z pravo končnico.",
-	maxlength: $.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),
-	minlength: $.validator.format("Prosimo, vnesite vsaj {0} znakov."),
-	rangelength: $.validator.format("Prosimo, vnesite od {0} do {1} znakov."),
-	range: $.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),
-	max: $.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),
-	min: $.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")
-});
+	maxlength: $.validator.format( "Prosimo, da ne vnašate več kot {0} znakov." ),
+	minlength: $.validator.format( "Prosimo, vnesite vsaj {0} znakov." ),
+	rangelength: $.validator.format( "Prosimo, vnesite od {0} do {1} znakov." ),
+	range: $.validator.format( "Prosimo, vnesite vrednost med {0} in {1}." ),
+	max: $.validator.format( "Prosimo, vnesite vrednost manjšo ali enako {0}." ),
+	min: $.validator.format( "Prosimo, vnesite vrednost večjo ali enako {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_sk.js b/civicrm/bower_components/jquery-validation/src/localization/messages_sk.js
index d4769ee539..962625fbfd 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_sk.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_sk.js
@@ -2,19 +2,20 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: SK (Slovak; slovenčina, slovenský jazyk)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Povinné zadať.",
-	maxlength: $.validator.format("Maximálne {0} znakov."),
-	minlength: $.validator.format("Minimálne {0} znakov."),
-	rangelength: $.validator.format("Minimálne {0} a Maximálne {1} znakov."),
+	maxlength: $.validator.format( "Maximálne {0} znakov." ),
+	minlength: $.validator.format( "Minimálne {0} znakov." ),
+	rangelength: $.validator.format( "Minimálne {0} a maximálne {1} znakov." ),
 	email: "E-mailová adresa musí byť platná.",
-	url: "URL musí byť platný.",
+	url: "URL musí byť platná.",
 	date: "Musí byť dátum.",
 	number: "Musí byť číslo.",
 	digits: "Môže obsahovať iba číslice.",
-	equalTo: "Dva hodnoty sa musia rovnať.",
-	range: $.validator.format("Musí byť medzi {0} a {1}."),
-	max: $.validator.format("Nemôže byť viac ako{0}."),
-	min: $.validator.format("Nemôže byť menej ako{0}."),
-	creditcard: "Číslo platobnej karty musí byť platné."
-});
+	equalTo: "Dve hodnoty sa musia rovnať.",
+	range: $.validator.format( "Musí byť medzi {0} a {1}." ),
+	max: $.validator.format( "Nemôže byť viac ako {0}." ),
+	min: $.validator.format( "Nemôže byť menej ako {0}." ),
+	creditcard: "Číslo platobnej karty musí byť platné.",
+	step: $.validator.format( "Musí byť násobkom čísla {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_sl.js b/civicrm/bower_components/jquery-validation/src/localization/messages_sl.js
index 0587b91c17..89f74a7fe3 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_sl.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_sl.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Language: SL (Slovenian; slovenski jezik)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "To polje je obvezno.",
 	remote: "Prosimo popravite to polje.",
 	email: "Prosimo vnesite veljaven email naslov.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Prosimo vnesite veljavno Å¡tevilko kreditne kartice.",
 	equalTo: "Prosimo ponovno vnesite vrednost.",
 	extension: "Prosimo vnesite vrednost z veljavno končnico.",
-	maxlength: $.validator.format("Prosimo vnesite največ {0} znakov."),
-	minlength: $.validator.format("Prosimo vnesite najmanj {0} znakov."),
-	rangelength: $.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),
-	range: $.validator.format("Prosimo vnesite vrednost med {0} in {1}."),
-	max: $.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),
-	min: $.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")
-});
+	maxlength: $.validator.format( "Prosimo vnesite največ {0} znakov." ),
+	minlength: $.validator.format( "Prosimo vnesite najmanj {0} znakov." ),
+	rangelength: $.validator.format( "Prosimo vnesite najmanj {0} in največ {1} znakov." ),
+	range: $.validator.format( "Prosimo vnesite vrednost med {0} in {1}." ),
+	max: $.validator.format( "Prosimo vnesite vrednost manjše ali enako {0}." ),
+	min: $.validator.format( "Prosimo vnesite vrednost večje ali enako {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_sr.js b/civicrm/bower_components/jquery-validation/src/localization/messages_sr.js
index 788367ca93..d6f9bec61e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_sr.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_sr.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: SR (Serbian; српски језик)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Поље је обавезно.",
 	remote: "Средите ово поље.",
 	email: "Унесите исправну и-мејл адресу.",
@@ -14,10 +14,11 @@ $.extend($.validator.messages, {
 	creditcard: "Унесите исправан број кредитне картице.",
 	equalTo: "Унесите исту вредност поново.",
 	extension: "Унесите вредност са одговарајућом екстензијом.",
-	maxlength: $.validator.format("Унесите мање од {0} карактера."),
-	minlength: $.validator.format("Унесите барем {0} карактера."),
-	rangelength: $.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),
-	range: $.validator.format("Унесите вредност између {0} и {1}."),
-	max: $.validator.format("Унесите вредност мању или једнаку {0}."),
-	min: $.validator.format("Унесите вредност већу или једнаку {0}.")
-});
+	maxlength: $.validator.format( "Унесите мање од {0} карактера." ),
+	minlength: $.validator.format( "Унесите барем {0} карактера." ),
+	rangelength: $.validator.format( "Унесите вредност дугачку између {0} и {1} карактера." ),
+	range: $.validator.format( "Унесите вредност између {0} и {1}." ),
+	max: $.validator.format( "Унесите вредност мању или једнаку {0}." ),
+	min: $.validator.format( "Унесите вредност већу или једнаку {0}." ),
+	step: $.validator.format( "Унесите вредност која је умножак броја {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_sr_lat.js b/civicrm/bower_components/jquery-validation/src/localization/messages_sr_lat.js
index ec768c076a..43666f98da 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_sr_lat.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_sr_lat.js
@@ -2,22 +2,23 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: SR (Serbian - Latin alphabet; srpski jezik - latinica)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Polje je obavezno.",
 	remote: "Sredite ovo polje.",
-	email: "Unesite ispravnu i-mejl adresu",
+	email: "Unesite ispravnu e-mail adresu",
 	url: "Unesite ispravan URL.",
 	date: "Unesite ispravan datum.",
 	dateISO: "Unesite ispravan datum (ISO).",
 	number: "Unesite ispravan broj.",
-	digits: "Unesite samo cife.",
+	digits: "Unesite samo cifre.",
 	creditcard: "Unesite ispravan broj kreditne kartice.",
 	equalTo: "Unesite istu vrednost ponovo.",
 	extension: "Unesite vrednost sa odgovarajućom ekstenzijom.",
-	maxlength: $.validator.format("Unesite manje od {0} karaktera."),
-	minlength: $.validator.format("Unesite barem {0} karaktera."),
-	rangelength: $.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),
-	range: $.validator.format("Unesite vrednost između {0} i {1}."),
-	max: $.validator.format("Unesite vrednost manju ili jednaku {0}."),
-	min: $.validator.format("Unesite vrednost veću ili jednaku {0}.")
-});
+	maxlength: $.validator.format( "Unesite manje od {0} karaktera." ),
+	minlength: $.validator.format( "Unesite barem {0} karaktera." ),
+	rangelength: $.validator.format( "Unesite vrednost dugačku između {0} i {1} karaktera." ),
+	range: $.validator.format( "Unesite vrednost između {0} i {1}." ),
+	max: $.validator.format( "Unesite vrednost manju ili jednaku {0}." ),
+	min: $.validator.format( "Unesite vrednost veću ili jednaku {0}." ),
+	step: $.validator.format( "Unesite vrednost koja je umnožak broja {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_sv.js b/civicrm/bower_components/jquery-validation/src/localization/messages_sv.js
index 7f0c95e49b..0ef33285ca 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_sv.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_sv.js
@@ -2,11 +2,12 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: SV (Swedish; Svenska)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Detta f&auml;lt &auml;r obligatoriskt.",
-	maxlength: $.validator.format("Du f&aring;r ange h&ouml;gst {0} tecken."),
-	minlength: $.validator.format("Du m&aring;ste ange minst {0} tecken."),
-	rangelength: $.validator.format("Ange minst {0} och max {1} tecken."),
+	remote: "Var snäll och åtgärda detta fält.",
+	maxlength: $.validator.format( "Du f&aring;r ange h&ouml;gst {0} tecken." ),
+	minlength: $.validator.format( "Du m&aring;ste ange minst {0} tecken." ),
+	rangelength: $.validator.format( "Ange minst {0} och max {1} tecken." ),
 	email: "Ange en korrekt e-postadress.",
 	url: "Ange en korrekt URL.",
 	date: "Ange ett korrekt datum.",
@@ -14,8 +15,9 @@ $.extend($.validator.messages, {
 	number: "Ange ett korrekt nummer.",
 	digits: "Ange endast siffror.",
 	equalTo: "Ange samma v&auml;rde igen.",
-	range: $.validator.format("Ange ett v&auml;rde mellan {0} och {1}."),
-	max: $.validator.format("Ange ett v&auml;rde som &auml;r mindre eller lika med {0}."),
-	min: $.validator.format("Ange ett v&auml;rde som &auml;r st&ouml;rre eller lika med {0}."),
-	creditcard: "Ange ett korrekt kreditkortsnummer."
-});
+	range: $.validator.format( "Ange ett v&auml;rde mellan {0} och {1}." ),
+	max: $.validator.format( "Ange ett v&auml;rde som &auml;r mindre eller lika med {0}." ),
+	min: $.validator.format( "Ange ett v&auml;rde som &auml;r st&ouml;rre eller lika med {0}." ),
+	creditcard: "Ange ett korrekt kreditkortsnummer.",
+	pattern: "Ogiltigt format."
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_th.js b/civicrm/bower_components/jquery-validation/src/localization/messages_th.js
index 92a80ecca6..88c9927879 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_th.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_th.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: TH (Thai; ไทย)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "โปรดระบุ",
 	remote: "โปรดแก้ไขให้ถูกต้อง",
 	email: "โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",
 	equalTo: "โปรดระบุค่าเดิมอีกครั้ง",
 	extension: "โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",
-	maxlength: $.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),
-	minlength: $.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),
-	rangelength: $.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),
-	range: $.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),
-	max: $.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),
-	min: $.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")
-});
+	maxlength: $.validator.format( "โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ" ),
+	minlength: $.validator.format( "โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ" ),
+	rangelength: $.validator.format( "โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ" ),
+	range: $.validator.format( "โปรดระบุค่าระหว่าง {0} และ {1}" ),
+	max: $.validator.format( "โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}" ),
+	min: $.validator.format( "โปรดระบุค่ามากกว่าหรือเท่ากับ {0}" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_tj.js b/civicrm/bower_components/jquery-validation/src/localization/messages_tj.js
index 06b75bb0c5..4bbb4d2c4e 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_tj.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_tj.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: TJ (Tajikistan; Забони тоҷикӣ)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Ворид кардани ин филд маҷбури аст.",
 	remote: "Илтимос, маълумоти саҳеҳ ворид кунед.",
 	email: "Илтимос, почтаи электронии саҳеҳ ворид кунед.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.",
 	equalTo: "Илтимос, миқдори баробар ворид кунед.",
 	extension: "Илтимос, қофияи файлро дуруст интихоб кунед",
-	maxlength: $.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),
-	minlength: $.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),
-	rangelength: $.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),
-	range: $.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),
-	max: $.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),
-	min: $.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")
-});
+	maxlength: $.validator.format( "Илтимос, бештар аз {0} рамз ворид накунед." ),
+	minlength: $.validator.format( "Илтимос, камтар аз {0} рамз ворид накунед." ),
+	rangelength: $.validator.format( "Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед." ),
+	range: $.validator.format( "Илтимос, аз {0} то {1} рақам зиёд ворид кунед." ),
+	max: $.validator.format( "Илтимос, бештар аз {0} рақам ворид накунед." ),
+	min: $.validator.format( "Илтимос, камтар аз {0} рақам ворид накунед." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_tr.js b/civicrm/bower_components/jquery-validation/src/localization/messages_tr.js
index 38ea358597..1ca35e22cc 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_tr.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_tr.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: TR (Turkish; Türkçe)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Bu alanın doldurulması zorunludur.",
 	remote: "Lütfen bu alanı düzeltin.",
 	email: "Lütfen geçerli bir e-posta adresi giriniz.",
@@ -14,10 +14,11 @@ $.extend($.validator.messages, {
 	creditcard: "Lütfen geçerli bir kredi kartı giriniz.",
 	equalTo: "Lütfen aynı değeri tekrar giriniz.",
 	extension: "Lütfen geçerli uzantıya sahip bir değer giriniz.",
-	maxlength: $.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),
-	minlength: $.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),
-	rangelength: $.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),
-	range: $.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),
-	max: $.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),
-	min: $.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz.")
-});
+	maxlength: $.validator.format( "Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz." ),
+	minlength: $.validator.format( "Lütfen en az {0} karakter uzunluğunda bir değer giriniz." ),
+	rangelength: $.validator.format( "Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz." ),
+	range: $.validator.format( "Lütfen {0} ile {1} arasında bir değer giriniz." ),
+	max: $.validator.format( "Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz." ),
+	min: $.validator.format( "Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz." ),
+	require_from_group: $.validator.format( "Lütfen bu alanların en az {0} tanesini doldurunuz." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_uk.js b/civicrm/bower_components/jquery-validation/src/localization/messages_uk.js
index 21a510ef50..f6b69dd2ee 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_uk.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_uk.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: UK (Ukrainian; українська мова)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Це поле необхідно заповнити.",
 	remote: "Будь ласка, введіть правильне значення.",
 	email: "Будь ласка, введіть коректну адресу електронної пошти.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Будь ласка, введіть правильний номер кредитної карти.",
 	equalTo: "Будь ласка, введіть таке ж значення ще раз.",
 	extension: "Будь ласка, виберіть файл з правильним розширенням.",
-	maxlength: $.validator.format("Будь ласка, введіть не більше {0} символів."),
-	minlength: $.validator.format("Будь ласка, введіть не менше {0} символів."),
-	rangelength: $.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),
-	range: $.validator.format("Будь ласка, введіть число від {0} до {1}."),
-	max: $.validator.format("Будь ласка, введіть число, менше або рівно {0}."),
-	min: $.validator.format("Будь ласка, введіть число, більше або рівно {0}.")
-});
+	maxlength: $.validator.format( "Будь ласка, введіть не більше {0} символів." ),
+	minlength: $.validator.format( "Будь ласка, введіть не менше {0} символів." ),
+	rangelength: $.validator.format( "Будь ласка, введіть значення довжиною від {0} до {1} символів." ),
+	range: $.validator.format( "Будь ласка, введіть число від {0} до {1}." ),
+	max: $.validator.format( "Будь ласка, введіть число, менше або рівно {0}." ),
+	min: $.validator.format( "Будь ласка, введіть число, більше або рівно {0}." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_ur.js b/civicrm/bower_components/jquery-validation/src/localization/messages_ur.js
new file mode 100644
index 0000000000..2bde296274
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_ur.js
@@ -0,0 +1,23 @@
+/*
+ * Translated default messages for the jQuery validation plugin.
+ * Locale: UR (Urdu; اردو)
+ */
+$.extend( $.validator.messages, {
+	required: "ان معلومات کا اندراج ضروری ہے",
+	remote: "ان معلومات کا اندراج ضروری ہے",
+	email: "درج کی ہوئی ای میل درست نہیں ہے",
+	url: "درج کیا گیا پتہ درست نہیں ہے",
+	date: "درج کی گئی تاریخ درست نہیں ہے",
+	dateISO: "معیار کے مطابق نہیں ہے (ISO) درج کی گئی تاریخ",
+	number: "درج کیےگئے ہندسے درست نہیں ہیں",
+	digits: "صرف ہندسے اندراج کئے جاسکتے ہیں",
+	creditcard: "درج کیا گیا کارڈ نمبر درست نہیں ہے",
+	equalTo: "اندراج کا موازنہ درست نہیں ہے",
+	extension: "اندراج درست نہیں ہے",
+	maxlength: $.validator.format( "زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں" ),
+	minlength: $.validator.format( "کم سے کم {0} کا اندراج کرنا ضروری ہے" ),
+	rangelength: $.validator.format( "اندراج کا {0} اور {1}کے درمیان ہونا ضروری ہے" ),
+	range: $.validator.format( "اندراج کا {0} اور {1} کے درمیان ہونا ضروری ہے" ),
+	max: $.validator.format( "زیادہ سے زیادہ {0} کا اندراج کر سکتے ہیں" ),
+	min: $.validator.format( "کم سے کم {0} کا اندراج کرنا ضروری ہے" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_vi.js b/civicrm/bower_components/jquery-validation/src/localization/messages_vi.js
index 3f6427fa6b..f639ec855c 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_vi.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_vi.js
@@ -2,7 +2,7 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: VI (Vietnamese; Tiếng Việt)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "Hãy nhập.",
 	remote: "Hãy sửa cho đúng.",
 	email: "Hãy nhập email.",
@@ -14,10 +14,10 @@ $.extend($.validator.messages, {
 	creditcard: "Hãy nhập số thẻ tín dụng.",
 	equalTo: "Hãy nhập thêm lần nữa.",
 	extension: "Phần mở rộng không đúng.",
-	maxlength: $.validator.format("Hãy nhập từ {0} kí tự trở xuống."),
-	minlength: $.validator.format("Hãy nhập từ {0} kí tự trở lên."),
-	rangelength: $.validator.format("Hãy nhập từ {0} đến {1} kí tự."),
-	range: $.validator.format("Hãy nhập từ {0} đến {1}."),
-	max: $.validator.format("Hãy nhập từ {0} trở xuống."),
-	min: $.validator.format("Hãy nhập từ {1} trở lên.")
-});
+	maxlength: $.validator.format( "Hãy nhập từ {0} kí tự trở xuống." ),
+	minlength: $.validator.format( "Hãy nhập từ {0} kí tự trở lên." ),
+	rangelength: $.validator.format( "Hãy nhập từ {0} đến {1} kí tự." ),
+	range: $.validator.format( "Hãy nhập từ {0} đến {1}." ),
+	max: $.validator.format( "Hãy nhập từ {0} trở xuống." ),
+	min: $.validator.format( "Hãy nhập từ {0} trở lên." )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_zh.js b/civicrm/bower_components/jquery-validation/src/localization/messages_zh.js
index 61aa25228f..9c0d0c31da 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_zh.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_zh.js
@@ -2,22 +2,23 @@
  * Translated default messages for the jQuery validation plugin.
  * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
  */
-$.extend($.validator.messages, {
-	required: "必须填写",
-	remote: "请修正此栏位",
-	email: "请输入有效的电子邮件",
+$.extend( $.validator.messages, {
+	required: "这是必填字段",
+	remote: "请修正此字段",
+	email: "请输入有效的电子邮件地址",
 	url: "请输入有效的网址",
 	date: "请输入有效的日期",
 	dateISO: "请输入有效的日期 (YYYY-MM-DD)",
-	number: "请输入正确的数字",
-	digits: "只可输入数字",
+	number: "请输入有效的数字",
+	digits: "只能输入数字",
 	creditcard: "请输入有效的信用卡号码",
 	equalTo: "你的输入不相同",
 	extension: "请输入有效的后缀",
-	maxlength: $.validator.format("最多 {0} 个字"),
-	minlength: $.validator.format("最少 {0} 个字"),
-	rangelength: $.validator.format("请输入长度为 {0} 至 {1} 之間的字串"),
-	range: $.validator.format("请输入 {0} 至 {1} 之间的数值"),
-	max: $.validator.format("请输入不大于 {0} 的数值"),
-	min: $.validator.format("请输入不小于 {0} 的数值")
-});
+	maxlength: $.validator.format( "最多可以输入 {0} 个字符" ),
+	minlength: $.validator.format( "最少要输入 {0} 个字符" ),
+	rangelength: $.validator.format( "请输入长度在 {0} 到 {1} 之间的字符串" ),
+	range: $.validator.format( "请输入范围在 {0} 到 {1} 之间的数值" ),
+	step: $.validator.format( "请输入 {0} 的整数倍值" ),
+	max: $.validator.format( "请输入不大于 {0} 的数值" ),
+	min: $.validator.format( "请输入不小于 {0} 的数值" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/messages_zh_TW.js b/civicrm/bower_components/jquery-validation/src/localization/messages_zh_TW.js
index 8dcf32c124..638a5452eb 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/messages_zh_TW.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/messages_zh_TW.js
@@ -3,7 +3,7 @@
  * Locale: ZH (Chinese; 中文 (Zhōngwén), 汉语, 漢語)
  * Region: TW (Taiwan)
  */
-$.extend($.validator.messages, {
+$.extend( $.validator.messages, {
 	required: "必須填寫",
 	remote: "請修正此欄位",
 	email: "請輸入有效的電子郵件",
@@ -15,10 +15,11 @@ $.extend($.validator.messages, {
 	creditcard: "請輸入有效的信用卡號碼",
 	equalTo: "請重複輸入一次",
 	extension: "請輸入有效的後綴",
-	maxlength: $.validator.format("最多 {0} 個字"),
-	minlength: $.validator.format("最少 {0} 個字"),
-	rangelength: $.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),
-	range: $.validator.format("請輸入 {0} 至 {1} 之間的數值"),
-	max: $.validator.format("請輸入不大於 {0} 的數值"),
-	min: $.validator.format("請輸入不小於 {0} 的數值")
-});
+	maxlength: $.validator.format( "最多 {0} 個字" ),
+	minlength: $.validator.format( "最少 {0} 個字" ),
+	rangelength: $.validator.format( "請輸入長度為 {0} 至 {1} 之間的字串" ),
+	range: $.validator.format( "請輸入 {0} 至 {1} 之間的數值" ),
+	step: $.validator.format( "請輸入 {0} 的整數倍值" ),
+	max: $.validator.format( "請輸入不大於 {0} 的數值" ),
+	min: $.validator.format( "請輸入不小於 {0} 的數值" )
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/methods_de.js b/civicrm/bower_components/jquery-validation/src/localization/methods_de.js
index d06cc13852..018e4626fa 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/methods_de.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/methods_de.js
@@ -2,11 +2,11 @@
  * Localized default methods for the jQuery validation plugin.
  * Locale: DE
  */
-$.extend($.validator.methods, {
-	date: function(value, element) {
-		return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test( value );
 	},
-	number: function(value, element) {
-		return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
 	}
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/methods_es_CL.js b/civicrm/bower_components/jquery-validation/src/localization/methods_es_CL.js
index 4c94213267..7b853698ed 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/methods_es_CL.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/methods_es_CL.js
@@ -2,11 +2,11 @@
  * Localized default methods for the jQuery validation plugin.
  * Locale: ES_CL
  */
-$.extend($.validator.methods, {
-	date: function(value, element) {
-		return this.optional(element) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(value);
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value );
 	},
-	number: function(value, element) {
-		return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
 	}
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/methods_fi.js b/civicrm/bower_components/jquery-validation/src/localization/methods_fi.js
index 74d8265862..dc2a9b0060 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/methods_fi.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/methods_fi.js
@@ -2,11 +2,11 @@
  * Localized default methods for the jQuery validation plugin.
  * Locale: FI
  */
-$.extend($.validator.methods, {
-	date: function(value, element) {
-		return this.optional(element) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test(value);
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test( value );
 	},
-	number: function(value, element) {
-		return this.optional(element) || /^-?(?:\d+)(?:,\d+)?$/.test(value);
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+)(?:,\d+)?$/.test( value );
 	}
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/methods_it.js b/civicrm/bower_components/jquery-validation/src/localization/methods_it.js
new file mode 100644
index 0000000000..236615a342
--- /dev/null
+++ b/civicrm/bower_components/jquery-validation/src/localization/methods_it.js
@@ -0,0 +1,12 @@
+/*
+ * Localized default methods for the jQuery validation plugin.
+ * Locale: IT
+ */
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
+	}
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/methods_nl.js b/civicrm/bower_components/jquery-validation/src/localization/methods_nl.js
index 6a08b20be3..0a48865600 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/methods_nl.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/methods_nl.js
@@ -2,8 +2,11 @@
  * Localized default methods for the jQuery validation plugin.
  * Locale: NL
  */
-$.extend($.validator.methods, {
-	date: function(value, element) {
-		return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test( value );
+	},
+	number: function( value, element ) {
+		return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test( value );
 	}
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/src/localization/methods_pt.js b/civicrm/bower_components/jquery-validation/src/localization/methods_pt.js
index 092eb852bd..1d6a534d18 100644
--- a/civicrm/bower_components/jquery-validation/src/localization/methods_pt.js
+++ b/civicrm/bower_components/jquery-validation/src/localization/methods_pt.js
@@ -2,8 +2,8 @@
  * Localized default methods for the jQuery validation plugin.
  * Locale: PT_BR
  */
-$.extend($.validator.methods, {
-	date: function(value, element) {
-		return this.optional(element) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(value);
+$.extend( $.validator.methods, {
+	date: function( value, element ) {
+		return this.optional( element ) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test( value );
 	}
-});
+} );
diff --git a/civicrm/bower_components/jquery-validation/validation.jquery.json b/civicrm/bower_components/jquery-validation/validation.jquery.json
index afe6fd354f..1ef98d4df4 100644
--- a/civicrm/bower_components/jquery-validation/validation.jquery.json
+++ b/civicrm/bower_components/jquery-validation/validation.jquery.json
@@ -18,12 +18,12 @@
 			"url": "http://www.opensource.org/licenses/MIT"
 		}
 	],
-	"bugs": "https://github.com/jzaefferer/jquery-validation/issues",
-	"homepage": "https://github.com/jzaefferer/jquery-validation",
-	"docs": "http://docs.jquery.com/Plugins/Validation",
-	"download": "https://github.com/jzaefferer/jquery-validation/releases",
+	"bugs": "https://github.com/jquery-validation/jquery-validation/issues",
+	"homepage": "https://github.com/jquery-validation/jquery-validation",
+	"docs": "http://jqueryvalidation.org/documentation/",
+	"download": "https://github.com/jquery-validation/jquery-validation/releases",
 	"dependencies": {
 		"jquery": ">=1.4.4"
 	},
-	"version": "1.13.1"
+	"version": "1.19.1"
 }
diff --git a/civicrm/civicrm-version.php b/civicrm/civicrm-version.php
index 0281ec155a..d26129db05 100644
--- a/civicrm/civicrm-version.php
+++ b/civicrm/civicrm-version.php
@@ -1,7 +1,7 @@
 <?php
 /** @deprecated */
 function civicrmVersion( ) {
-  return array( 'version'  => '5.24.6',
+  return array( 'version'  => '5.25.0',
                 'cms'      => 'Wordpress',
                 'revision' => '' );
 }
diff --git a/civicrm/composer.json b/civicrm/composer.json
index 7204849125..4ac9ffb0e3 100644
--- a/civicrm/composer.json
+++ b/civicrm/composer.json
@@ -38,11 +38,11 @@
   "include-path": ["vendor/tecnickcom"],
   "config": {
     "platform": {
-      "php": "7.0.10"
+      "php": "7.1"
     }
   },
   "require": {
-    "php": "~7.0",
+    "php": "~7.1",
     "cache/integration-tests": "~0.16.0",
     "dompdf/dompdf" : "0.8.*",
     "electrolinux/phpquery": "^0.9.6",
@@ -70,7 +70,7 @@
     "psr/simple-cache": "~1.0.1",
     "cweagans/composer-patches": "~1.0",
     "pear/log": "1.13.1",
-    "katzien/php-mime-type": "2.1.0",
+    "adrienrn/php-mimetyper": "0.2.2",
     "civicrm/composer-downloads-plugin": "^2.0",
     "league/csv": "^9.2",
     "tplaner/when": "~3.0.0",
@@ -210,7 +210,7 @@
         "url": "https://github.com/components/jqueryui/archive/1.12.1.zip"
       },
       "jquery-validation": {
-        "url": "https://github.com/jquery-validation/jquery-validation/archive/1.13.1.zip",
+        "url": "https://github.com/jquery-validation/jquery-validation/archive/1.19.1.zip",
         "ignore": [".*", "node_modules", "bower_components", "test", "demo", "lib"]
       },
       "jstree": {
@@ -242,6 +242,9 @@
         "Support PHPUnit 6+": "https://github.com/php-cache/integration-tests/commit/1ec7362962185df91d3d749bc3fa7e7b99cb9fc7.patch",
         "Add tests for binary data round trip": "https://github.com/php-cache/integration-tests/commit/89cd7068e83aa776774bfc44f6bcba858c085616.patch"
       },
+      "pear/mail": {
+        "Apply CiviCRM Customisations for CRM-1367 and CRM-5946": "https://raw.githubusercontent.com/civicrm/civicrm-core/36319938a5bf26c1e7e2110a26a65db6a5979268/tools/scripts/composer/patches/pear-mail.patch"
+      },
       "pear/net_smtp": {
         "Add in CiviCRM custom error message for CRM-8744": "https://raw.githubusercontent.com/civicrm/civicrm-core/a6a0ff13d2a155ad962529595dceaef728116f96/tools/scripts/composer/patches/net-smtp-patch.patch"
       },
diff --git a/civicrm/composer.lock b/civicrm/composer.lock
index 0ffececa0c..42f872a30d 100644
--- a/civicrm/composer.lock
+++ b/civicrm/composer.lock
@@ -4,8 +4,44 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "817c0b9d2626eeebf85dd0e402ac0534",
+    "content-hash": "00d8b8be8e838f8ff098162f88af562c",
     "packages": [
+        {
+            "name": "adrienrn/php-mimetyper",
+            "version": "0.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/adrienrn/php-mimetyper.git",
+                "reference": "702e00a604b4baed34d69730ce055e05c0f43932"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/adrienrn/php-mimetyper/zipball/702e00a604b4baed34d69730ce055e05c0f43932",
+                "reference": "702e00a604b4baed34d69730ce055e05c0f43932",
+                "shasum": ""
+            },
+            "require": {
+                "dflydev/apache-mime-types": "^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MimeTyper\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Hussard",
+                    "email": "adrien.ricartnoblet@gmail.com"
+                }
+            ],
+            "description": "PHP mime type and extension mapping library: compatible with Symfony, powered by jshttp/mime-db",
+            "time": "2018-09-27T09:45:05+00:00"
+        },
         {
             "name": "cache/integration-tests",
             "version": "0.16.0",
@@ -259,6 +295,61 @@
             "description": "Provides a way to patch Composer packages.",
             "time": "2018-05-11T18:00:16+00:00"
         },
+        {
+            "name": "dflydev/apache-mime-types",
+            "version": "v1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dflydev/dflydev-apache-mime-types.git",
+                "reference": "f30a57e59b7476e4c5270b6a0727d79c9c0eb861"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dflydev/dflydev-apache-mime-types/zipball/f30a57e59b7476e4c5270b6a0727d79c9c0eb861",
+                "reference": "f30a57e59b7476e4c5270b6a0727d79c9c0eb861",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "twig/twig": "1.*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Dflydev\\ApacheMimeTypes": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Dragonfly Development Inc.",
+                    "email": "info@dflydev.com",
+                    "homepage": "http://dflydev.com"
+                },
+                {
+                    "name": "Beau Simensen",
+                    "email": "beau@dflydev.com",
+                    "homepage": "http://beausimensen.com"
+                }
+            ],
+            "description": "Apache MIME Types",
+            "keywords": [
+                "apache",
+                "mime",
+                "mimetypes"
+            ],
+            "time": "2013-05-14T02:02:01+00:00"
+        },
         {
             "name": "dompdf/dompdf",
             "version": "v0.8.3",
@@ -546,51 +637,6 @@
             ],
             "time": "2017-03-20T17:10:46+00:00"
         },
-        {
-            "name": "katzien/php-mime-type",
-            "version": "2.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/katzien/PhpMimeType.git",
-                "reference": "159dfbdcd5906442f3dad89951127f0b9dfa3b78"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/katzien/PhpMimeType/zipball/159dfbdcd5906442f3dad89951127f0b9dfa3b78",
-                "reference": "159dfbdcd5906442f3dad89951127f0b9dfa3b78",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "5.*",
-                "satooshi/php-coveralls": "1.*"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "MimeType\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Kat Zien"
-                }
-            ],
-            "description": "A PHP library to detect the mime type of files.",
-            "homepage": "https://github.com/katzien/PhpMimeType",
-            "keywords": [
-                "mimetype",
-                "php"
-            ],
-            "abandoned": true,
-            "time": "2017-03-23T02:05:33+00:00"
-        },
         {
             "name": "league/csv",
             "version": "9.2.1",
@@ -920,6 +966,11 @@
                 "pear/net_smtp": "Install optionally via your project's composer.json"
             },
             "type": "library",
+            "extra": {
+                "patches_applied": {
+                    "Apply CiviCRM Customisations for CRM-1367 and CRM-5946": "https://raw.githubusercontent.com/civicrm/civicrm-core/36319938a5bf26c1e7e2110a26a65db6a5979268/tools/scripts/composer/patches/pear-mail.patch"
+                }
+            },
             "autoload": {
                 "psr-0": {
                     "Mail": "./"
@@ -2715,10 +2766,10 @@
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {
-        "php": "~7.0"
+        "php": "~7.1"
     },
     "platform-dev": [],
     "platform-overrides": {
-        "php": "7.0.10"
+        "php": "7.1"
     }
 }
diff --git a/civicrm/ext/sequentialcreditnotes/sequentialcreditnotes.civix.php b/civicrm/ext/sequentialcreditnotes/sequentialcreditnotes.civix.php
index 0b17d88b11..09228ba9d6 100644
--- a/civicrm/ext/sequentialcreditnotes/sequentialcreditnotes.civix.php
+++ b/civicrm/ext/sequentialcreditnotes/sequentialcreditnotes.civix.php
@@ -386,7 +386,7 @@ function _sequentialcreditnotes_civix_insert_navigation_menu(&$menu, $path, $ite
   if (empty($path)) {
     $menu[] = [
       'attributes' => array_merge([
-        'label'      => CRM_Utils_Array::value('name', $item),
+        'label'      => $item['name'] ?? NULL,
         'active'     => 1,
       ], $item),
     ];
diff --git a/civicrm/extern/url.php b/civicrm/extern/url.php
index 5254a59743..2627f4f013 100644
--- a/civicrm/extern/url.php
+++ b/civicrm/extern/url.php
@@ -9,12 +9,12 @@ CRM_Core_Config::singleton();
 // To keep backward compatibility for URLs generated
 // by CiviCRM < 1.7, we check for the q variable as well.
 if (isset($_GET['qid'])) {
-  $queue_id = CRM_Utils_Array::value('qid', $_GET);
+  $queue_id = $_GET['qid'] ?? NULL;
 }
 else {
-  $queue_id = CRM_Utils_Array::value('q', $_GET);
+  $queue_id = $_GET['q'] ?? NULL;
 }
-$url_id = CRM_Utils_Array::value('u', $_GET);
+$url_id = $_GET['u'] ?? NULL;
 
 if (!$url_id) {
   echo "Missing input parameters\n";
diff --git a/civicrm/install/civicrm.php b/civicrm/install/civicrm.php
index 3bd68119aa..0932b1902b 100644
--- a/civicrm/install/civicrm.php
+++ b/civicrm/install/civicrm.php
@@ -67,7 +67,7 @@ function civicrm_main(&$config) {
   global $sqlPath, $crmPath, $cmsPath, $installType;
 
   if ($installType == 'drupal') {
-    $siteDir = isset($config['site_dir']) ? $config['site_dir'] : getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']);
+    $siteDir = $config['site_dir'] ?? getSiteDir($cmsPath, $_SERVER['SCRIPT_FILENAME']);
     civicrm_setup($cmsPath . DIRECTORY_SEPARATOR . 'sites' . DIRECTORY_SEPARATOR . $siteDir . DIRECTORY_SEPARATOR . 'files'
     );
   }
@@ -212,7 +212,7 @@ function civicrm_config(&$config) {
     'dbName' => addslashes($config['mysql']['database']),
   );
 
-  $params['baseURL'] = isset($config['base_url']) ? $config['base_url'] : civicrm_cms_base();
+  $params['baseURL'] = $config['base_url'] ?? civicrm_cms_base();
   if ($installType == 'drupal' && defined('VERSION')) {
     if (version_compare(VERSION, '8.0') >= 0) {
       $params['cms'] = 'Drupal';
diff --git a/civicrm/install/index.php b/civicrm/install/index.php
index 57446cd85d..49cf011ca4 100644
--- a/civicrm/install/index.php
+++ b/civicrm/install/index.php
@@ -129,7 +129,7 @@ $installTypeToUF = array(
   'backdrop' => 'Backdrop',
 );
 
-$uf = (isset($installTypeToUF[$installType]) ? $installTypeToUF[$installType] : 'Drupal');
+$uf = ($installTypeToUF[$installType] ?? 'Drupal');
 define('CIVICRM_UF', $uf);
 
 // Set the Locale (required by CRM_Core_Config)
@@ -151,7 +151,7 @@ if (isset($_REQUEST['seedLanguage']) and isset($langs[$_REQUEST['seedLanguage']]
   $tsLocale = $_REQUEST['seedLanguage'];
 }
 
-$config = CRM_Core_Config::singleton(FALSE);
+CRM_Core_Config::singleton(FALSE);
 $GLOBALS['civicrm_default_error_scope'] = NULL;
 
 // The translation files are in the parent directory (l10n)
@@ -522,7 +522,7 @@ class InstallRequirements {
           )
         );
       }
-      $onlyRequire = ($dbName == 'Drupal' || $dbName == 'Backdrop') ? TRUE : FALSE;
+      $onlyRequire = $dbName == 'Drupal' || $dbName == 'Backdrop';
       $this->requireDatabaseOrCreatePermissions(
         $databaseConfig['server'],
         $databaseConfig['username'],
@@ -909,7 +909,7 @@ class InstallRequirements {
         $testDetails[2] = ts('This webserver is running an outdated version of PHP (%1). It is strongly recommended to upgrade to PHP %2 or later, as older versions can present a security risk. The preferred version is %3.', array(
           1 => $phpVersion,
           2 => CRM_Upgrade_Incremental_General::MIN_RECOMMENDED_PHP_VER,
-          3 => CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER,
+          3 => preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', CRM_Upgrade_Incremental_General::RECOMMENDED_PHP_VER),
         ));
         $this->warning($testDetails);
       }
@@ -1921,7 +1921,7 @@ function getSiteDir($cmsPath, $str) {
     preg_quote($modules, CIVICRM_DIRECTORY_SEPARATOR) . "/",
     $_SERVER['SCRIPT_FILENAME'], $matches
   );
-  $siteDir = isset($matches[1]) ? $matches[1] : 'default';
+  $siteDir = $matches[1] ?? 'default';
 
   if (strtolower($siteDir) == 'all') {
     // For this case - use drupal's way of finding out multi-site directory
diff --git a/civicrm/release-notes.md b/civicrm/release-notes.md
index 9527e5e090..a8dc357986 100644
--- a/civicrm/release-notes.md
+++ b/civicrm/release-notes.md
@@ -15,6 +15,17 @@ Other resources for identifying changes are:
     * https://github.com/civicrm/civicrm-joomla
     * https://github.com/civicrm/civicrm-wordpress
 
+## CiviCRM 5.25.0
+
+Released May 6, 2020
+
+- **[Synopsis](release-notes/5.25.0.md#synopsis)**
+- **[Features](release-notes/5.25.0.md#features)**
+- **[Bugs resolved](release-notes/5.25.0.md#bugs)**
+- **[Miscellany](release-notes/5.25.0.md#misc)**
+- **[Credits](release-notes/5.25.0.md#credits)**
+- **[Feedback](release-notes/5.25.0.md#feedback)**
+
 ## CiviCRM 5.24.6
 
 Released April 30, 2020
diff --git a/civicrm/release-notes/5.25.0.md b/civicrm/release-notes/5.25.0.md
new file mode 100644
index 0000000000..90803f5bcd
--- /dev/null
+++ b/civicrm/release-notes/5.25.0.md
@@ -0,0 +1,844 @@
+# CiviCRM 5.25.0
+
+Released May 6, 2020
+
+- **[Synopsis](#synopsis)**
+- **[Features](#features)**
+- **[Bugs resolved](#bugs)**
+- **[Miscellany](#misc)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?*                                         |         |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities?                                   |   no    |
+| Change the database schema?                                     | **yes** |
+| Alter the API?                                                  | **yes** |
+| Require attention to configuration options?                     |   no    |
+| Fix problems installing or upgrading to a previous version?     | **yes** |
+| Introduce features?                                             | **yes** |
+| Fix bugs?                                                       | **yes** |
+
+## <a name="features"></a>Features
+
+### Core CiviCRM
+
+- **End of life plans for php 7.0 & deprecate php 7.1
+  ([dev/core#1528](https://lab.civicrm.org/dev/core/issues/1528):
+  [16753](https://github.com/civicrm/civicrm-core/pull/16753),
+  [599](https://github.com/civicrm/civicrm-drupal/pull/599),
+  [598](https://github.com/civicrm/civicrm-drupal/pull/598),
+  [111](https://github.com/civicrm/civicrm-backdrop/pull/111),
+  [16678](https://github.com/civicrm/civicrm-core/pull/16678),
+  [114](https://github.com/civicrm/civicrm-backdrop/pull/114),
+  [187](https://github.com/civicrm/civicrm-wordpress/pull/187) and
+  [184](https://github.com/civicrm/civicrm-wordpress/pull/184))**
+
+  CiviCRM now requires PHP 7.1 at a minimum and recommends PHP 7.3.
+
+  In the process of making this change, the minimum PHP version is now stored in
+  a single place within the core codebase.  CMS-specific files have this value,
+  too, but tests enforce that it be the same as the single core value.
+
+- **Replace jcalendar instances with datepicker (Continued
+  Work [dev/core#561](https://lab.civicrm.org/dev/core/issues/561):
+  [15709](https://github.com/civicrm/civicrm-core/pull/15709) and
+  [16863](https://github.com/civicrm/civicrm-core/pull/16863))**
+
+  These changes continue work to move to datepicker from jcalendar by converting
+  report instances from using the legacy jcalendar to using datepicker for date
+  fields and deprecating the `addDateRange` function used by jcalendar.
+
+- **APIv4 - Add Dashboard & DashboardContact entities
+  ([16867](https://github.com/civicrm/civicrm-core/pull/16867))**
+
+  Adds APIv4 support for Dashboard & DashboardContact and does some cleanup in
+  the BAO and API layers for improved consistency.
+
+- **Add new language, `nl_BE`
+  ([17014](https://github.com/civicrm/civicrm-core/pull/17014))**
+
+  Adds a new translation option for "Dutch (Belgium)".
+
+- **Add hook to alter display value or Custom field value
+  ([16921](https://github.com/civicrm/civicrm-core/pull/16921))**
+
+  The new hook
+  [`hook_civicrm_alterCustomFieldDisplayValue()`](https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterCustomFieldDisplayValue/)
+  allows modification of the displayed value for a custom field value.
+
+- **APIv4 query improvements (Work towards
+  [dev/report#31](https://lab.civicrm.org/dev/report/issues/31):
+  [16917](https://github.com/civicrm/civicrm-core/pull/16917) and
+  [16947](https://github.com/civicrm/civicrm-core/pull/16947))**
+
+  This change builds out the APIv4 framework to support `GROUP BY` and different
+  types of expressions in clauses that previously only accepted the names of
+  fields. These expressions can now include numbers, `NULL`, strings, and
+  whitelisted SQL functions. The framework can in theory handle most SQL
+  functions, but this first PR adds support for the aggregate functions `AVG`,
+  `COUNT`, `MAX`, `MIN`, and `SUM`.
+
+- **install/index.php - Fix leak which breaks compatibility with current Backdrop
+  ([#17249](https://github.com/civicrm/civicrm-core/pull/17249))**
+
+### CiviContribute
+
+- **Partial Refunds (Work towards
+  [dev/financial#87](https://lab.civicrm.org/dev/financial/issues/87):
+  [16480](https://github.com/civicrm/civicrm-core/pull/16480))**
+
+  The "Add Payment" form is altered to permit payments to be added even if a
+  contribution is fully paid.
+
+- **Add privacy fields to Contribution Detail report
+  ([16674](https://github.com/civicrm/civicrm-core/pull/16674))**
+
+   Columns for the following fields are added to the contribution detail report:
+   "Do Not Phone", "Do Not Mail", "Do Not SMS", "Do Not Trade".
+
+ - **Add "pledge id" as column and filter in Contribution Detail report.
+   ([16868](https://github.com/civicrm/civicrm-core/pull/16868))**
+
+   This change improves the Contribution Detail Report by adding "pledge id" as
+   a filter and column.
+
+### CiviEvent
+
+- **Remove additional display of buttons for events
+  ([16550](https://github.com/civicrm/civicrm-core/pull/16550))**
+
+  When viewing an event registration, this removes the Record Payment button
+  from the Fees section.  Payments can still be recorded from the payments
+  section.
+
+### WordPress Integration
+
+- **Merge REST API wrapper code
+  ([160](https://github.com/civicrm/civicrm-wordpress/pull/160))**
+
+  This merges the CiviCRM WP REST API Wrapper plugin's code into the core
+  WordPress integration.  The result is that there are now native WordPress REST
+  endpoints for the REST API, email tracking, and other endpoints that had been
+  direct links to PHP files in the `extern` folder of the CiviCRM plugin.
+
+- **Add shortcodes for Personal Campaign Pages
+  ([185](https://github.com/civicrm/civicrm-wordpress/pull/185) and
+  [16695](https://github.com/civicrm/civicrm-core/pull/16695))**
+
+  Personal Campaign Pages are now available as a shortcode.
+
+## <a name="bugs"></a>Bugs resolved
+
+### Core CiviCRM
+
+- **Activity Detail report gives syntax error with force=1 if include case
+  activities is on
+  ([dev/core#1710](https://lab.civicrm.org/dev/core/issues/1710):
+  [17128](https://github.com/civicrm/civicrm-core/pull/17128))**
+
+  The case activity table wasn't properly loaded when the Activity Detail report
+  including case activities would go straight to displaying results.
+
+- **Search Builder - Activity Type search not working.
+  ([dev/core#1714](https://lab.civicrm.org/dev/core/issues/1714):
+  [17215](https://github.com/civicrm/civicrm-core/pull/17215))**
+
+  In Search Builder, searching by activity type would return no results,
+  affecting not only direct searches but also smart groups that built with
+  Search Builder.  This resolves the regression, which first appeared in 5.24.3.
+
+- **Deleting entities leaves obsolete EntityTag records
+  ([dev/core#667](https://lab.civicrm.org/dev/core/issues/667):
+  [16832](https://github.com/civicrm/civicrm-core/pull/16832))**
+
+  Fixes a bug where deleting a contact does not delete tags associated with the
+  contact.
+
+- **Profile Public Title (frontend_title column) is not used in profile
+  create/edit mode
+  ([dev/core#1683](https://lab.civicrm.org/dev/core/issues/1683):
+  [16945](https://github.com/civicrm/civicrm-core/pull/16945))**
+
+  The Public Title setting that was recently added for profiles would only
+  replace the profile name on contribution and event forms.  When the profile
+  was used in a standalone context, the name would always appear.
+
+- **Auto-complete search results not consistent with other searches
+  ([dev/core#787](https://lab.civicrm.org/dev/core/issues/787):
+  [13809](https://github.com/civicrm/civicrm-core/pull/13809))**
+
+- **Need to Increase Data Size for `form_values` column on
+  civicrm_report_instance table
+  ([dev/core#1569](https://lab.civicrm.org/dev/core/issues/1569):
+  [16836](https://github.com/civicrm/civicrm-core/pull/16836))**
+
+  This hanges the data type for the `form_values` column on the
+  `civicrm_report_instance` from TEXT to LONGTEXT.
+
+- **PHP warning on Add relationship form
+  ([dev/core#1663](https://lab.civicrm.org/dev/core/issues/1663):
+  [16845](https://github.com/civicrm/civicrm-core/pull/16845) and
+  [16941](https://github.com/civicrm/civicrm-core/pull/16941))**
+
+- **Removing all the dashlets from the dashboard leads to E_NOTICE
+  ([dev/core#1668](https://lab.civicrm.org/dev/core/issues/1668):
+  [16883](https://github.com/civicrm/civicrm-core/pull/16883))**
+
+- **Regression: Api4 causes container being rebuild on every request
+  ([dev/core#1674](https://lab.civicrm.org/dev/core/issues/1674):
+  [16919](https://github.com/civicrm/civicrm-core/pull/16919))**
+
+- **E_NOTICE when using the New Individual popup/profile
+  ([dev/core#1676](https://lab.civicrm.org/dev/core/issues/1676):
+  [16924](https://github.com/civicrm/civicrm-core/pull/16924))**
+
+- **[regression] CiviCRM reports that smart groups won't work due to deleted
+  custom fields that aren't deleted
+  ([dev/core#1688](https://lab.civicrm.org/dev/core/issues/1688):
+  [16961](https://github.com/civicrm/civicrm-core/pull/16961))**
+
+  A system check would mistakenly report that a smart group was based upon a
+  deleted custom field if it was based upon a checkbox or multi-select custom
+  field.
+
+- **Fix checking permissions in api3 profile get
+  ([16848](https://github.com/civicrm/civicrm-core/pull/16848))**
+
+  This resolves a bug where the API would reverse the value of the option to use
+  a current user's permissions when retrieving the list of fields in a profile.
+
+- **APIv4 - convert Result object to array when running through json_encode
+  ([16828](https://github.com/civicrm/civicrm-core/pull/16828))**
+
+- **Api4 AJAX endpoint: change required permission to access AJAX API.
+  ([16705](https://github.com/civicrm/civicrm-core/pull/16705) and
+  [17241](https://github.com/civicrm/civicrm-core/pull/17241))**
+
+  The APIv4 AJAX endpoint is now open to users with either the Access CiviCRM or
+  the Access AJAX API permissions, matching the APIv3 behavior.
+
+- **Improvements to APIv4 select query
+  ([16889](https://github.com/civicrm/civicrm-core/pull/16889) and
+  [16900](https://github.com/civicrm/civicrm-core/pull/16900))**
+
+- **APIv4 - Don't advertise implicit multi-joins in Explorer
+  ([17205](https://github.com/civicrm/civicrm-core/pull/17205))**
+
+  Implicit one-to-many joins in APIv4 have been problematic and may get removed.
+  As a soft deprecation, these are no longer displayed in the APIv4 explorer.
+
+- **CRM_Core_I18n - Provide a better label for new/unknown locales
+  ([17021](https://github.com/civicrm/civicrm-core/pull/17021))**
+
+  If CiviCRM finds a locale in the localization files but doesn't know what it
+  is, it will now display the locale code instead of just a blank option.
+
+- **Fixed fatal error for class not found when managed hook is invoked during
+  upgrade ([17004](https://github.com/civicrm/civicrm-core/pull/17004))**
+
+- **Log error message instead of throwing exception
+  ([16880](https://github.com/civicrm/civicrm-core/pull/16880))**
+
+- **Remove instances of fatal
+  ([16759](https://github.com/civicrm/civicrm-core/pull/16759))**
+
+  This throws exceptions rather than dying when encountering problems creating
+  contacts.
+
+- **Fix bug where a % in a serialized array can lead to the data being broken
+  ([16694](https://github.com/civicrm/civicrm-core/pull/16694))**
+
+- **Fix batch contact/activity update with radio options
+  ([16855](https://github.com/civicrm/civicrm-core/pull/16855))**
+
+  This fixes a failure to copy the value down a column if the field is radio
+  buttons and the value in the first row contains a space.
+
+- **Fix CustomDataView.tpl plain empty memo field.
+  ([16839](https://github.com/civicrm/civicrm-core/pull/16839))**
+
+  Ensure note custom fields display on their own lines
+
+- **Fix setting outBound_option readonly in UI
+  ([16774](https://github.com/civicrm/civicrm-core/pull/16774))**
+
+  If the outbound mailer option is set via the settings file, the settings form
+  will now disable the field.
+
+- **Use dbAlias to generate where clause for date field in activity report
+  ([16689](https://github.com/civicrm/civicrm-core/pull/16689))**
+
+  This resolves potentially ambiguous queries in the Activity Summary and Detail
+  reports if the activity table is joined again in the report.
+
+- **[REF] Use composer patches to apply CiviCRM Customisations for CRM-1367 and
+  CRM-5946 ([16870](https://github.com/civicrm/civicrm-core/pull/16870))**
+
+  Migrates the patching of pear_mail from a script file to using composer
+  patches to ensure CiviCRM customisations for CRM-1367 and CRM-5946 are applied
+  consistently.
+
+### CiviCase
+
+- **Various errors recorded in log message on Manage Case screen -> relationship
+  tab. ([dev/core#1664](https://lab.civicrm.org/dev/core/issues/1664):
+  [16846](https://github.com/civicrm/civicrm-core/pull/16846))**
+
+  Fixes log messages generated when opening the relationship tab on the Manage
+  Case form.
+
+- **"Merge Case" modal not showing relevant cases
+  ([dev/core#1646](https://lab.civicrm.org/dev/core/issues/1646):
+  [16798](https://github.com/civicrm/civicrm-core/pull/16798))**
+
+  The pop-up to merge cases would only show 25 other cases.  It now shows all
+  cases for a client.
+
+- **Adding a timeline to a case doesn't get the last activity in the timeline
+  right ([dev/core#1675](https://lab.civicrm.org/dev/core/issues/1675) and
+  [dev/core#1695](https://lab.civicrm.org/dev/core/issues/1695):
+  [289](https://github.com/civicrm/civicrm-packages/pull/289))**
+
+  Ensures case custom fields are saved when submitted via Drupal webform.
+  Additionally ensures that the last activity in the case timeline is set
+  correctly.
+
+- **Check for "Change Case Type" in case activity form doesn't do anything
+  ([dev/core#1652](https://lab.civicrm.org/dev/core/issues/1652):
+  [16785](https://github.com/civicrm/civicrm-core/pull/16785))**
+
+- **When auditing cases on non-English deployments, richtext details
+  are incorrectly escaped
+  ([16659](https://github.com/civicrm/civicrm-core/pull/16659))**
+
+- **Respect 'Do not notify activity type' setting
+  ([16800](https://github.com/civicrm/civicrm-core/pull/16800))**
+
+  The setting to not notify assignees for certain activity types was not
+  respected when submitting an activity from a case.
+
+### CiviContribute
+
+- **Changes to "CiviContribute Component Settings" not saved
+  ([dev/core#1724](https://lab.civicrm.org/dev/core/issues/1724):
+  [17188](https://github.com/civicrm/civicrm-core/pull/17188))**
+
+  The way that CiviContribute component settings were stored was updated for
+  5.23, but the transition during the upgrade was problematic.  This replaces
+  the transition code, resolving issues for sites upgrading directly from 5.22.x
+  or earlier.  Sites on 5.23.x or 5.24.x should review their settings, however.
+
+- **Invoice action not shown when invoicing enabled
+  ([17164](https://github.com/civicrm/civicrm-core/pull/17164))**
+
+  The "Invoices - print or email" action was not available for contribution
+  search results even when invoicing was enabled.
+
+- **Cumulative contributions not being calculated with the correct criteria
+  ([dev/core#1740](https://lab.civicrm.org/dev/core/issues/1740):
+  [17237](https://github.com/civicrm/civicrm-core/pull/17237))**
+
+  The cumulative contributions display from a contribution page would needlessly
+  filter contributions by date, with the end date being midnight on the current
+  date.  That would exclude contributions received on the current day.
+
+- **Updating misleading labels on buttons to confirmation pages
+  ([dev/core#1613](https://lab.civicrm.org/dev/core/issues/1613):
+  [16651](https://github.com/civicrm/civicrm-core/pull/16651))**
+
+  Some donors and event registrants interpreted the button text "Confirm
+  Contribution" (on contribution pages) and "Continue" (on event registration
+  pages) to mean that this would complete the contribution or registration.  In
+  fact, these would only appear when a confirmation page is used.
+
+  The button text now appears as "Review your contribution" and "Review your
+  registration", respectively.
+
+- **Fix upgrade failure. Thin-out activation logic for `sequentialcreditnotes`.
+  ([16971](https://github.com/civicrm/civicrm-core/pull/16971) following
+  [dev/financial#84](https://lab.civicrm.org/dev/financial/issues/84))**
+
+  This change fixes an issue for some builds when upgrading caused by the
+  activation of the `sequentialcreditnotes` extension to replace core code that
+  generates sequential credit note identifiers.
+
+- **Fix Bug where Payment Balance is sometimes miscalculated
+  ([16546](https://github.com/civicrm/civicrm-core/pull/16546))**
+
+  Fixes a bug where Add Refund is displayed instead of Add Payment on partially
+  paid event contributions.
+
+- **Stop overwriting contact name with PayPal name
+  ([CRM-20553](https://issues.civicrm.org/jira/browse/CRM-20553): [14667](https://github.com/civicrm/civicrm-core/pull/14667))**
+
+  When a user creates a donation via PayPal, their CiviCRM contact name should
+  not be overwritten to be their PayPal account name.
+
+- **Fix use of "Soft Credit Amount Stats" and any filter of contribution…
+  ([16591](https://github.com/civicrm/civicrm-core/pull/16591))**
+
+  Ensures that one can use "Soft Credit Amount Stats" with all filters.
+
+- **CRM_Core_Payment_PayPalProIPN should not call getPayPalPaymentProcessorID()
+  if processor_id is clearly provided in URL
+  ([dev/core#1579](https://lab.civicrm.org/dev/core/issues/1579):
+  [16479](https://github.com/civicrm/civicrm-core/pull/16479))**
+
+- **Update pending contribution status action also send email without warning
+  ([dev/core#1640](https://lab.civicrm.org/dev/core/issues/1640):
+  [16742](https://github.com/civicrm/civicrm-core/pull/16742))**]
+
+  When bulk updating the status of contributions, there is now a checkbox to
+  choose whether the contacts should be emailed.  Previously, emails would be
+  generated without warning.
+
+- **Fix display of payment processor title in cancelSubscription form
+  ([16857](https://github.com/civicrm/civicrm-core/pull/16857))**
+
+- **Make the checkbox, "Billing address is the same", respond to the change event
+  ([16496](https://github.com/civicrm/civicrm-core/pull/16496))**
+
+  This makes the "billing address is the same" checkbox trigger its changes no
+  matter how the box is checked, not just by clicking it.
+
+### CiviEvent
+
+- **PayPal Express Checkout fails on events
+  ([dev/financial#119](https://lab.civicrm.org/dev/financial/issues/119):
+  [16692](https://github.com/civicrm/civicrm-core/pull/16692))**
+
+- **Fixed fatal error for Event Participants custom search if price set field
+  option is disabled after a registrant has already selected it
+  ([16894](https://github.com/civicrm/civicrm-core/pull/16894))**
+
+### CiviMember
+
+- **Don't freeze fields for auto-renew memberships
+  ([dev/core#1331](https://lab.civicrm.org/dev/core/issues/1331):
+  [16609](https://github.com/civicrm/civicrm-core/pull/16609) and
+  [16881](https://github.com/civicrm/civicrm-core/pull/16881))**
+
+  Previously, many membership fields were frozen for administrators when the
+  membership was set to auto-renew with a recurring contribution.
+
+- **Deceased Contact via Inline doesn't update the Membership's status to
+  Deceased ([dev/core#1599](https://lab.civicrm.org/dev/core/issues/1599):
+  [16724](https://github.com/civicrm/civicrm-core/pull/16724) and
+  [16787](https://github.com/civicrm/civicrm-core/pull/16787))**
+
+  When marking a contact as deceased, this simplifies the underlying process and
+  ensures that a message is displayed about memberships being updated to
+  Deceased status.
+
+- **Invalid currency "$" on sending offline membership receipt.
+  ([dev/core#1682](https://lab.civicrm.org/dev/core/issues/1682):
+  [16943](https://github.com/civicrm/civicrm-core/pull/16943))**
+
+  Fixes an error when sending a receipt for a membership created from an offline
+  membership form.  The default currency symbol was being saved as the currency
+  itself.
+
+- **Membership auto-renew is not optional if using price set
+  ([dev/core#1630](https://lab.civicrm.org/dev/core/issues/1630):
+  [16762](https://github.com/civicrm/civicrm-core/pull/16762))**
+
+- **Membership join date checkbox on constituent detail report has lost its
+  label ([dev/report#28](https://lab.civicrm.org/dev/report/issues/28):
+  [16829](https://github.com/civicrm/civicrm-core/pull/16829))**
+
+### Drupal Integration
+
+- **Address no longer available as Relationship for Views in Drupal 7
+  ([dev/drupal#110](https://lab.civicrm.org/dev/drupal/issues/110):
+  [118](https://github.com/civicrm/civicrm-backdrop/pull/118) and
+  [600](https://github.com/civicrm/civicrm-drupal/pull/600))**
+
+- **Generalise typo3/phar-stream-wrapper so CiviCRM can be installed on D8.7
+  ([17085](https://github.com/civicrm/civicrm-core/pull/17085))**
+
+- **civicrm-setup and backward slashes in file paths on windows don't play nice
+  together ([dev/core#1643](https://lab.civicrm.org/dev/core/issues/1643):
+  [16886](https://github.com/civicrm/civicrm-core/pull/16886))**
+
+  Fixes installing CiviCRM on Drupal8 sites on windows using civicrm-setup / cv
+  core:install.
+
+### WordPress Integration
+
+- **5.23 breaks WP admin menu links
+  ([dev/core#1637](https://lab.civicrm.org/dev/core/issues/1637):
+  [16713](https://github.com/civicrm/civicrm-core/pull/16713))**
+
+- **Set "cms.root" URL in addition to Path
+  ([188](https://github.com/civicrm/civicrm-wordpress/pull/188))**
+
+  This resolves a "Cannot resolve path using 'cms.root.url'" exception thrown on
+  the "Settings - Resource URLs" screen incorrectly on a WordPress multisite
+  subsite.
+
+## <a name="misc"></a>Miscellany
+
+- **Add recurring contribution ID to doCancelRecurring
+  ([16741](https://github.com/civicrm/civicrm-core/pull/16741))**
+
+- **Support PropertyBag in CRM_Utils_Array
+  ([16699](https://github.com/civicrm/civicrm-core/pull/16699) and
+  [16737](https://github.com/civicrm/civicrm-core/pull/16737))**
+
+- **Added pseudoconstant for acl_id
+  ([16925](https://github.com/civicrm/civicrm-core/pull/16925))**
+
+- **Added pseudoconstant for state province
+  ([16799](https://github.com/civicrm/civicrm-core/pull/16799))**
+
+- **Added pseudoconstant for location type
+  ([16758](https://github.com/civicrm/civicrm-core/pull/16758))**
+
+- **Added pseudoconstant for priceset
+  ([16754](https://github.com/civicrm/civicrm-core/pull/16754))**
+
+- **Added pseudoconstant for bounce type
+  ([16727](https://github.com/civicrm/civicrm-core/pull/16727))**
+
+- **Added pseudoconstant for civicrm_tag.parent_id
+  ([16703](https://github.com/civicrm/civicrm-core/pull/16703))**
+
+- **Event Cart cleanup
+  ([16691](https://github.com/civicrm/civicrm-core/pull/16691))**
+
+- **Update cancelSubscription form to use updated methodology
+  ([16501](https://github.com/civicrm/civicrm-core/pull/16501) and
+  [16715](https://github.com/civicrm/civicrm-core/pull/16715))**
+
+- **Skip expensive smarty Processing when nothing to see here
+  ([16731](https://github.com/civicrm/civicrm-core/pull/16731))**
+
+- **UFMatch - deprecate unused functions
+  ([16849](https://github.com/civicrm/civicrm-core/pull/16849))**
+
+- **Shifted UpdateMemberhsip to BAO Layer
+  ([16690](https://github.com/civicrm/civicrm-core/pull/16690))**
+
+- **Add DAO::writeRecord and DAO::deleteRecord methods
+  ([16856](https://github.com/civicrm/civicrm-core/pull/16856))**
+
+- **Add some deprecation notices, stop calling PrevNext::cleanupCache
+  ([16697](https://github.com/civicrm/civicrm-core/pull/16697))**
+
+- **Remove assigns for atypefile
+  ([16895](https://github.com/civicrm/civicrm-core/pull/16895))**
+
+- **Deprecate use of  in OptionGroup::add() function
+  ([16910](https://github.com/civicrm/civicrm-core/pull/16910))**
+
+- **Improve APIv4 selectUtils to handle join paths in fieldnames.
+  ([16904](https://github.com/civicrm/civicrm-core/pull/16904))**
+
+- **Upgrade jQuery validation version to v1.19.1
+  ([16625](https://github.com/civicrm/civicrm-core/pull/16625))**
+
+- **APIv3 - Use new DAO::deleteRecord method
+  ([16869](https://github.com/civicrm/civicrm-core/pull/16869))**
+
+- **Improve conditional in api3 ChainSubscriber
+  ([16718](https://github.com/civicrm/civicrm-core/pull/16718))**
+
+- **Mark unused function as deprecated
+  ([16688](https://github.com/civicrm/civicrm-core/pull/16688))**
+
+- **CRM/Contact - Cleanup boolean expressions
+  ([16844](https://github.com/civicrm/civicrm-core/pull/16844))**
+
+- **CRM/Contribute - Cleanup boolean expressions
+  ([16853](https://github.com/civicrm/civicrm-core/pull/16853))**
+
+- **Civi/Test - Refactor out CRM_Utils_Array::value
+  ([16871](https://github.com/civicrm/civicrm-core/pull/16871))**
+
+- **Cleanup reverse boolean expressions
+  ([16850](https://github.com/civicrm/civicrm-core/pull/16850))**
+
+- **CRM/Core - Cleanup boolean expressions
+  ([16852](https://github.com/civicrm/civicrm-core/pull/16852))**
+
+- **CRM/Utils - Cleanup boolean expressions
+  ([16851](https://github.com/civicrm/civicrm-core/pull/16851))**
+
+- **CRM - Cleanup boolean expressions
+  ([16854](https://github.com/civicrm/civicrm-core/pull/16854))**
+
+- **Fix another instance of silly use of CRM_Utils_Array::value
+  ([16712](https://github.com/civicrm/civicrm-core/pull/16712))**
+
+- **Fix passing a non-array to CRM_Utils_Array::value
+  ([16701](https://github.com/civicrm/civicrm-core/pull/16701))**
+
+- **Fix another instance of NULL being passed to CRM_Utils_Array::value
+  ([16711](https://github.com/civicrm/civicrm-core/pull/16711))**
+
+- **Remove an instance of passing non-arraay to CRM_Utils_Array::value(
+  ([16706](https://github.com/civicrm/civicrm-core/pull/16706))**
+
+- **Remove calls & deprecate CRM_Core_BAO_PrevNextCache::setItem
+  ([16696](https://github.com/civicrm/civicrm-core/pull/16696))**
+
+- **(POC) Add `hook_civicrm_postCommit`, a less foot-gunny variant of
+  `hook_civicrm_post`
+  ([15338](https://github.com/civicrm/civicrm-core/pull/15338))**
+
+- **Fix typos in xml/dao
+  ([16827](https://github.com/civicrm/civicrm-core/pull/16827))**
+
+- **Deprecate unused/unneeded pseudoconstant functions
+  ([16771](https://github.com/civicrm/civicrm-core/pull/16771))**
+
+- **Deprecate calling contactTrashRestore function
+  ([16824](https://github.com/civicrm/civicrm-core/pull/16824))**
+
+- **Remove old stuff
+  ([16835](https://github.com/civicrm/civicrm-core/pull/16835))**
+
+- **Remove  deprecated cleaning  of money in  the  BAO layer
+  ([16950](https://github.com/civicrm/civicrm-core/pull/16950))**
+
+- **Remove unused deprecated function
+  ([16812](https://github.com/civicrm/civicrm-core/pull/16812))**
+
+- **Remove deprecated function
+  ([16907](https://github.com/civicrm/civicrm-core/pull/16907))**
+
+- **Remove unused code
+  ([16914](https://github.com/civicrm/civicrm-core/pull/16914))**
+
+- **Remove deprecated parameter
+  ([16813](https://github.com/civicrm/civicrm-core/pull/16813))**
+
+- **fix typo ([16865](https://github.com/civicrm/civicrm-core/pull/16865))**
+
+- **API tests - remove unnecessary check for v4
+  ([16866](https://github.com/civicrm/civicrm-core/pull/16866))**
+
+- **[NFC] APIv4 - Add test coverage for expected fields from join
+  ([16920](https://github.com/civicrm/civicrm-core/pull/16920))**
+
+- **[NFC] Add in unit test to ensure that APIv4 Doesn't accept an invalid…
+  ([16893](https://github.com/civicrm/civicrm-core/pull/16893))**
+
+- **[NFC] Use strict comparison where  possible
+  ([16896](https://github.com/civicrm/civicrm-core/pull/16896))**
+
+- **[NFC] Code formatting
+  ([16906](https://github.com/civicrm/civicrm-core/pull/16906))**
+
+- **[NFC] minor form cleanup.
+  ([16905](https://github.com/civicrm/civicrm-core/pull/16905))**
+
+- **(NFC) Minor typo: receipients > recipients
+  ([16810](https://github.com/civicrm/civicrm-core/pull/16810))**
+
+- **[NFC] Minor code cleanup
+  ([16823](https://github.com/civicrm/civicrm-core/pull/16823))**
+
+- **[NFC] Deprecate passing in silly data
+  ([16818](https://github.com/civicrm/civicrm-core/pull/16818))**
+
+- **[NFC] Test cleanup
+  ([16817](https://github.com/civicrm/civicrm-core/pull/16817))**
+
+- **[NFC] Test cleanup, remove duplicate test
+  ([16755](https://github.com/civicrm/civicrm-core/pull/16755))**
+
+- **(NFC) Minor string error : for for > for
+  ([16773](https://github.com/civicrm/civicrm-core/pull/16773))**
+
+- **(NFC) Minor typo: contacts(s) -> contact(s)
+  ([16804](https://github.com/civicrm/civicrm-core/pull/16804))**
+
+- **(NFC) Query.php / Minor typo: Genrated -> Generated
+  ([16803](https://github.com/civicrm/civicrm-core/pull/16803))**
+
+- **[NFC] Fix comments, use single quotes
+  ([16693](https://github.com/civicrm/civicrm-core/pull/16693))**
+
+- **[NFC] Mark unused function deprecated, fix some comments & formatting
+  ([16698](https://github.com/civicrm/civicrm-core/pull/16698))**
+
+- **[NFC] cleanup in test class
+  ([16764](https://github.com/civicrm/civicrm-core/pull/16764))**
+
+- **[NFC] Use helper / api to delete contacts in tests
+  ([16825](https://github.com/civicrm/civicrm-core/pull/16825))**
+
+- **[NFC/TEST] Resurrect unfinished test for getRelatedCases()
+  ([16885](https://github.com/civicrm/civicrm-core/pull/16885))**
+
+- **[Test] Remove skip that seems no longer required
+  ([16912](https://github.com/civicrm/civicrm-core/pull/16912))**
+
+- **Test for PR 13809
+  ([16474](https://github.com/civicrm/civicrm-core/pull/16474))**
+
+- **[TEST] Add test for to time processing
+  ([16861](https://github.com/civicrm/civicrm-core/pull/16861))**
+
+- **[REF] Case Activities Report includes core activities *always*
+  ([dev/core#1366](https://lab.civicrm.org/dev/core/issues/1366):
+  [16670](https://github.com/civicrm/civicrm-core/pull/16670))**
+
+- **[REF] Cleanup api3 DashboardContact
+  ([16792](https://github.com/civicrm/civicrm-core/pull/16792))**
+
+- **[REF] Fixes a bug in Message Template create API where by user permissions
+  checks were being done on system workflow messages
+  ([16788](https://github.com/civicrm/civicrm-core/pull/16788))**
+
+- **[REF] Remove calls to fatal()
+  ([16746](https://github.com/civicrm/civicrm-core/pull/16746))**
+
+- **[REF] Cleanup uses of CRM_Utils_Array::value related to numbers
+  ([16778](https://github.com/civicrm/civicrm-core/pull/16778))**
+
+- **[REF]  cleanup financial type form - remove complex inheritence
+  ([16777](https://github.com/civicrm/civicrm-core/pull/16777))**
+
+- **[REF] Use ?? operator instead of CRM_Utils_Array::value()
+  ([16710](https://github.com/civicrm/civicrm-core/pull/16710))**
+
+- **[REF] dev/core#1116 - Remove unused misnamed activityTypeName variable
+  ([16730](https://github.com/civicrm/civicrm-core/pull/16730))**
+
+- **REF Switch to getter on cancelSubscription form
+  ([16740](https://github.com/civicrm/civicrm-core/pull/16740))**
+
+- **[REF] Minor code simplification
+  ([16734](https://github.com/civicrm/civicrm-core/pull/16734))**
+
+- **[REF] Hopefully fix regularly failing conformance test
+  ([16732](https://github.com/civicrm/civicrm-core/pull/16732))**
+
+- **[REF] Use empty() instead of CRM_Utils_Array::value() in inline conditionals
+  ([16729](https://github.com/civicrm/civicrm-core/pull/16729))**
+
+- **[REF] Use ?? operator instead of CRM_Utils_Array::value() in return
+  statements ([16719](https://github.com/civicrm/civicrm-core/pull/16719))**
+
+- **[REF] CRM_Utils_Array::value() -> empty()
+  ([16704](https://github.com/civicrm/civicrm-core/pull/16704))**
+
+- **[REF] Cleanup is_array(CRM_Utils_Array::value()) pattern
+  ([16875](https://github.com/civicrm/civicrm-core/pull/16875))**
+
+- **[REF] Remove redundant call to build permissions
+  ([16862](https://github.com/civicrm/civicrm-core/pull/16862))**
+
+- **[REF] Replace CRM_Utils_Array::value with ?? in variable assignments
+  ([16768](https://github.com/civicrm/civicrm-core/pull/16768))**
+
+- **[REF] Replace coalesce pattern with coalesce operator
+  ([16802](https://github.com/civicrm/civicrm-core/pull/16802))**
+
+- **[REF] Switch to using a non abandoned library for getting a mapping of
+  mimetypes to extensions
+  ([16436](https://github.com/civicrm/civicrm-core/pull/16436))**
+
+- **[REF] move buildQuickForm function to the trait
+  ([16948](https://github.com/civicrm/civicrm-core/pull/16948))**
+
+- **[REF] Move properties to Trait
+  ([16940](https://github.com/civicrm/civicrm-core/pull/16940))**
+
+- **[REF] Start transitioning EmailCommon class to a trait
+  ([16935](https://github.com/civicrm/civicrm-core/pull/16935))**
+
+- **[REF] Remove fatal, fix some code comments
+  ([16928](https://github.com/civicrm/civicrm-core/pull/16928))**
+
+- **[REF] extract code to getEmails
+  ([16929](https://github.com/civicrm/civicrm-core/pull/16929))**
+
+- **[REF] Minor simplification - do not use variable variables
+  ([16927](https://github.com/civicrm/civicrm-core/pull/16927))**
+
+- **[REF] Extract code used to render a pseudoconstant when a table is defined.
+  ([16902](https://github.com/civicrm/civicrm-core/pull/16902))**
+
+- **[REF] Move form specific handling back to the relevant form.
+  ([16913](https://github.com/civicrm/civicrm-core/pull/16913))**
+
+- **[REF] APIv4 - Preserve order when expanding select wildcards
+  ([16909](https://github.com/civicrm/civicrm-core/pull/16909))**
+
+- **[REF] Remove & from before variable
+  ([16897](https://github.com/civicrm/civicrm-core/pull/16897))**
+
+- **[REF] Replace \CRM_Utils_Array::value with ??
+  ([16872](https://github.com/civicrm/civicrm-core/pull/16872))**
+
+- **[REF] Civi/Api4 - Refactor out 'use CRM_Utils_Array'
+  ([16873](https://github.com/civicrm/civicrm-core/pull/16873))**
+
+- **[REF] BAO_Contact - Remove CRM_Utils_Array::value and other unnecessary code
+  ([16874](https://github.com/civicrm/civicrm-core/pull/16874))**
+
+- **[REF] APIv4 - Restructure the way get query objects are constucted
+  ([16878](https://github.com/civicrm/civicrm-core/pull/16878))**
+
+- **[REF] Fix PCP getPcpDashboardInfo to be tested & use sensible functions
+  ([16790](https://github.com/civicrm/civicrm-core/pull/16790))**
+
+- **[REF] Simplify obtuse boolean expressions
+  ([16822](https://github.com/civicrm/civicrm-core/pull/16822))**
+
+- **[REF] Replace CRM_Utils_Array::value with ?? in variable assignments
+  ([16820](https://github.com/civicrm/civicrm-core/pull/16820))**
+
+- **[REF] cleanups on array operator
+  ([16821](https://github.com/civicrm/civicrm-core/pull/16821))**
+
+- **[REF] Simplify obtuse boolean expressions
+  ([16819](https://github.com/civicrm/civicrm-core/pull/16819))**
+
+- **[REF] Remove titleHeader var
+  ([16816](https://github.com/civicrm/civicrm-core/pull/16816))**
+
+- **[REF] simplify references to civicrm_acl
+  ([16671](https://github.com/civicrm/civicrm-core/pull/16671))**
+
+- **[REF] Fix retrieving invoice related settings when doing complete
+  transaction ([17218](https://github.com/civicrm/civicrm-core/pull/17218))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following code authors:
+
+a-n The Artists Information Company - William Mortada; AGH Strategies - Alice
+Frumin, Andrew Hunt; Alexy Mikhailichenko; Andrei Mondoc; Christian Wach; Circle
+Interactive - Pradeep Nayak; CiviCoop - Jaap Jansma; CiviCRM - Coleman Watts,
+Tim Otten; CiviDesk - Yashodha Chaku; Coop SymbioTIC - Mathieu Lutfy; Dave D;
+Freeform Solutions - Herb van den Dool; Fuzion - Jitendra Purohit; iXiam - César
+Ramos; JMA Consulting - Seamus Lee; Joinery - Allen Shaw; Kartik Kathuria;
+Lighthouse Design and Consulting - Brian Shaughnessy; Makoa - Usha F. Matisson;
+Megaphone Technology Consulting - Jon Goldberg; MJW Consulting - Matthew Wire;
+Naomi Rosenberg; Ray Wright; OSSeed Technologies LLP - Sushant Paste; SYSTOPIA
+Organisationsberatung - Björn Endres; Timbsoft Technologies - Tunbola Ogunwande;
+Wikimedia Foundation - Eileen McNaughton
+
+Most authors also reviewed code for this release; in addition, the following
+reviewers contributed their comments:
+
+Agileware - Justin Freeman; Artful Robot - Rich Lott; British Humanist
+Association - Andrew West; CiviDesk - Nicolas Ganivet; Coop SymbioTIC - Mathieu
+Lutfy; Digitalcourage - Detlev Sieber; Freeform Solutions - S. Gray; Fuzion -
+Jitendra Purohit; Greenpeace Central and Eastern Europe - Patrick Figel; Jamie
+Tillman; JMA Consulting - Monish Deb; Korlon - Stuart Gaston; MJCO - Mikey
+O'Toole; Richard van Oosterhout; Skvare - Mark Hanna; Squiffle Consulting -
+Aidan Saunders; Tadpole Collective - Kevin Cristiano
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Alice Frumin and Andrew Hunt.  If you'd like
+to provide feedback on them, please log in to https://chat.civicrm.org/civicrm
+and contact `@agh1`.
diff --git a/civicrm/setup/plugins/blocks/requirements.tpl.php b/civicrm/setup/plugins/blocks/requirements.tpl.php
index 0066bfd157..54979fdf3c 100644
--- a/civicrm/setup/plugins/blocks/requirements.tpl.php
+++ b/civicrm/setup/plugins/blocks/requirements.tpl.php
@@ -37,7 +37,7 @@ uasort($msgs, function($a, $b) {
   <?php foreach ($msgs as $msg):?>
   <tr class="<?php echo 'reqSeverity-' . $msg['severity']; ?>">
     <td><?php echo htmlentities($_tpl_block['severity_labels'][$msg['severity']]); ?></td>
-    <td><?php echo htmlentities(isset($_tpl_block['section_labels'][$msg['section']]) ? $_tpl_block['section_labels'][$msg['section']] : $msg['section']); ?></td>
+    <td><?php echo htmlentities($_tpl_block['section_labels'][$msg['section']] ?? $msg['section']); ?></td>
     <td><?php echo htmlentities($msg['name']); ?></td>
     <td><?php echo htmlentities($msg['message']); ?></td>
   </tr>
diff --git a/civicrm/setup/src/Setup/DrupalUtil.php b/civicrm/setup/src/Setup/DrupalUtil.php
index 5e8090a4b4..0f5ab95205 100644
--- a/civicrm/setup/src/Setup/DrupalUtil.php
+++ b/civicrm/setup/src/Setup/DrupalUtil.php
@@ -47,7 +47,7 @@ class DrupalUtil {
     preg_quote($modules, DIRECTORY_SEPARATOR) . "/",
     $_SERVER['SCRIPT_FILENAME'], $matches
     );
-    $siteDir = isset($matches[1]) ? $matches[1] : 'default';
+    $siteDir = $matches[1] ?? 'default';
 
     if (strtolower($siteDir) == 'all') {
     // For this case - use drupal's way of finding out multi-site directory
diff --git a/civicrm/setup/src/Setup/Model.php b/civicrm/setup/src/Setup/Model.php
index 68100aef34..717421e7a6 100644
--- a/civicrm/setup/src/Setup/Model.php
+++ b/civicrm/setup/src/Setup/Model.php
@@ -176,7 +176,7 @@ class Model {
     $field = array_merge($defaults, $field);
 
     if (array_key_exists('value', $field) || !array_key_exists($field['name'], $this->values)) {
-      $this->values[$field['name']] = isset($field['value']) ? $field['value'] : NULL;
+      $this->values[$field['name']] = $field['value'] ?? NULL;
       unset($field['value']);
     }
 
@@ -202,10 +202,10 @@ class Model {
    */
   public function getField($field, $property = NULL) {
     if ($property) {
-      return isset($this->fields[$field][$property]) ? $this->fields[$field][$property] : NULL;
+      return $this->fields[$field][$property] ?? NULL;
     }
     else {
-      return isset($this->fields[$field]) ? $this->fields[$field] : NULL;
+      return $this->fields[$field] ?? NULL;
     }
   }
 
diff --git a/civicrm/setup/src/Setup/UI/SetupController.php b/civicrm/setup/src/Setup/UI/SetupController.php
index 841c7c71c1..0d1d1a0d4a 100644
--- a/civicrm/setup/src/Setup/UI/SetupController.php
+++ b/civicrm/setup/src/Setup/UI/SetupController.php
@@ -209,7 +209,7 @@ class SetupController implements SetupControllerInterface {
   }
 
   public function getUrl($name) {
-    return isset($this->urls[$name]) ? $this->urls[$name] : NULL;
+    return $this->urls[$name] ?? NULL;
   }
 
   /**
diff --git a/civicrm/sql/civicrm.mysql b/civicrm/sql/civicrm.mysql
index c42519f1a1..80611fcc4f 100644
--- a/civicrm/sql/civicrm.mysql
+++ b/civicrm/sql/civicrm.mysql
@@ -2491,7 +2491,7 @@ CREATE TABLE `civicrm_print_label` (
 
 
      `id` int unsigned NOT NULL AUTO_INCREMENT  ,
-     `title` varchar(255)    COMMENT 'User title for for this label layout',
+     `title` varchar(255)    COMMENT 'User title for this label layout',
      `name` varchar(255)    COMMENT 'variable name/programmatic handle for this field.',
      `description` text    COMMENT 'Description of this label layout',
      `label_format_name` varchar(255)    COMMENT 'This refers to name column of civicrm_option_value row in name_badge option group',
@@ -3214,7 +3214,7 @@ CREATE TABLE `civicrm_report_instance` (
      `description` varchar(255)    COMMENT 'Report Instance description.',
      `permission` varchar(255)    COMMENT 'permission required to be able to run this instance',
      `grouprole` varchar(1024)    COMMENT 'role required to be able to run this instance',
-     `form_values` text    COMMENT 'Submitted form values for this report',
+     `form_values` longtext    COMMENT 'Submitted form values for this report',
      `is_active` tinyint    COMMENT 'Is this entry active?',
      `created_id` int unsigned    COMMENT 'FK to contact table.',
      `owner_id` int unsigned    COMMENT 'FK to contact table.',
@@ -3636,7 +3636,7 @@ CREATE TABLE `civicrm_dashboard_contact` (
      `id` int unsigned NOT NULL AUTO_INCREMENT  ,
      `dashboard_id` int unsigned NOT NULL   COMMENT 'Dashboard ID',
      `contact_id` int unsigned NOT NULL   COMMENT 'Contact ID',
-     `column_no` tinyint   DEFAULT 0 COMMENT 'column no for this widget',
+     `column_no` int   DEFAULT 0 COMMENT 'column no for this widget',
      `is_active` tinyint   DEFAULT 0 COMMENT 'Is this widget active?',
      `weight` int   DEFAULT 0 COMMENT 'Ordering of the widgets.' 
 ,
@@ -3712,7 +3712,7 @@ CREATE TABLE `civicrm_mailing` (
      `open_tracking` tinyint    COMMENT 'Should we track when recipients open/read this mailing?',
      `is_completed` tinyint    COMMENT 'Has at least one job associated with this mailing finished?',
      `msg_template_id` int unsigned    COMMENT 'FK to the message template.',
-     `override_verp` tinyint   DEFAULT 0 COMMENT 'Should we overrite VERP address in Reply-To',
+     `override_verp` tinyint   DEFAULT 0 COMMENT 'Overwrite the VERP address in Reply-To',
      `created_id` int unsigned    COMMENT 'FK to Contact ID who first created this mailing',
      `created_date` timestamp NULL  DEFAULT NULL COMMENT 'Date and time this mailing was created.',
      `modified_date` timestamp NULL  DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'When the mailing (or closely related entity) was created or modified or deleted.',
@@ -3847,7 +3847,7 @@ CREATE TABLE `civicrm_mailing_spool` (
 
      `id` int unsigned NOT NULL AUTO_INCREMENT  ,
      `job_id` int unsigned NOT NULL   COMMENT 'The ID of the Job .',
-     `recipient_email` text    COMMENT 'The email of the receipients this mail is to be sent.',
+     `recipient_email` text    COMMENT 'The email of the recipients this mail is to be sent.',
      `headers` text    COMMENT 'The header information of this mailing .',
      `body` text    COMMENT 'The body of this mailing.',
      `added_at` timestamp NULL  DEFAULT NULL COMMENT 'date on which this job was added.',
diff --git a/civicrm/sql/civicrm_data.mysql b/civicrm/sql/civicrm_data.mysql
index e7102d0a59..b04d0bc1f1 100644
--- a/civicrm/sql/civicrm_data.mysql
+++ b/civicrm/sql/civicrm_data.mysql
@@ -23896,4 +23896,4 @@ INSERT INTO `civicrm_report_instance`
     ( `domain_id`, `title`, `report_id`, `description`, `permission`, `form_values`)
 VALUES
     (  @domainID, 'Survey Details', 'survey/detail', 'Detailed report for canvassing, phone-banking, walk lists or other surveys.', 'access CiviReport', 'a:39:{s:6:"fields";a:2:{s:9:"sort_name";s:1:"1";s:6:"result";s:1:"1";}s:22:"assignee_contact_id_op";s:2:"eq";s:25:"assignee_contact_id_value";s:0:"";s:12:"sort_name_op";s:3:"has";s:15:"sort_name_value";s:0:"";s:17:"street_number_min";s:0:"";s:17:"street_number_max";s:0:"";s:16:"street_number_op";s:3:"lte";s:19:"street_number_value";s:0:"";s:14:"street_name_op";s:3:"has";s:17:"street_name_value";s:0:"";s:15:"postal_code_min";s:0:"";s:15:"postal_code_max";s:0:"";s:14:"postal_code_op";s:3:"lte";s:17:"postal_code_value";s:0:"";s:7:"city_op";s:3:"has";s:10:"city_value";s:0:"";s:20:"state_province_id_op";s:2:"in";s:23:"state_province_id_value";a:0:{}s:13:"country_id_op";s:2:"in";s:16:"country_id_value";a:0:{}s:12:"survey_id_op";s:2:"in";s:15:"survey_id_value";a:0:{}s:12:"status_id_op";s:2:"eq";s:15:"status_id_value";s:1:"1";s:11:"custom_1_op";s:2:"in";s:14:"custom_1_value";a:0:{}s:11:"custom_2_op";s:2:"in";s:14:"custom_2_value";a:0:{}s:17:"custom_3_relative";s:1:"0";s:13:"custom_3_from";s:0:"";s:11:"custom_3_to";s:0:"";s:11:"description";s:75:"Detailed report for canvassing, phone-banking, walk lists or other surveys.";s:13:"email_subject";s:0:"";s:8:"email_to";s:0:"";s:8:"email_cc";s:0:"";s:10:"permission";s:17:"access CiviReport";s:6:"groups";s:0:"";s:9:"domain_id";i:1;}');
-UPDATE civicrm_domain SET version = '5.24.6';
+UPDATE civicrm_domain SET version = '5.25.0';
diff --git a/civicrm/sql/civicrm_generated.mysql b/civicrm/sql/civicrm_generated.mysql
index 0306f8bb91..0f915b6c0e 100644
--- a/civicrm/sql/civicrm_generated.mysql
+++ b/civicrm/sql/civicrm_generated.mysql
@@ -398,7 +398,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_domain` WRITE;
 /*!40000 ALTER TABLE `civicrm_domain` DISABLE KEYS */;
-INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,'5.24.6',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
+INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,'5.25.0',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
 /*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */;
 UNLOCK TABLES;
 
diff --git a/civicrm/templates/CRM/Case/Audit/Report.tpl b/civicrm/templates/CRM/Case/Audit/Report.tpl
index fb28c7034d..827b037393 100644
--- a/civicrm/templates/CRM/Case/Audit/Report.tpl
+++ b/civicrm/templates/CRM/Case/Audit/Report.tpl
@@ -132,12 +132,14 @@
   <h2>{ts}Case Activities{/ts}</h2>
   {foreach from=$activities item=activity key=key}
     <table  class ="report-layout">
-      {foreach from=$activity item=field name=fieldloop}
-        <tr class="crm-case-report-activity-{$field.label}">
+      {foreach from=$activity item=field}
+        {* TODO: Using an unmunged field in the css class would have always been problematic? Since it sometimes has spaces. *}
+        <tr class="crm-case-report-activity-{$field.name}">
           <th scope="row" class="label">{$field.label|escape}</th>
-          {if $field.label eq 'Activity Type' or $field.label eq 'Status'}
+          {if $field.name eq 'Activity Type' or $field.name eq 'Status'}
             <td class="bold">{$field.value|escape}</td>
-          {elseif $field.label eq 'Details' or $field.label eq 'Subject'}
+          {* TODO: See note in CRM/Case/XMLProcessor/Report.php: Subject is already escaped in the php file so that's why it's not escaped here, but should that be reversed? *}
+          {elseif $field.name eq 'Details' or $field.name eq 'Subject'}
             <td>{$field.value}</td>
           {else}
             <td>{$field.value|escape}</td>
diff --git a/civicrm/templates/CRM/Case/XMLProcessor/Report.tpl b/civicrm/templates/CRM/Case/XMLProcessor/Report.tpl
index e0aabc5da7..8d7d0f4154 100644
--- a/civicrm/templates/CRM/Case/XMLProcessor/Report.tpl
+++ b/civicrm/templates/CRM/Case/XMLProcessor/Report.tpl
@@ -25,6 +25,7 @@
        <Fields>
 {foreach from=$activity.fields item=field}
           <Field>
+            <Name>{$field.name|escape}</Name>
             <Label>{$field.label|escape}</Label>
 {if $field.category}
             <Category>{$field.category|escape}</Category>
@@ -40,6 +41,7 @@
                <GroupName>{$customGroupName|escape}</GroupName>
 {foreach from=$customGroup item=field}
                   <Field>
+                    <Name>{*TODO*}</Name>
                     <Label>{$field.label|escape}</Label>
                     <Value>{$field.value|escape}</Value>
                     <Type>{$field.type}</Type>
diff --git a/civicrm/templates/CRM/Contact/Form/Task/Email.tpl b/civicrm/templates/CRM/Contact/Form/Task/Email.tpl
index d665a1b18f..825dfaf8bc 100644
--- a/civicrm/templates/CRM/Contact/Form/Task/Email.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Task/Email.tpl
@@ -23,7 +23,7 @@
     <tr class="crm-contactEmail-form-block-recipient">
        <td class="label">{if $single eq false}{ts}Recipient(s){/ts}{else}{$form.to.label}{/if}</td>
        <td>
-         {$form.to.html}{if $noEmails eq true}&nbsp;&nbsp;{$form.emailAddress.html}{/if}
+         {$form.to.html}
        </td>
     </tr>
     <tr class="crm-contactEmail-form-block-cc_id" {if !$form.cc_id.value}style="display:none;"{/if}>
diff --git a/civicrm/templates/CRM/Contribute/Form/AdditionalPayment.tpl b/civicrm/templates/CRM/Contribute/Form/AdditionalPayment.tpl
index 4ca837f074..3fd811d48c 100644
--- a/civicrm/templates/CRM/Contribute/Form/AdditionalPayment.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/AdditionalPayment.tpl
@@ -48,7 +48,7 @@
     <tr class="crm-payment-form-block-total_amount">
       <td class="label">{$form.total_amount.label}</td>
       <td>
-        <span id='totalAmount'>{$form.currency.html|crmAddClass:eight}&nbsp;{$form.total_amount.html|crmAddClass:eight}</span>&nbsp; <span class="status">{if $paymentType EQ 'refund'}{ts}Refund Due{/ts}{else}{ts}Balance Owed{/ts}{/if}:&nbsp;{$paymentAmt|crmMoney}</span>
+        <span id='totalAmount'>{$form.currency.html|crmAddClass:eight}&nbsp;{$form.total_amount.html|crmAddClass:eight}</span>&nbsp; <span class="status">{if $paymentType EQ 'refund' || $paymentAmt < 0}{ts}Refund Due :&nbsp;{$absolutePaymentAmount|crmMoney} {/ts}{else}{ts}Balance Owed{/ts} :&nbsp;{$paymentAmt|crmMoney}{/if}</span>
       </td>
       {if $email and $outBound_option != 2}
         <tr class="crm-payment-form-block-is_email_receipt">
diff --git a/civicrm/templates/CRM/Contribute/Form/CancelSubscription.tpl b/civicrm/templates/CRM/Contribute/Form/CancelSubscription.tpl
index 5ed29e5ca0..74e5e2f186 100644
--- a/civicrm/templates/CRM/Contribute/Form/CancelSubscription.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/CancelSubscription.tpl
@@ -11,19 +11,9 @@
 <div class="crm-block crm-form-block crm-auto-renew-membership-cancellation">
 <div class="help">
   <div class="icon inform-icon"></div>&nbsp;
-  {if $mode eq 'auto_renew'}
-      {ts}Click the button below if you want to cancel the auto-renewal option for your {$membershipType} membership. This will not cancel your membership. However you will need to arrange payment for renewal when your membership expires.{/ts}
-  {else}
-      <strong>{ts 1=$amount|crmMoney 2=$frequency_interval 3=$frequency_unit}Recurring Contribution Details: %1 every %2 %3{/ts}
-      {if $installments}
-        {ts 1=$installments}for %1 installments{/ts}.
-      {/if}</strong>
-      <div class="content">{ts}Click the button below to cancel this commitment and stop future transactions. This does not affect contributions which have already been completed.{/ts}</div>
-  {/if}
+  {$cancelRecurDetailText}
   {if !$cancelSupported}
-    <div class="status-warning">
-      {ts}Automatic cancellation is not supported for this payment processor. You or the contributor will need to manually cancel this recurring contribution using the payment processor website.{/ts}
-    </div>
+    <div class="status-warning">{$cancelRecurNotSupportedText}</div>
   {/if}
 </div>
   {include file="CRM/Core/Form/EntityForm.tpl"}
diff --git a/civicrm/templates/CRM/Contribute/Form/Task/Status.tpl b/civicrm/templates/CRM/Contribute/Form/Task/Status.tpl
index 16f2ac55ce..635c4890d7 100644
--- a/civicrm/templates/CRM/Contribute/Form/Task/Status.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Task/Status.tpl
@@ -16,6 +16,11 @@
      <table class="form-layout-compressed">
      <tr class="crm-contribution-form-block-contribution_status_id"><td class="label">{$form.contribution_status_id.label}</td><td class="html-adjust">{$form.contribution_status_id.html}<br />
             <span class="description">{ts}Assign the selected status to all contributions listed below.{/ts}</td></tr>
+       <tr class="crm-contribution-form-block-is_email_receipt"><td class="label">{$form.is_email_receipt.label}</td>
+         <td class="html-adjust">{$form.is_email_receipt.html}<br />
+           <span class="description">{ts}When checked CiviCRM will send an e-mail receipt to the donor. Leave unchecked when you don't want to send an e-mail.{/ts}
+         </td>
+       </tr>
      </table>
 <table>
 <tr class="columnheader">
diff --git a/civicrm/templates/CRM/Contribute/Page/PaymentInfo.tpl b/civicrm/templates/CRM/Contribute/Page/PaymentInfo.tpl
index ad4ed127dd..cd129712b1 100644
--- a/civicrm/templates/CRM/Contribute/Page/PaymentInfo.tpl
+++ b/civicrm/templates/CRM/Contribute/Page/PaymentInfo.tpl
@@ -48,23 +48,8 @@ CRM.$(function($) {
     <td>{$paymentInfo.total|crmMoney:$paymentInfo.currency}</td>
     <td class='right'>
         {$paymentInfo.paid|crmMoney:$paymentInfo.currency}
-        {if !$hideButtonLinks}
-          <br/>
-          <a class="crm-hover-button action-item crm-popup medium-popup" href='{crmURL p="civicrm/payment" q="view=transaction&cid=`$cid`&id=`$paymentInfo.id`&component=`$paymentInfo.component`&action=browse"}'>
-            <i class="crm-i fa-list"></i>
-            {ts}view payments{/ts}
-          </a>
-        {/if}
     </td>
     <td class="right" id="payment-info-balance" data-balance="{$paymentInfo.balance}">{$paymentInfo.balance|crmMoney:$paymentInfo.currency}</td>
   </tr>
 </table>
-{if $paymentInfo.balance and !$paymentInfo.payLater && !$hideButtonLinks}
-  {if $paymentInfo.balance > 0}
-     {assign var=paymentButtonName value='Record Payment'}
-  {elseif $paymentInfo.balance < 0}
-     {assign var=paymentButtonName value='Record Refund'}
-  {/if}
-  <a class="action-item crm-hover-button" href='{crmURL p="civicrm/payment" q="action=add&reset=1&component=`$component`&id=`$id`&cid=`$cid`"}'><i class="crm-i fa-plus-circle"></i> {ts}{$paymentButtonName}{/ts}</a>
-{/if}
 {/if}
diff --git a/civicrm/templates/CRM/Core/BillingBlock.tpl b/civicrm/templates/CRM/Core/BillingBlock.tpl
index f93dda3b6a..f8bb2088f5 100644
--- a/civicrm/templates/CRM/Core/BillingBlock.tpl
+++ b/civicrm/templates/CRM/Core/BillingBlock.tpl
@@ -158,10 +158,18 @@
         });
       }
 
-
       // toggle show/hide
-      $('#billingcheckbox').click(function () {
-        if (this.checked) {
+      var billingCheckboxElement = $('#billingcheckbox');
+      billingCheckboxElement.click(function() {
+        billingCheckboxChanged(billingCheckboxElement);
+      });
+
+      billingCheckboxElement.change(function() {
+        billingCheckboxChanged(billingCheckboxElement);
+      });
+
+      function billingCheckboxChanged(billingCheckbox) {
+        if (billingCheckbox.prop('checked')) {
           if (!CRM.billing || CRM.billing.billingProfileIsHideable) {
             $('.billing_name_address-group').hide(200);
           }
@@ -180,7 +188,7 @@
         } else {
           $('.billing_name_address-group').show(200);
         }
-      });
+      }
 
       // remove spaces, dashes from credit card number
       $('#credit_card_number').change(function () {
diff --git a/civicrm/templates/CRM/Core/DatePickerRangeWrapper.tpl b/civicrm/templates/CRM/Core/DatePickerRangeWrapper.tpl
index 8af6545aef..2e6fcb54ad 100644
--- a/civicrm/templates/CRM/Core/DatePickerRangeWrapper.tpl
+++ b/civicrm/templates/CRM/Core/DatePickerRangeWrapper.tpl
@@ -10,5 +10,7 @@
 {* Wrapper around DatePickerRange TPL file *}
 <td {if $colspan} colspan="{$colspan}" {else} colspan="2" {/if} {if $class} class="{$class}" {/if}>
   {assign var='hideRelativeLabel' value=$hideRelativeLabel|default:0}
-  {include file="CRM/Core/DatePickerRange.tpl" fieldName=$fieldName hideRelativeLabel=$hideRelativeLabel}
+  {assign var='from' value=$from|default:'_low'}
+  {assign var='to' value=$to|default:'_high'}
+  {include file="CRM/Core/DatePickerRange.tpl" fieldName=$fieldName hideRelativeLabel=$hideRelativeLabel to=$to from=$from}
 </td>
diff --git a/civicrm/templates/CRM/Custom/Page/CustomDataView.tpl b/civicrm/templates/CRM/Custom/Page/CustomDataView.tpl
index b9ba66ce0e..3cddab39b4 100644
--- a/civicrm/templates/CRM/Custom/Page/CustomDataView.tpl
+++ b/civicrm/templates/CRM/Custom/Page/CustomDataView.tpl
@@ -130,7 +130,7 @@
                       <a href='{crmURL p="civicrm/contact/view" q="reset=1&cid=`$element.contact_ref_id`"}'>
                     {/if}
                     {if $element.field_data_type == 'Memo'}
-                      {$element.field_value|nl2br}
+                      {if $element.field_value}{$element.field_value|nl2br}{else}<br/>{/if}
                     {else}
                       {if $element.field_value}{$element.field_value} {else}<br/>{/if}
                     {/if}
diff --git a/civicrm/templates/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.tpl b/civicrm/templates/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.tpl
index 1b7251641e..5b465d625a 100644
--- a/civicrm/templates/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.tpl
+++ b/civicrm/templates/CRM/Event/Cart/Form/Checkout/ParticipantsAndPrices.tpl
@@ -1,87 +1,90 @@
 {include file="CRM/common/TrackingFields.tpl"}
 
-{if $contact}
-<div class="messages status no-popup">
-    {ts 1=$contact.display_name}Welcome %1{/ts}. (<a href="{crmURL p='civicrm/event/cart_checkout' q="cid=0&reset=1"}" title="{ts}Click here to register a different person for this event.{/ts}">{ts 1=$contact.display_name}Not %1, or want to register a different person{/ts}</a>?)</div>
-{/if}
+<div class="crm-block crm-form-block crm-eventcart-participantsandprices">
 
-{foreach from=$events_in_carts key=index item=event_in_cart}
- {if !$event_in_cart.main_conference_event_id}
-  {assign var=event_id value=$event_in_cart->event_id}
-  <h3 class="event-title">
-    {$event_in_cart->event->title} ({$event_in_cart->event->start_date|date_format:"%m/%d/%Y %l:%M%p"})
-  </h3>
-  <fieldset class="event_form">
-    <div class="participants crm-section" id="event_{$event_in_cart->event_id}_participants">
-      {foreach from=$event_in_cart->participants item=participant}
-  {include file="CRM/Event/Cart/Form/Checkout/Participant.tpl"}
-      {/foreach}
-      <a class="link-add" href="#" onclick="add_participant({$event_in_cart->event_cart->id}, {$event_in_cart->event_id}); return false;">{ts}Add Another Participant{/ts}</a>
-    </div>
-    {if $event_in_cart->event->is_monetary }
-      <div class="price_choices crm-section">
-  {foreach from=$price_fields_for_event.$event_id key=price_index item=price_field_name}
-    <div class="label">
-      {$form.$price_field_name.label}
-    </div>
-    <div class="content">
-      {$form.$price_field_name.html|replace:'/label>&nbsp;':'/label><br>'}
-    </div>
-  {/foreach}
-      </div>
-    {else}
-      <p>{ts}There is no charge for this event.{/ts}</p>
+  {if $contact}
+    <div class="messages status no-popup">
+      {ts 1=$contact.display_name}Welcome %1{/ts}. (<a href="{crmURL p='civicrm/event/cart_checkout' q="cid=0&reset=1"}" title="{ts}Click here to register a different person for this event.{/ts}">{ts 1=$contact.display_name}Not %1, or want to register a different person{/ts}</a>?)</div>
+  {/if}
+
+  {foreach from=$events_in_carts key=index item=event_in_cart}
+    {if !$event_in_cart.main_conference_event_id}
+      {assign var=event_id value=$event_in_cart->event_id}
+      <h3 class="event-title">
+        {$event_in_cart->event->title} ({$event_in_cart->event->start_date|date_format:"%m/%d/%Y %l:%M%p"})
+      </h3>
+      <fieldset class="event_form">
+        <div class="participants crm-section" id="event_{$event_in_cart->event_id}_participants">
+          {foreach from=$event_in_cart->participants item=participant}
+            {include file="CRM/Event/Cart/Form/Checkout/Participant.tpl"}
+          {/foreach}
+          <a class="link-add" href="#" onclick="add_participant({$event_in_cart->event_cart->id}, {$event_in_cart->event_id}); return false;">{ts}Add Another Participant{/ts}</a>
+        </div>
+        {if $event_in_cart->event->is_monetary}
+          <div class="price_choices crm-section">
+            {foreach from=$price_fields_for_event.$event_id key=price_index item=price_field_name}
+              <div class="label">
+                {$form.$price_field_name.label}
+              </div>
+              <div class="content">
+                {$form.$price_field_name.html|replace:'/label>&nbsp;':'/label><br>'}
+              </div>
+            {/foreach}
+          </div>
+        {else}
+          <p>{ts}There is no charge for this event.{/ts}</p>
+        {/if}
+      </fieldset>
     {/if}
-  </fieldset>
- {/if}
-{/foreach}
+  {/foreach}
 
-<div id="crm-submit-buttons" class="crm-submit-buttons">
-  {include file="CRM/common/formButtons.tpl" location="bottom"}
-</div>
+  <div id="crm-submit-buttons" class="crm-submit-buttons">
+    {include file="CRM/common/formButtons.tpl" location="bottom"}
+  </div>
 
-{include file="CRM/Event/Cart/Form/viewCartLink.tpl"}
+  {include file="CRM/Event/Cart/Form/viewCartLink.tpl"}
+</div>
 
 {literal}
 <script type="text/javascript">
-//<![CDATA[
-function add_participant( cart_id, event_id ) {
-  var max_index = 0;
-  var matcher = new RegExp("event_" + event_id + "_participant_(\\d+)");
+  //<![CDATA[
+  function add_participant( cart_id, event_id ) {
+    var max_index = 0;
+    var matcher = new RegExp("event_" + event_id + "_participant_(\\d+)");
 
-  cj('#event_' + event_id + '_participants .participant').each(
-    function(index) {
-      matches = matcher.exec(cj(this).attr('id'));
-      index = parseInt(matches[1]);
-      if (index > max_index)
-      {
-        max_index = index;
-      }
-    }
-  );
+    cj('#event_' + event_id + '_participants .participant').each(
+            function(index) {
+              matches = matcher.exec(cj(this).attr('id'));
+              index = parseInt(matches[1]);
+              if (index > max_index)
+              {
+                max_index = index;
+              }
+            }
+    );
 
-  // FIXME: this get should be a post according to restful standards
-  cj.get(CRM.url("civicrm/ajax/event/add_participant_to_cart?snippet=1", {cart_id: cart_id,  event_id: event_id}),
-    function(data) {
-      cj('#event_' + event_id + '_participants').append(data).trigger('crmLoad');
-    }
-  );
-}
+    // FIXME: this get should be a post according to restful standards
+    cj.get(CRM.url("civicrm/ajax/event/add_participant_to_cart?snippet=1", {cart_id: cart_id,  event_id: event_id}),
+            function(data) {
+              cj('#event_' + event_id + '_participants').append(data).trigger('crmLoad');
+            }
+    );
+  }
 
-function delete_participant( event_id, participant_id )
-{
-  // FIXME: this get should be a post according to restful standards
-  cj('#event_' + event_id + '_participant_' + participant_id).remove();
-  cj.get(CRM.url("civicrm/ajax/event/remove_participant_from_cart", {id: participant_id}));
-}
+  function delete_participant( event_id, participant_id )
+  {
+    // FIXME: this get should be a post according to restful standards
+    cj('#event_' + event_id + '_participant_' + participant_id).remove();
+    cj.get(CRM.url("civicrm/ajax/event/remove_participant_from_cart", {id: participant_id}));
+  }
 
 
-//XXX missing
-cj('#ajax_error').ajaxError(
-  function( e, xrh, settings, exception ) {
-    cj(this).append('<div class="error">{/literal}{ts escape='js'}Error adding a participant at{/ts}{literal} ' + settings.url + ': ' + exception);
-  }
-);
-//]]>
+  //XXX missing
+  cj('#ajax_error').ajaxError(
+          function( e, xrh, settings, exception ) {
+            cj(this).append('<div class="error">{/literal}{ts escape='js'}Error adding a participant at{/ts}{literal} ' + settings.url + ': ' + exception);
+          }
+  );
+  //]]>
 </script>
 {/literal}
diff --git a/civicrm/templates/CRM/Event/Cart/Form/Checkout/Payment.tpl b/civicrm/templates/CRM/Event/Cart/Form/Checkout/Payment.tpl
index 1c9555bd46..fba3a4770c 100644
--- a/civicrm/templates/CRM/Event/Cart/Form/Checkout/Payment.tpl
+++ b/civicrm/templates/CRM/Event/Cart/Form/Checkout/Payment.tpl
@@ -88,6 +88,7 @@
       </td>
       <td class="total">
   &nbsp;{$total|crmMoney:$currency|string_format:"%10s"}
+        <input type="hidden" id="total_amount" value="{$total}">
       </td>
     </tr>
   </tfoot>
@@ -115,45 +116,6 @@
 </div>
 {/if}
 
-{if $administrator}
-<!--
-<div style="border: 1px solid blue; padding: 5px;">
-<b>{ts}Staff use only{/ts}</b>
-<div class="crm-section {$form.note.name}-section">
-  <div class="label">{$form.note.label}</div>
-  <div class="content">{$form.note.html}
-    <div class="description">{ts}Note that will be sent to the billing customer.{/ts}</div>
-  </div>
-  <div class="clear"></div>
-</div>
-<div class="crm-section {$form.source.name}-section">
-  <div class="label">{$form.source.label}</div>
-  <div class="content">{$form.source.html}
-    <div class="description">{ts}Description of this transaction.{/ts}</div>
-  </div>
-  <div class="clear"></div>
-</div>
-<div class="crm-section {$form.payment_type.name}-section">
-  <div class="label">{$form.payment_type.label}</div>
-  <div class="content">{$form.payment_type.html}
-  </div>
-  <div class="clear"></div>
-</div>
-<div class="crm-section {$form.check_number.name}-section" style="display: none;">
-  <div class="label">{$form.check_number.label}</div>
-  <div class="content">{$form.check_number.html}</div>
-  <div class="clear"></div>
-</div>
-<div class="crm-section {$form.is_pending.name}-section">
-  <div class="label">{$form.is_pending.label}</div>
-  <div class="content">{$form.is_pending.html}
-  </div>
-  <div class="clear"></div>
-</div>
-</div>
--->
-{/if}
-
 <script type="text/javascript">
 {if $form.is_pay_later.name}
 var pay_later_sel = "input#{$form.is_pay_later.name}";
diff --git a/civicrm/templates/CRM/Event/Cart/Page/ViewCart.tpl b/civicrm/templates/CRM/Event/Cart/Page/ViewCart.tpl
index cae154bb76..2e84d4965e 100644
--- a/civicrm/templates/CRM/Event/Cart/Page/ViewCart.tpl
+++ b/civicrm/templates/CRM/Event/Cart/Page/ViewCart.tpl
@@ -1,29 +1,36 @@
-<table>
-  <thead>
-    <tr>
-      <th>
-      </th>
-    <th>
-      </th>
-    </tr>
-  </thead>
-  <tbody>
-    {foreach from=$events_in_carts item=event_in_cart}
-     {if !$event_in_cart.main_conference_event_id}
+{if $events_count == 0}
+  <div class="crm-section crm-eventcart crm-eventcart-noevents">
+    <div class="content">
+      {ts}You have no events in the cart.{/ts}
+    </div>
+  </div>
+{else}
+  <div class="crm-section crm-eventcart crm-eventcart-hasevents">
+    <table>
+      <thead>
       <tr>
-  <td>
-    <a href="{crmURL p='civicrm/event/info' q="reset=1&id=`$event_in_cart.event.id`"}" title="{ts}View event info page{/ts}" class="bold">{$event_in_cart.event.title}</a>
-  </td>
-  <td>
-    <a title="Remove From Cart" class="action-item" href="{crmURL p='civicrm/event/remove_from_cart' q="reset=1&id=`$event_in_cart.event.id`"}">{ts}Remove{/ts}</a>
-  </td>
+        <th>
+        </th>
+        <th>
+        </th>
       </tr>
-     {/if}
-    {/foreach}
-  </tbody>
-</table>
-{if $events_count > 0}
-        <a href="{crmURL p='civicrm/event/cart_checkout' }" title="Check Out" class="button crm-check-out-button"><span>{ts}Check Out{/ts}</span></a>
-<br /><br />
+      </thead>
+      <tbody>
+      {foreach from=$events_in_carts item=event_in_cart}
+        {if !$event_in_cart.main_conference_event_id}
+          <tr>
+            <td>
+              <a href="{crmURL p='civicrm/event/info' q="reset=1&id=`$event_in_cart.event.id`"}" title="{ts}View event info page{/ts}" class="bold">{$event_in_cart.event.title}</a>
+            </td>
+            <td>
+              <a title="Remove From Cart" class="action-item" href="{crmURL p='civicrm/event/remove_from_cart' q="reset=1&id=`$event_in_cart.event.id`"}">{ts}Remove{/ts}</a>
+            </td>
+          </tr>
+        {/if}
+      {/foreach}
+      </tbody>
+    </table>
+    <a href="{crmURL p='civicrm/event/cart_checkout'}" class="button crm-check-out-button"><i class="crm-i fa-credit-card"></i> {ts}Checkout{/ts}</a>
+  </div>
 {/if}
 <a href="{crmURL p="civicrm/event/ical" q="reset=1&page=1&html=1"}">&laquo; Back to Event List</a>
diff --git a/civicrm/templates/CRM/Event/Page/ICalendar.tpl b/civicrm/templates/CRM/Event/Page/ICalendar.tpl
deleted file mode 100644
index 684cc1c8ca..0000000000
--- a/civicrm/templates/CRM/Event/Page/ICalendar.tpl
+++ /dev/null
@@ -1,44 +0,0 @@
-{*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
-*}
-{* Displays current and upcoming public Events Listing as an HTML page. *}
-{include file="CRM/common/jsortable.tpl"}
-<table id="options" class="display">
-<thead>
-<tr>
-    <th>{ts}Event{/ts}</th>
-    <th></th>
-    <th>{ts}When{/ts}</th>
-    <th>{ts}Location{/ts}</th>
-    <th>{ts}Category{/ts}</th>
-    <th>{ts}Email{/ts}</th>
-    {if $registration_links}<th>{ts}Register{/ts}</th>{/if}
-</tr>
-</thead>
-{foreach from=$events key=uid item=event}
-<tr class="{cycle values="odd-row,even-row"} {$row.class}">
-    <td><a href="{crmURL p='civicrm/event/info' q="reset=1&id=`$event.event_id`"}" title="{ts}read more{/ts}"><strong>{$event.title}</strong></a></td>
-    <td>{if $event.summary}{$event.summary} (<a href="{crmURL p='civicrm/event/info' q="reset=1&id=`$event.event_id`"}" title="{ts}details...{/ts}">{ts}read more{/ts}...</a>){else}&nbsp;{/if}</td>
-    <td class="nowrap" data-order="{$event.start_date|crmDate:'%Y-%m-%d'}">
-        {if $event.start_date}{$event.start_date|crmDate}{if $event.end_date}<br /><em>{ts}through{/ts}</em><br />{strip}
-            {* Only show end time if end date = start date *}
-            {if $event.end_date|date_format:"%Y%m%d" == $event.start_date|date_format:"%Y%m%d"}
-                {$event.end_date|crmDate:0:1}
-            {else}
-                {$event.end_date|crmDate}
-            {/if}{/strip}{/if}
-        {else}{ts}(not available){/ts}{/if}
-    </td>
-    <td>{if $event.is_show_location EQ 1 AND $event.location}{$event.location}{else}{ts}(not available){/ts}{/if}</td>
-    <td>{if $event.event_type}{$event.event_type}{else}&nbsp;{/if}</td>
-    <td>{if $event.contact_email}<a href="mailto:{$event.contact_email}">{$event.contact_email}</a>{else}&nbsp;{/if}</td>
-    {if $registration_links}<td><a href="{$event.registration_link}">{$event.registration_link_text}</a></td>{/if}
-</tr>
-{/foreach}
-</table>
diff --git a/civicrm/templates/CRM/Event/Page/List.tpl b/civicrm/templates/CRM/Event/Page/List.tpl
new file mode 100644
index 0000000000..94a2b12913
--- /dev/null
+++ b/civicrm/templates/CRM/Event/Page/List.tpl
@@ -0,0 +1,51 @@
+{*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+*}
+{* Displays current and upcoming public Events Listing as an HTML page. *}
+{include file="CRM/common/jsortable.tpl"}
+<div class="crm-section crm-event-list">
+  {if $eventCartEnabled}
+    <a href="{crmURL p='civicrm/event/view_cart' }" class="button crm-shoppingcart-button"><i class="crm-i fa-shopping-cart"></i> {ts}View Cart{/ts}</a>
+    <a href="{crmURL p='civicrm/event/cart_checkout'}" class="button crm-check-out-button"><i class="crm-i fa-credit-card"></i> {ts}Checkout{/ts}</a>
+  {/if}
+
+  <table id="options" class="display">
+    <thead>
+    <tr>
+      <th>{ts}Event{/ts}</th>
+      <th></th>
+      <th>{ts}When{/ts}</th>
+      <th>{ts}Location{/ts}</th>
+      <th>{ts}Category{/ts}</th>
+      <th>{ts}Email{/ts}</th>
+      {if $registration_links}<th>{ts}Register{/ts}</th>{/if}
+    </tr>
+    </thead>
+    {foreach from=$events key=uid item=event}
+      <tr class="{cycle values="odd-row,even-row"} {$row.class}">
+        <td><a href="{crmURL p='civicrm/event/info' q="reset=1&id=`$event.event_id`"}" title="{ts}read more{/ts}"><strong>{$event.title}</strong></a></td>
+        <td>{if $event.summary}{$event.summary} (<a href="{crmURL p='civicrm/event/info' q="reset=1&id=`$event.event_id`"}" title="{ts}details...{/ts}">{ts}read more{/ts}...</a>){else}&nbsp;{/if}</td>
+        <td class="nowrap" data-order="{$event.start_date|crmDate:'%Y-%m-%d'}">
+          {if $event.start_date}{$event.start_date|crmDate}{if $event.end_date}<br /><em>{ts}through{/ts}</em><br />{strip}
+            {* Only show end time if end date = start date *}
+            {if $event.end_date|date_format:"%Y%m%d" == $event.start_date|date_format:"%Y%m%d"}
+              {$event.end_date|crmDate:0:1}
+            {else}
+              {$event.end_date|crmDate}
+            {/if}{/strip}{/if}
+          {else}{ts}(not available){/ts}{/if}
+        </td>
+        <td>{if $event.is_show_location EQ 1 AND $event.location}{$event.location}{else}{ts}(not available){/ts}{/if}</td>
+        <td>{if $event.event_type}{$event.event_type}{else}&nbsp;{/if}</td>
+        <td>{if $event.contact_email}<a href="mailto:{$event.contact_email}">{$event.contact_email}</a>{else}&nbsp;{/if}</td>
+        {if $registration_links}<td><a href="{$event.registration_link}">{$event.registration_link_text}</a></td>{/if}
+      </tr>
+    {/foreach}
+  </table>
+</div>
diff --git a/civicrm/templates/CRM/Member/Form/Membership.tpl b/civicrm/templates/CRM/Member/Form/Membership.tpl
index 5ff58b240f..ca9071bb70 100644
--- a/civicrm/templates/CRM/Member/Form/Membership.tpl
+++ b/civicrm/templates/CRM/Member/Form/Membership.tpl
@@ -8,10 +8,13 @@
  +--------------------------------------------------------------------+
 *}
 {* this template is used for adding/editing/deleting memberships for a contact  *}
-{if $cancelAutoRenew}
+{if $isRecur}
   <div class="messages status no-popup">
     <div class="icon inform-icon"></div>
-    <p>{ts 1=$cancelAutoRenew}This membership is set to renew automatically {if $endDate}on {$endDate|crmDate}{/if}. You will need to cancel the auto-renew option if you want to modify the Membership Type or Membership Status: <a href="%1">Cancel auto-renew</a>{/ts}</p>
+    <p>{ts}This membership is set to renew automatically {if $endDate}on {$endDate|crmDate}{/if}. Please be aware that any changes that you make here may not be reflected in the payment processor. Please ensure that you alter the related subscription at the payment processor.{/ts}</p>
+    {if $cancelAutoRenew}<p>{ts 1=$cancelAutoRenew}To stop the automatic renewal:
+      <a href="%1">Cancel auto-renew</a>
+    {/ts}</p>{/if}
   </div>
 {/if}
 <div class="spacer"></div>
@@ -73,7 +76,16 @@
         </tr>
         <tr class="crm-membership-form-block-membership_type_id">
           <td class="label">{$form.membership_type_id.label}</td>
-          <td><span id='mem_type_id'>{$form.membership_type_id.html}</span>
+          <td id="mem_type_id-readonly">
+            <span id="membership_type_id_0-readonly"></span> : <span id="membership_type_id_1-readonly"></span>
+            <span id="mem-type-override">
+              <a href="#" class="crm-hover-button action-item override-mem-type" id="show-mem-type">
+                {ts}Override organization and type{/ts}
+              </a>
+              {help id="override_membership_type"}
+            </span>
+          </td>
+          <td id="mem_type_id-editable"><span id='mem_type_id'>{$form.membership_type_id.html}</span>
             {if $hasPriceSets}
               <span id='totalAmountORPriceSet'> {ts}OR{/ts}</span>
               <span id='selectPriceSet'>{$form.price_set_id.html}</span>
@@ -289,7 +301,7 @@
         var taxRates = {/literal}{$taxRates}{literal};
         var taxTerm = {/literal}{$taxTerm|@json_encode}{literal};
         var taxRate = taxRates[allMemberships[memType]['financial_type_id']];
-        var currency = {/literal}{$currency|@json_encode}{literal};
+        var currency = {/literal}{$currency_symbol|@json_encode}{literal};
         var taxAmount = (taxRate/100)*allMemberships[memType]['total_amount_numeric'];
         taxAmount = isNaN (taxAmount) ? 0:taxAmount;
         if (term) {
@@ -349,6 +361,25 @@
         setDifferentContactBlock();
       });
 
+      // give option to override membership type for auto-renew memberships - dev/core#1331
+      {/literal}
+      {if $isRecur}
+        cj('#membership_type_id_0-readonly').text(cj('#membership_type_id_0 option:selected').text());
+        cj('#membership_type_id_1-readonly').text(cj('#membership_type_id_1 option:selected').text());
+        cj('#mem_type_id-readonly').show();
+        cj('#mem_type_id-editable').hide();
+      {else}
+        cj('#mem_type_id-readonly').hide();
+        cj('#mem_type_id-editable').show();
+      {/if}
+      {literal}
+
+      cj('#show-mem-type').click( function( e ) {
+        e.preventDefault();
+        cj('#mem_type_id-readonly').hide();
+        cj('#mem_type_id-editable').show();
+      });
+
       // give option to override end-date for auto-renew memberships
       {/literal}
       {if $isRecur && $endDate}
diff --git a/civicrm/templates/CRM/Member/Page/Tab.hlp b/civicrm/templates/CRM/Member/Page/Tab.hlp
index cf5e8bd076..b72c562d23 100644
--- a/civicrm/templates/CRM/Member/Page/Tab.hlp
+++ b/civicrm/templates/CRM/Member/Page/Tab.hlp
@@ -28,3 +28,10 @@
 {htxt id="override_end_date"}
   <p>{ts}If CiviCRM's membership end-date is different from when the payment processor will next collect a payment, various problems can occur. Members may experience a gap in their membership, and the renewal date may get changed from what is manually entered. Use care when modifying the End Date value, and check the associated recurring payment in your payment processor system so they always match.{/ts}</p>
 {/htxt}
+
+{htxt id="override_membership_type-title"}
+{ts}Override Membership Type for Auto-renew Memberships{/ts}
+{/htxt}
+{htxt id="override_membership_type"}
+  <p>{ts}This membership is set to renew automatically. Take care when you change the membership type. Make sure that you also change the related payment at the payment processor. Otherwise future payments may be for the wrong amount.{/ts}</p>
+{/htxt}
diff --git a/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl b/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl
index baa006e4ac..04c6ca30e1 100644
--- a/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl
+++ b/civicrm/templates/CRM/Report/Form/Tabs/Filters.tpl
@@ -36,7 +36,7 @@
                 {if $field.operatorType & 4}
                   <tr class="report-contents crm-report crm-report-criteria-filter crm-report-criteria-filter-{$tableName}">
                     <td class="label report-contents">{$field.title}</td>
-                      {include file="CRM/Core/DateRange.tpl" fieldName=$fieldName from='_from' to='_to'}
+                      {include file="CRM/Core/DatePickerRangeWrapper.tpl" fieldName=$fieldName hideRelativeLabel=1, from='_from' to='_to'}
                   </tr>
                 {elseif $form.$fieldOp.html}
                   <tr class="report-contents crm-report crm-report-criteria-filter crm-report-criteria-filter-{$tableName}" {if $field.no_display} style="display: none;"{/if}>
diff --git a/civicrm/templates/CRM/common/batchCopy.tpl b/civicrm/templates/CRM/common/batchCopy.tpl
index ebcca6c73a..a1b1201619 100644
--- a/civicrm/templates/CRM/common/batchCopy.tpl
+++ b/civicrm/templates/CRM/common/batchCopy.tpl
@@ -37,7 +37,7 @@
       // wysiwyg editor, advanced multi-select ( to do )
       if ( elementType == 'radio' ) {
         firstElementValue = elementId.filter(':checked').eq(0).val();
-        elementId.filter("[value=" + firstElementValue + "]").prop("checked",true).change();
+        elementId.filter("[value='" + firstElementValue + "']").prop("checked",true).change();
       }
       else if ( elementType == 'checkbox' ) {
         // handle checkbox
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/.gitignore b/civicrm/vendor/adrienrn/php-mimetyper/.gitignore
new file mode 100644
index 0000000000..4a5fdabde3
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/.gitignore
@@ -0,0 +1,7 @@
+composer.phar
+/vendor/
+
+# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
+node_modules/
diff --git a/civicrm/vendor/katzien/php-mime-type/LICENSE b/civicrm/vendor/adrienrn/php-mimetyper/LICENSE
similarity index 95%
rename from civicrm/vendor/katzien/php-mime-type/LICENSE
rename to civicrm/vendor/adrienrn/php-mimetyper/LICENSE
index 880ba47e22..ba6aa38094 100644
--- a/civicrm/vendor/katzien/php-mime-type/LICENSE
+++ b/civicrm/vendor/adrienrn/php-mimetyper/LICENSE
@@ -1,6 +1,6 @@
-The MIT License (MIT)
+MIT License
 
-Copyright (c) 2015, Kat Zien
+Copyright (c) 2016 Hussard
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
-
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/README.md b/civicrm/vendor/adrienrn/php-mimetyper/README.md
new file mode 100644
index 0000000000..666cc47a0a
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/README.md
@@ -0,0 +1,115 @@
+# php-mimetyper
+
+PHP mime type and extension mapping library: built with [jshttp/mime-db](http://github.com/jshttp/mime-db), compatible with Symfony and Laravel.
+
+```php
+use MimeTyper\Repository\MimeDbRepository;
+
+$mimeRepository = new MimeDbRepository();
+
+$mimeRepository->findExtensions("image/jpeg"); // ["jpeg","jpg","jpe"]
+$mimeRepository->findExtension("image/jpeg"); // "jpeg"
+
+$mimeRepository->findType("html"); // "html"
+$mimeRepository->findType("js"); // 'application/javascript'
+
+```
+
+> The most complete and up-to-date mime type mapping for PHP!
+
+The goal is to provide a complete and up-to-date mime types mapping for PHP and build a comprehensive and simple interface for PHP. This package is heavily inspired from [dflydev](https://github.com/dflydev/dflydev-apache-mime-types) work and extends it.
+
+## Mime types mapping, the right way.
+
+This library uses [jshttp/mime-db](http://github.com/jshttp/mime-db) as its default mapping which aggregates data from multiple sources and creates a single `db.json` making it the most complete two ways mapping, from mime to extension and extension to mime types too.
+
+- [IANA](http://www.iana.org/assignments/media-types/media-types.xhtml)
+- [Apache](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)
+- [Nginx](http://hg.nginx.org/nginx/file/tip/conf/mime.types)
+- Some (very) useful custom aliases;
+
+## Custom mime types and custom repositories
+
+Some custom types (aliases really) are maintained locally too, in the same JSON format as jshttp/mime-db. 
+
+```php
+
+use MimeTyper\Repository\ExtendedRepository;
+
+$mimeRepostory = new ExtendedRepository();
+
+$mimeRepository->findExtensions("text/x-php"); // ["php", "php2", "php3", "php4", "php5"]
+
+$mimeRepository->findTypes("php"); // ["text/x-php", "application/x-php", "text/php", "application/php", "application/x-httpd-php"]
+$mimeRepository->findType("php"); // "text/x-php"
+
+```
+
+The reason to maintain aliases locally helps with overall compatibility between mime type guessing methods. Tools detecting mime types don't always return standard mime type or the standard mime type does not exist. All of those custom mime types might be [added to jshttp/mime-db custom types in the end](https://github.com/jshttp/mime-db/issues/49).
+
+**Example:** Debian will detect a PHP file as `text/x-php` while browsers will send `application/x-httpd-php`. It goes the same with files such as Javascript (`application/javascript` vs `text/javascript`) or Microsoft Office / Libre Office files.
+
+Don't hesitate to make a pull request to discuss this.
+
+## Mime types for Symfony and Laravel
+
+This library is compatible with your Symfony or Laravel app to enjoy the completeness of the mapping.
+
+Use the `ExtraMimeTypeExtensionGuesser` as a bridge class between Symfony `ExtensionGuesser` and this package `RepositoryInterface`.
+
+```php
+
+use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
+
+use MimeTyper\Repository\ExtendedRepository;
+use MimeTyper\Symfony\ExtraMimeTypeExtensionGuesser;
+
+$symfonyGuesser = ExtensionGuesser::getInstance();
+$extraGuesser = new ExtraMimeTypeExtensionGuesser(
+    new ExtendedRepository()
+);
+$symfonyGuesser->register($extraGuesser);
+
+```
+
+This example uses the `ExtendedRepository` (mime-db and local custom mime types), you can use the default `MimeDbRepository`, implement your own or use a `CompositeRepository` to aggregate multiple repostories.
+
+## Safe detection of mime type in PHP
+
+Before mapping type to extension or extension to type, you need to be able to properly detect the mime type of a file.
+
+For security reasons, **do not trust browsers**, eg `$_FILES['your_file']['type']`, when it comes to detect the mime type of a file.
+
+To safely detect the mime type of a file, . Symfony is giving a great example with their MimeTypeGuesser implementation of:
+
+- [FileinfoMimeTypeGuesser](https://github.com/symfony/http-foundation/blob/3.1/File/MimeType/FileinfoMimeTypeGuesser.php)
+- [FileBinaryMimeTypeGuesser](https://github.com/symfony/http-foundation/blob/3.1/File/MimeType/FileBinaryMimeTypeGuesser.php)
+
+It all ends up inspecting the file using [finfo](http://php.net/manual/en/function.finfo-open.php) and relies on magic db files. PHP will use its own magic db or your system magic db depending on your environement.
+
+## Other PHP libraries for mime types
+
+- [dflydev/dflydev-apache-mime-types](https://github.com/dflydev/dflydev-apache-mime-types)
+
+  Uses `mime.types` Apache file, comprehensive api. As stated before, php-mimetyper is heavily inspired by this, extending it to be a bit more complete using an external mapping and a wider interface.
+
+- [symfony/http-foundation](https://github.com/symfony/http-foundation/tree/master/File/MimeType)
+
+  Symfony provides a nice interface for guessing mime types and extensions but uses only a local mapping based on Apache registry, see above to bridge it to this package.
+
+- [davidpersson/mm](https://github.com/davidpersson/mm)
+
+  Library for media processing and mime type and extension guessing. Uses FreeDesktop magic.db file for the latter.
+
+- [Hoa/Mime](https://github.com/hoaproject/Mime)
+
+  The Hoa package to deal with mime types. Uses `mime.types` Apache file (local fallback) and relies on static methods.
+
+- [karwana/php-mime](https://github.com/karwana/php-mime)
+  
+  Uses `mime.types` Apache file and finfo, requires PHP >=5.4.
+
+- [PEAR/MIME_Type](https://github.com/pear/MIME_Type)
+
+  Detect the mime type of a file: uses internally finfo_file, mime_content_type or file command to guess the mime type.
+
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/composer.json b/civicrm/vendor/adrienrn/php-mimetyper/composer.json
new file mode 100644
index 0000000000..b36f30040b
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/composer.json
@@ -0,0 +1,19 @@
+{
+    "name": "adrienrn/php-mimetyper",
+    "description": "PHP mime type and extension mapping library: compatible with Symfony, powered by jshttp/mime-db",
+    "require": {
+        "dflydev/apache-mime-types": "^1.0"
+    },
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Hussard",
+            "email": "adrien.ricartnoblet@gmail.com"
+        }
+    ],
+    "autoload": {
+        "psr-4": {
+            "MimeTyper\\": "src/"
+        }
+    }
+}
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/package.json b/civicrm/vendor/adrienrn/php-mimetyper/package.json
new file mode 100644
index 0000000000..707f83428c
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "php-mimetyper",
+  "version": "0.2.2",
+  "description": "PHP mime type and extension mapping library: compatible with Symfony, powered by jshttp/mime-db",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/adrienrn/php-mimetyper.git"
+  },
+  "keywords": [
+    "php",
+    "mime",
+    "mimetype",
+    "symfony"
+  ],
+  "author": "Hussard <adrien.ricartnoblet@gmail.com>",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/adrienrn/php-mimetyper/issues"
+  },
+  "dependencies": {
+    "mime-db": "~1.23.0"
+  }
+}
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/resources/custom-types.json b/civicrm/vendor/adrienrn/php-mimetyper/resources/custom-types.json
new file mode 100644
index 0000000000..02c02b7a16
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/resources/custom-types.json
@@ -0,0 +1,32 @@
+{
+  "text/x-php": {
+    "compressible": true,
+    "sources": [
+      "https://packages.debian.org/sid/mime-support"
+    ],
+    "extensions": ["php", "php2", "php3", "php4", "php5"],
+    "_notes": "https://cweiske.de/tagebuch/php-mimetype.htm"
+  },
+  "application/x-php": {
+    "compressible": true,
+    "sources": [
+
+    ],
+    "extensions": ["php", "php2", "php3", "php4", "php5"],
+    "_notes": "https://cweiske.de/tagebuch/php-mimetype.htm"
+  },
+  "text/php": {
+    "compressible": true,
+    "sources": [
+    ],
+    "extensions": ["php", "php2", "php3", "php4", "php5"],
+    "_notes": "https://cweiske.de/tagebuch/php-mimetype.htm"
+  },
+  "application/php": {
+    "compressible": true,
+    "sources": [
+    ],
+    "extensions": ["php", "php2", "php3", "php4", "php5"],
+    "_notes": "https://cweiske.de/tagebuch/php-mimetype.htm"
+  }
+}
\ No newline at end of file
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/AbstractRepository.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/AbstractRepository.php
new file mode 100644
index 0000000000..ddaab28cb5
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/AbstractRepository.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace MimeTyper\Repository;
+
+use Dflydev\ApacheMimeTypes\AbstractRepository as BaseAbstractRepository;
+
+/**
+ * Abstract implementation for mimetyper repositories.
+ *
+ * @since 0.1.0
+ * @see MimeTyper\Repository\RepositoryInterface
+ */
+abstract class AbstractRepository extends BaseAbstractRepository implements RepositoryInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function setFromMap(array $map)
+    {
+        $this->typeToExtensions = $map;
+
+        $this->extensionToType = array();
+        foreach ($this->typeToExtensions as $type => $extensions) {
+            foreach ($extensions as $extension) {
+                if (!isset($this->extensionToType[$extension])) {
+                    $this->extensionToType[$extension] = array_unique(array($type));
+                } else {
+                    $this->extensionToType[$extension] = array_unique(array_merge($this->extensionToType[$extension], array($type)));
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findExtension($type)
+    {
+        // Get all matching extensions.
+        $extensions = $this->findExtensions($type);
+
+        if (count($extensions) > 0) {
+            // Return first match.
+            return $extensions[0];
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasExtension($extension)
+    {
+        $extensionToTypes = $this->dumpExtensionToType();
+
+        return (isset($extensionToType[$extension]));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findTypes($extension)
+    {
+        $this->init();
+
+        if (isset($this->extensionToType[$extension])) {
+            return $this->extensionToType[$extension];
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findType($extension)
+    {
+        // Get all matching extensions.
+        $types = $this->findTypes($extension);
+
+        if (count($types) > 0) {
+            // Return first match.
+            return $types[0];
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasType($type)
+    {
+        $typeToExtensions = $this->dumpTypeToExtensions();
+
+        return (isset($typeToExtensions[$type]) && count($typeToExtensions[$type]) > 0);
+    }
+}
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/CompositeRepository.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/CompositeRepository.php
new file mode 100644
index 0000000000..4a160a9a95
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/CompositeRepository.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace MimeTyper\Repository;
+
+use Dflydev\ApacheMimeTypes\CompositeRepository as BaseCompositeRepository;
+
+class CompositeRepository extends BaseCompositeRepository implements RepositoryInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpExtensionToType()
+    {
+        $extensionToType = array();
+        foreach ($this->repositories as $repository) {
+            $repositoryExtensionToType = $repository->dumpExtensionToType();
+            foreach ($repositoryExtensionToType as $extension => $type) {
+                if (!isset($extensionToType[$extension])) {
+                    $extensionToType[$extension] = $type;
+                } else {
+                    $extensionToType[$extension] = array_unique(array_merge($extensionToType[$extension], $type));
+                }
+            }
+        }
+        return $extensionToType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findExtension($type)
+    {
+        // Get all matching extensions.
+        $extensions = $this->findExtensions($type);
+
+        if (count($extensions) > 0) {
+            // Return first match.
+            return $extensions[0];
+        }
+
+        return null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasExtension($extension)
+    {
+        $extensionToTypes = $this->dumpExtensionToType();
+
+        return (isset($extensionToTypes[$extension]));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findTypes($extension)
+    {
+        $extensionToTypes = $this->dumpExtensionToType();
+
+        if (isset($extensionToTypes[$extension])) {
+            return $extensionToTypes[$extension];
+        }
+
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function hasType($type)
+    {
+        $typeToExtensions = $this->dumpTypeToExtensions();
+
+        return (isset($typeToExtensions[$type]) && count($typeToExtensions[$type]) > 0);
+    }
+}
\ No newline at end of file
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/ExtendedRepository.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/ExtendedRepository.php
new file mode 100644
index 0000000000..9ea71647ac
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/ExtendedRepository.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace MimeTyper\Repository;
+
+/**
+ * This shim repository aggregates all repositories to get the most complete
+ * mapping.
+ *
+ * @since 0.1.0
+ */
+class ExtendedRepository extends CompositeRepository
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(array $repositories = array())
+    {
+        parent::__construct(
+            array_merge(
+                array(
+                    new MimeDbRepository(dirname(dirname(__DIR__)) . "/resources/custom-types.json"),
+                    new MimeDbRepository(),
+                ),
+                $repositories
+            )
+        );
+    }
+}
\ No newline at end of file
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/MimeDbRepository.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/MimeDbRepository.php
new file mode 100644
index 0000000000..a2517504b6
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/MimeDbRepository.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace MimeTyper\Repository;
+
+/**
+ * Two-ways mapping (type => extensions and extension => types), this class is a
+ * PHP wrapper around the awesome jshttp/mime-db db.json mapping.
+ *
+ * Why jshttp/mime-db? It's the most complete mime type database out there,
+ * compiled from IANA, Apache and custom type from community. It also defines a
+ * nice format for mime type to extension mapping, including source (IANA,
+ * Apache, custom), compressible status, notes, etc.
+ *
+ * @since 0.1.0
+ * @see http://github.com/jshttp/mime-db
+ */
+class MimeDbRepository extends AbstractRepository
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($filename = null)
+    {
+        if (null === $filename) {
+            $filename = dirname(dirname(__DIR__)) . '/node_modules/mime-db/db.json';
+        }
+        $this->filename = $filename;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function internalInit()
+    {
+        // Parse data from mime db.
+        $mimeDb = json_decode(file_get_contents($this->filename), true);
+
+        // Map from mime-db to simple mappping "mimetype" => array(ext1, ext2, ext3)
+        $mimeDbExtensions = array_map(
+            function ($type) {
+                // Format for 'jshttp/mime-db' is as follow:
+                //    "application/xml": {
+                //        "source": "iana",
+                //        "compressible": true,
+                //        "extensions": ["xml","xsl","xsd","rng"]
+                //    },
+                return (isset($type["extensions"])) ? $type["extensions"] : array();
+            },
+            array_values($mimeDb)
+        );
+
+        $this->setFromMap(array_combine(array_keys($mimeDb), $mimeDbExtensions));
+    }
+}
\ No newline at end of file
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/RepositoryInterface.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/RepositoryInterface.php
new file mode 100644
index 0000000000..844cc6e6d6
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Repository/RepositoryInterface.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace MimeTyper\Repository;
+
+interface RepositoryInterface
+{
+    /**
+     * Find the extension matching $type mime type.
+     *
+     * If multiple extensions match the type, the main (prefered) is returned.
+     *
+     * @param  string $type.
+     *
+     * @return string.
+     *
+     * @see RepositoryInterface\findExtensions()
+     */
+    public function findExtension($type);
+
+    /**
+     * Does extension $extension exists?
+     *
+     * @param  string  $extension
+     *
+     * @return boolean
+     */
+    public function hasExtension($extension);
+
+
+    /**
+     * Find all types matching $extension extension.
+     *
+     * @param  string $extension.
+     *
+     * @return array.
+     */
+    public function findTypes($extension);
+
+    /**
+     * Does type $type exists?
+     *
+     * @param  string  $type
+     *
+     * @return boolean
+     */
+    public function hasType($type);
+}
\ No newline at end of file
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/ExtraMimeTypeExtensionGuesser.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/ExtraMimeTypeExtensionGuesser.php
new file mode 100644
index 0000000000..21331a6437
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/ExtraMimeTypeExtensionGuesser.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace MimeTyper\Symfony;
+
+if (class_exists("Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesserInterface")) {
+    class_alias(
+        "Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesserInterface",
+        "Mimetyper\Symfony\ExtensionGuesserInterface"
+    );
+} else {
+    /*
+     * Some project with PHP 5.3+ compatibility forced the fork of symfony/http-foundation.
+     * Look away, don't judge, bisous.
+     */
+    class_alias(
+        "Madhouse\HttpFoundation\File\MimeType\ExtensionGuesserInterface",
+        "Mimetyper\Symfony\ExtensionGuesserInterface"
+    );
+}
+
+/**
+ * Wrapper class for Symfony / Laravel UploadedFile extension guessing.
+ *
+ * ExtensionGuesser being a singleton, you can register this ExtensionGuesser
+ * like this:
+ *
+ *   use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
+ *
+ *   use MimeTyper\Repository\ExtendedRepository;
+ *   use MimeTyper\Symfony\ExtraMimeTypeExtensionGuesser;
+ *
+ *   $symfonyGuesser = ExtensionGuesser::getInstance();
+ *   $extraGuesser = new ExtraMimeTypeExtensionGuesser(
+ *     new ExtendedRepository()
+ *   );
+ *
+ *   $symfonyGuesser->register($extraGuesser);
+ *
+ * That way, you can enjoy the extended mapping, way more complete than default
+ * php array from symfony.
+ *
+ * @since 0.1.0
+ * @see Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser
+ */
+class ExtraMimeTypeExtensionGuesser implements ExtensionGuesserInterface
+{
+    /**
+     * Repository instance for mime type / extension mapping.
+     *
+     * @var Madhouse\Mime\Repository\MimeRepositoryInterface
+     */
+    protected $repository;
+
+    public function __construct($repository)
+    {
+        $this->repository = $repository;
+    }
+
+    public function guess($type)
+    {
+        return $this->repository->findExtension($type);
+    }
+}
\ No newline at end of file
diff --git a/civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/MimeContentMimeTypeGuesser.php b/civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/MimeContentMimeTypeGuesser.php
new file mode 100644
index 0000000000..2afe234410
--- /dev/null
+++ b/civicrm/vendor/adrienrn/php-mimetyper/src/Symfony/MimeContentMimeTypeGuesser.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace MimeTyper\Symfony;
+
+if (class_exists("Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface")) {
+    class_alias(
+        "Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface",
+        "Mimetyper\Symfony\MimeTypeGuesserInterface"
+    );
+} else {
+    /*
+     * Some project with PHP 5.3+ compatibility forced the fork of symfony/http-foundation.
+     * Look away, don't judge, bisous.
+     */
+    class_alias(
+        "Madhouse\HttpFoundation\File\MimeType\MimeTypeGuesserInterface",
+        "Mimetyper\Symfony\MimeTypeGuesserInterface"
+    );
+}
+
+/**
+ * Guesses the mime type using the deprecated – but yet useful sometimes,
+ * mime_content_type.
+ *
+ * @author Hussard <adrien.ricartnoblet@gmail.com>
+ * @since  0.2.0
+ */
+class MimeContentMimeTypeGuesser implements MimeTypeGuesserInterface
+{
+    /**
+     * Constructor.
+     *
+     * @link http://php.net/manual/fr/function.mime-content-type.php
+     */
+    public function __construct()
+    {
+    }
+
+    /**
+     * Returns whether this guesser is supported on the current OS/PHP setup.
+     *
+     * @return bool
+     */
+    public static function isSupported()
+    {
+        return function_exists('mime_content_type');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function guess($path)
+    {
+        if (!is_file($path)) {
+            throw new FileNotFoundException($path);
+        }
+
+        if (!is_readable($path)) {
+            throw new AccessDeniedException($path);
+        }
+
+        if (!self::isSupported()) {
+            return;
+        }
+
+        return mime_content_type($path);
+    }
+}
diff --git a/civicrm/vendor/autoload.php b/civicrm/vendor/autoload.php
index cc974321b6..7a6d514f61 100644
--- a/civicrm/vendor/autoload.php
+++ b/civicrm/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer/autoload_real.php';
 
-return ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12::getLoader();
+return ComposerAutoloaderInit36ec71c631e397a60b32ad2c921d6a0e::getLoader();
diff --git a/civicrm/vendor/composer/autoload_namespaces.php b/civicrm/vendor/composer/autoload_namespaces.php
index 4e9251eb28..94d03e5001 100644
--- a/civicrm/vendor/composer/autoload_namespaces.php
+++ b/civicrm/vendor/composer/autoload_namespaces.php
@@ -17,6 +17,7 @@ return array(
     'Mail' => array($vendorDir . '/pear/mail'),
     'Log' => array($vendorDir . '/pear/log'),
     'File' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'),
+    'Dflydev\\ApacheMimeTypes' => array($vendorDir . '/dflydev/apache-mime-types/src'),
     'Crypt' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'),
     'Console' => array($vendorDir . '/pear/console_getopt'),
     'Civi\\' => array($baseDir . '/', $baseDir . '/tests/phpunit'),
diff --git a/civicrm/vendor/composer/autoload_psr4.php b/civicrm/vendor/composer/autoload_psr4.php
index 97050d2fbb..aeaf667827 100644
--- a/civicrm/vendor/composer/autoload_psr4.php
+++ b/civicrm/vendor/composer/autoload_psr4.php
@@ -26,7 +26,7 @@ return array(
     'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
     'PhpOffice\\PhpWord\\' => array($vendorDir . '/phpoffice/phpword/src/PhpWord'),
     'PhpOffice\\Common\\' => array($vendorDir . '/phpoffice/common/src/Common'),
-    'MimeType\\' => array($vendorDir . '/katzien/php-mime-type/src'),
+    'MimeTyper\\' => array($vendorDir . '/adrienrn/php-mimetyper/src'),
     'MJS\\TopSort\\Tests\\' => array($vendorDir . '/marcj/topsort/tests/Tests'),
     'MJS\\TopSort\\' => array($vendorDir . '/marcj/topsort/src'),
     'League\\Csv\\' => array($vendorDir . '/league/csv/src'),
diff --git a/civicrm/vendor/composer/autoload_real.php b/civicrm/vendor/composer/autoload_real.php
index d8e76ea1dd..7fcc72ef9f 100644
--- a/civicrm/vendor/composer/autoload_real.php
+++ b/civicrm/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php @generated by Composer
 
-class ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12
+class ComposerAutoloaderInit36ec71c631e397a60b32ad2c921d6a0e
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInit36ec71c631e397a60b32ad2c921d6a0e', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit36ec71c631e397a60b32ad2c921d6a0e', 'loadClassLoader'));
 
         $includePaths = require __DIR__ . '/include_paths.php';
         $includePaths[] = get_include_path();
@@ -31,7 +31,7 @@ class ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12
         if ($useStaticLoader) {
             require_once __DIR__ . '/autoload_static.php';
 
-            call_user_func(\Composer\Autoload\ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::getInitializer($loader));
+            call_user_func(\Composer\Autoload\ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::getInitializer($loader));
         } else {
             $map = require __DIR__ . '/autoload_namespaces.php';
             foreach ($map as $namespace => $path) {
@@ -52,19 +52,19 @@ class ComposerAutoloaderInit6c967c9af1d0ae1b662daec22162ed12
         $loader->register(true);
 
         if ($useStaticLoader) {
-            $includeFiles = Composer\Autoload\ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::$files;
+            $includeFiles = Composer\Autoload\ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::$files;
         } else {
             $includeFiles = require __DIR__ . '/autoload_files.php';
         }
         foreach ($includeFiles as $fileIdentifier => $file) {
-            composerRequire6c967c9af1d0ae1b662daec22162ed12($fileIdentifier, $file);
+            composerRequire36ec71c631e397a60b32ad2c921d6a0e($fileIdentifier, $file);
         }
 
         return $loader;
     }
 }
 
-function composerRequire6c967c9af1d0ae1b662daec22162ed12($fileIdentifier, $file)
+function composerRequire36ec71c631e397a60b32ad2c921d6a0e($fileIdentifier, $file)
 {
     if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
         require $file;
diff --git a/civicrm/vendor/composer/autoload_static.php b/civicrm/vendor/composer/autoload_static.php
index d47012b428..0800c2fc7b 100644
--- a/civicrm/vendor/composer/autoload_static.php
+++ b/civicrm/vendor/composer/autoload_static.php
@@ -4,7 +4,7 @@
 
 namespace Composer\Autoload;
 
-class ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12
+class ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e
 {
     public static $files = array (
         '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
@@ -62,7 +62,7 @@ class ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12
         ),
         'M' => 
         array (
-            'MimeType\\' => 9,
+            'MimeTyper\\' => 10,
             'MJS\\TopSort\\Tests\\' => 18,
             'MJS\\TopSort\\' => 12,
         ),
@@ -175,9 +175,9 @@ class ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12
         array (
             0 => __DIR__ . '/..' . '/phpoffice/common/src/Common',
         ),
-        'MimeType\\' => 
+        'MimeTyper\\' => 
         array (
-            0 => __DIR__ . '/..' . '/katzien/php-mime-type/src',
+            0 => __DIR__ . '/..' . '/adrienrn/php-mimetyper/src',
         ),
         'MJS\\TopSort\\Tests\\' => 
         array (
@@ -304,6 +304,13 @@ class ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12
                 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib',
             ),
         ),
+        'D' => 
+        array (
+            'Dflydev\\ApacheMimeTypes' => 
+            array (
+                0 => __DIR__ . '/..' . '/dflydev/apache-mime-types/src',
+            ),
+        ),
         'C' => 
         array (
             'Crypt' => 
@@ -488,11 +495,11 @@ class ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12
     public static function getInitializer(ClassLoader $loader)
     {
         return \Closure::bind(function () use ($loader) {
-            $loader->prefixLengthsPsr4 = ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::$prefixLengthsPsr4;
-            $loader->prefixDirsPsr4 = ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::$prefixDirsPsr4;
-            $loader->prefixesPsr0 = ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::$prefixesPsr0;
-            $loader->fallbackDirsPsr0 = ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::$fallbackDirsPsr0;
-            $loader->classMap = ComposerStaticInit6c967c9af1d0ae1b662daec22162ed12::$classMap;
+            $loader->prefixLengthsPsr4 = ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::$prefixDirsPsr4;
+            $loader->prefixesPsr0 = ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::$prefixesPsr0;
+            $loader->fallbackDirsPsr0 = ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::$fallbackDirsPsr0;
+            $loader->classMap = ComposerStaticInit36ec71c631e397a60b32ad2c921d6a0e::$classMap;
 
         }, null, ClassLoader::class);
     }
diff --git a/civicrm/vendor/composer/installed.json b/civicrm/vendor/composer/installed.json
index 1f4846cbb7..3ff584c8a2 100644
--- a/civicrm/vendor/composer/installed.json
+++ b/civicrm/vendor/composer/installed.json
@@ -1,4 +1,42 @@
 [
+    {
+        "name": "adrienrn/php-mimetyper",
+        "version": "0.2.2",
+        "version_normalized": "0.2.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/adrienrn/php-mimetyper.git",
+            "reference": "702e00a604b4baed34d69730ce055e05c0f43932"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/adrienrn/php-mimetyper/zipball/702e00a604b4baed34d69730ce055e05c0f43932",
+            "reference": "702e00a604b4baed34d69730ce055e05c0f43932",
+            "shasum": ""
+        },
+        "require": {
+            "dflydev/apache-mime-types": "^1.0"
+        },
+        "time": "2018-09-27T09:45:05+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "MimeTyper\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Hussard",
+                "email": "adrien.ricartnoblet@gmail.com"
+            }
+        ],
+        "description": "PHP mime type and extension mapping library: compatible with Symfony, powered by jshttp/mime-db"
+    },
     {
         "name": "cache/integration-tests",
         "version": "0.16.0",
@@ -262,6 +300,63 @@
         ],
         "description": "Provides a way to patch Composer packages."
     },
+    {
+        "name": "dflydev/apache-mime-types",
+        "version": "v1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/dflydev/dflydev-apache-mime-types.git",
+            "reference": "f30a57e59b7476e4c5270b6a0727d79c9c0eb861"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/dflydev/dflydev-apache-mime-types/zipball/f30a57e59b7476e4c5270b6a0727d79c9c0eb861",
+            "reference": "f30a57e59b7476e4c5270b6a0727d79c9c0eb861",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3"
+        },
+        "require-dev": {
+            "twig/twig": "1.*"
+        },
+        "time": "2013-05-14T02:02:01+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Dflydev\\ApacheMimeTypes": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Dragonfly Development Inc.",
+                "email": "info@dflydev.com",
+                "homepage": "http://dflydev.com"
+            },
+            {
+                "name": "Beau Simensen",
+                "email": "beau@dflydev.com",
+                "homepage": "http://beausimensen.com"
+            }
+        ],
+        "description": "Apache MIME Types",
+        "keywords": [
+            "apache",
+            "mime",
+            "mimetypes"
+        ]
+    },
     {
         "name": "dompdf/dompdf",
         "version": "v0.8.3",
@@ -559,53 +654,6 @@
             "url"
         ]
     },
-    {
-        "name": "katzien/php-mime-type",
-        "version": "2.1.0",
-        "version_normalized": "2.1.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/katzien/PhpMimeType.git",
-            "reference": "159dfbdcd5906442f3dad89951127f0b9dfa3b78"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/katzien/PhpMimeType/zipball/159dfbdcd5906442f3dad89951127f0b9dfa3b78",
-            "reference": "159dfbdcd5906442f3dad89951127f0b9dfa3b78",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.6"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "5.*",
-            "satooshi/php-coveralls": "1.*"
-        },
-        "time": "2017-03-23T02:05:33+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "MimeType\\": "src/"
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Kat Zien"
-            }
-        ],
-        "description": "A PHP library to detect the mime type of files.",
-        "homepage": "https://github.com/katzien/PhpMimeType",
-        "keywords": [
-            "mimetype",
-            "php"
-        ],
-        "abandoned": true
-    },
     {
         "name": "league/csv",
         "version": "9.2.1",
@@ -949,6 +997,11 @@
         },
         "time": "2017-04-11T17:27:29+00:00",
         "type": "library",
+        "extra": {
+            "patches_applied": {
+                "Apply CiviCRM Customisations for CRM-1367 and CRM-5946": "https://raw.githubusercontent.com/civicrm/civicrm-core/36319938a5bf26c1e7e2110a26a65db6a5979268/tools/scripts/composer/patches/pear-mail.patch"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-0": {
diff --git a/civicrm/vendor/dflydev/apache-mime-types/.gitignore b/civicrm/vendor/dflydev/apache-mime-types/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/civicrm/vendor/dflydev/apache-mime-types/.travis.yml b/civicrm/vendor/dflydev/apache-mime-types/.travis.yml
new file mode 100644
index 0000000000..9baecfa001
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/.travis.yml
@@ -0,0 +1,11 @@
+language: php
+
+php:
+  - 5.3.3
+  - 5.3
+  - 5.4
+
+before_script:
+  - composer install
+
+script: phpunit --coverage-text --verbose
diff --git a/civicrm/vendor/dflydev/apache-mime-types/README.md b/civicrm/vendor/dflydev/apache-mime-types/README.md
new file mode 100644
index 0000000000..f11ac220f9
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/README.md
@@ -0,0 +1,184 @@
+Apache MIME Types
+=================
+
+Parses Apache MIME Types files and provides a simple interface to find
+extensions by type and type by extension.
+
+
+Features
+--------
+
+ * Bundles `mime.types` from the Apache HTTP Project. ([see here][1])
+ * Bundles a JSON representation of Apache `mime.types`.
+ * Provides an interface for reading either flat Apache HTTP `mime.types`
+   or a JSON representation.
+
+
+Requirements
+------------
+
+ * PHP 5.3.3+
+
+Installation
+------------
+
+Through [Composer][3] as [dflydev/apache-mime-types][4].
+
+
+Usage
+-----
+
+### Parser
+
+Parses Apache MIME Types in the format of `mime.types` [found here][1].
+
+```php
+<?php
+$parser = new Dflydev\ApacheMimeTypes\Parser;
+
+$map = $parser->parse('/path/to/mime.types');
+```
+
+The return value from `parse` is an array mapping types to an array of
+extensions.
+
+```php
+<?php
+array(
+    'text/html' => array('html', 'htm'),
+);
+```
+
+
+### PhpRepository
+
+A repository backed by static PHP arrays.
+
+```php
+<?php
+$repository = new Dflydev\ApacheMimeTypes\PhpRepository;
+
+$type = $repository->findType('html');
+$extensions = $repository->findExtensions('text/html');
+
+var_dump($type);
+var_dump($extensions);
+
+//
+// Result
+//
+// string(9) "text/html"
+// array(2) {
+//   [0]=>
+//   string(4) "html"
+//   [1]=>
+//   string(3) "htm"
+// }
+//
+```
+
+
+### JsonRepository
+
+A repository backed by a JSON map of type to extensions.
+
+```json
+{
+    "text/html": ["html", "htm"]
+}
+```
+
+To use the embedded JSON:
+
+```php
+<?php
+$repository = new Dflydev\ApacheMimeTypes\JsonRepository;
+
+$type = $repository->findType('html');
+$extensions = $repository->findExtensions('text/html');
+
+var_dump($type);
+var_dump($extensions);
+
+//
+// Result
+//
+// string(9) "text/html"
+// array(2) {
+//   [0]=>
+//   string(4) "html"
+//   [1]=>
+//   string(3) "htm"
+// }
+//
+```
+
+To specify a specific JSON mapping:
+
+```php
+<?php
+$repository = new Dflydev\ApacheMimeTypes\JsonRepository('/path/to/mime.types.json');
+```
+
+### FlatRepository
+
+A repository backed by Apache MIME Types formatted `mime.types`. To use the embedded
+`mime.types`:
+
+```php
+<?php
+$repository = new Dflydev\ApacheMimeTypes\FlatRepository;
+
+$type = $repository->findType('html');
+$extensions = $repository->findExtensions('text/html');
+
+var_dump($type);
+var_dump($extensions);
+
+//
+// Result
+//
+// string(9) "text/html"
+// array(2) {
+//   [0]=>
+//   string(4) "html"
+//   [1]=>
+//   string(3) "htm"
+// }
+//
+```
+
+To specify a specific `mime.types` mapping:
+
+```php
+<?php
+$repository = new Dflydev\ApacheMimeTypes\FlatRepository('/path/to/mime.types');
+```
+
+
+License
+-------
+
+MIT, see LICENSE.
+
+
+Community
+---------
+
+If you have questions or want to help out, join us in the **#dflydev** channel
+on **irc.freenode.net**.
+
+
+Not Invented Here
+-----------------
+
+This project is based heavily on [skyzyx/mimetypes][2]. The major difference is
+that [skyzyx/mimetypes][2] is focussed on creating JSON files from Apache
+`mime.types` rather than providing a way to interact with Apache MIME Types as
+a data source.
+
+
+[1]: https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
+[2]: https://github.com/skyzyx/mimetypes
+[3]: http://getcomposer.org/
+[4]: https://packagist.org/packages/dflydev/apache-mime-types
diff --git a/civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types b/civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types
new file mode 100755
index 0000000000..7681d790df
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types
@@ -0,0 +1,4 @@
+#!/usr/bin/env php
+<?php
+
+include('rebuild-apache-mime-types.php');
diff --git a/civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types.php b/civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types.php
new file mode 100644
index 0000000000..4299dbf92a
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/bin/rebuild-apache-mime-types.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+if (!class_exists('Twig_Environment')) {
+    echo 'You must set up the project dev dependencies, run the following commands:'.PHP_EOL.
+        'php composer.phar install --dev'.PHP_EOL;
+    exit(1);
+}
+
+$repository = new Dflydev\ApacheMimeTypes\FlatRepository;
+
+$typeToExtensions = $repository->dumpTypeToExtensions();
+$extensionToType = $repository->dumpExtensionToType();
+
+file_put_contents(__DIR__.'/../src/Dflydev/ApacheMimeTypes/Resources/mime.types.json', json_encode($typeToExtensions));
+
+$twig = new Twig_Environment(
+    new Twig_Loader_Filesystem(__DIR__.'/../resources'),
+    array(
+        'autoescape'  => false,
+        'auto_reload' => true,
+    )
+);
+
+file_put_contents(
+    __DIR__ . '/../src/Dflydev/ApacheMimeTypes/PhpRepository.php',
+    $twig->render('PhpRepository.twig', array(
+        'extensionToType' => $extensionToType,
+        'typeToExtensions' => $typeToExtensions,
+    ))
+);
+
+$parser = new Dflydev\ApacheMimeTypes\Parser;
+
+$fixturesMap = $parser->parse(__DIR__.'/../tests/Dflydev/ApacheMimeTypes/Fixtures/mime.types');
+file_put_contents(__DIR__.'/../tests/Dflydev/ApacheMimeTypes/Fixtures/mime.types.json', json_encode($fixturesMap));
+
diff --git a/civicrm/vendor/dflydev/apache-mime-types/composer.json b/civicrm/vendor/dflydev/apache-mime-types/composer.json
new file mode 100644
index 0000000000..de06ef6fbe
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/composer.json
@@ -0,0 +1,34 @@
+{
+    "name": "dflydev/apache-mime-types",
+    "description": "Apache MIME Types",
+    "keywords": ["apache", "mime", "mimetypes"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Dragonfly Development Inc.",
+            "email": "info@dflydev.com",
+            "homepage": "http://dflydev.com"
+        },
+        {
+            "name": "Beau Simensen",
+            "email": "beau@dflydev.com",
+            "homepage": "http://beausimensen.com"
+        }
+    ],
+    "require": {
+        "php": ">=5.3"
+    },
+    "require-dev": {
+        "twig/twig": "1.*"
+    },
+    "autoload": {
+        "psr-0": {
+            "Dflydev\\ApacheMimeTypes": "src"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0-dev"
+        }
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/phpunit.xml.dist b/civicrm/vendor/dflydev/apache-mime-types/phpunit.xml.dist
new file mode 100644
index 0000000000..3d6b2b7c47
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/phpunit.xml.dist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit colors="true" bootstrap="vendor/autoload.php">
+    <testsuites>
+        <testsuite name="Apache MIME Types Test Suite">
+            <directory>./tests/Dflydev/ApacheMimeTypes</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/Dflydev/ApacheMimeTypes/</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/civicrm/vendor/dflydev/apache-mime-types/resources/PhpRepository.twig b/civicrm/vendor/dflydev/apache-mime-types/resources/PhpRepository.twig
new file mode 100644
index 0000000000..2d4c08ba69
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/resources/PhpRepository.twig
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * PHP Repository
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class PhpRepository implements RepositoryInterface
+{
+    protected $extensionToType = array(
+        {% spaceless %}
+
+    {% for extension, type in extensionToType %}
+    '{{ extension }}' => '{{ type }}',
+    {% endfor %}
+
+        {% endspaceless %}
+
+    );
+
+    protected $typeToExtensions = array(
+        {% spaceless %}
+
+    {% for type, extensions in typeToExtensions %}
+    '{{ type }}' => array({% for extension in extensions %}{% if not loop.first %}, {% endif %}'{{ extension }}'{% endfor %}),
+    {% endfor %}
+
+        {% endspaceless %}
+
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpExtensionToType()
+    {
+        return $this->extensionToType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpTypeToExtensions()
+    {
+        return $this->typeToExtensions;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findExtensions($type)
+    {
+        if (isset($this->typeToExtensions[$type])) {
+            return $this->typeToExtensions[$type];
+        }
+
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findType($extension)
+    {
+        if (isset($this->extensionToType[$extension])) {
+            return $this->extensionToType[$extension];
+        }
+
+        return null;
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/AbstractRepository.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/AbstractRepository.php
new file mode 100644
index 0000000000..3e1ccbf9ba
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/AbstractRepository.php
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * Abstract Repository
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+abstract class AbstractRepository implements RepositoryInterface
+{
+    protected $typeToExtensions;
+    protected $extensionToType;
+    private $isInitialized = false;
+
+    protected function init()
+    {
+        if (true === $this->isInitialized) {
+            return;
+        }
+
+        $this->internalInit();
+
+        $this->isInitialized = true;
+    }
+
+    protected function reset()
+    {
+        $this->isInitialized = false;
+    }
+
+    /**
+     * Set from map
+     *
+     * Convenience method supplied in order to make it easier for subclasses
+     * to set data from a type => extensions array mapping.
+     *
+     * @param array $map
+     */
+    protected function setFromMap(array $map)
+    {
+        $this->typeToExtensions = $map;
+
+        $this->extensionToType = array();
+        foreach ($this->typeToExtensions as $type => $extensions) {
+            foreach ($extensions as $extension) {
+                if (!isset($this->extensionToType[$extension])) {
+                    $this->extensionToType[$extension] = $type;
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpTypeToExtensions()
+    {
+        $this->init();
+
+        return $this->typeToExtensions;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpExtensionToType()
+    {
+        $this->init();
+
+        return $this->extensionToType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findExtensions($type)
+    {
+        $this->init();
+
+        if (isset($this->typeToExtensions[$type])) {
+            return $this->typeToExtensions[$type];
+        }
+
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findType($extension)
+    {
+        $this->init();
+
+        if (isset($this->extensionToType[$extension])) {
+            return $this->extensionToType[$extension];
+        }
+
+        return null;
+    }
+
+    /**
+     * Internal initialization
+     *
+     * Subclasses should extend this in order to execute code exactly
+     * once to initialize the repository.
+     */
+    abstract protected function internalInit();
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/ArrayRepository.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/ArrayRepository.php
new file mode 100644
index 0000000000..7e1d73370f
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/ArrayRepository.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * Array Repository
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class ArrayRepository extends AbstractRepository
+{
+    protected $data;
+
+    /**
+     * Constructor
+     *
+     * @param array $data
+     */
+    public function __construct(array $data = array())
+    {
+        $this->data = $data;
+    }
+
+    protected function internalInit()
+    {
+        $this->setFromMap($this->data);
+    }
+
+    public function addType($type, array $extensions)
+    {
+        $this->reset();
+
+        if (isset($this->data[$type])) {
+            $this->data[$type] = array_unique($extensions, array_merge($this->data[$type]));
+        } else {
+            $this->data[$type] = array_unique($extensions);
+        }
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/CompositeRepository.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/CompositeRepository.php
new file mode 100644
index 0000000000..015f6af314
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/CompositeRepository.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * Composite Repository
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class CompositeRepository implements RepositoryInterface
+{
+    protected $repositories;
+
+    /**
+     * Constructor
+     *
+     * @param array $repositories Repositories
+     */
+    public function __construct(array $repositories = array())
+    {
+        $this->repositories = $repositories;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpExtensionToType()
+    {
+        $extensionToType = array();
+        foreach ($this->repositories as $repository) {
+            foreach ($repository->dumpExtensionToType() as $extension => $type) {
+                if (!isset($extensionToType[$extension])) {
+                    $extensionToType[$extension] = $type;
+                }
+            }
+        }
+
+        return $extensionToType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpTypeToExtensions()
+    {
+        $typeToExtensions = array();
+        foreach ($this->repositories as $repository) {
+            foreach ($repository->dumpTypeToExtensions() as $type => $extensions) {
+                if (isset($typeToExtensions[$type])) {
+                    $typeToExtensions[$type] = array_unique(array_merge($typeToExtensions[$type], $extensions));
+                } else {
+                    $typeToExtensions[$type] = array_unique($extensions);
+                }
+            }
+        }
+
+        return $typeToExtensions;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findExtensions($type)
+    {
+        $typeToExtensions = $this->dumpTypeToExtensions();
+
+        if (isset($typeToExtensions[$type])) {
+            return $typeToExtensions[$type];
+        }
+
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findType($extension)
+    {
+        $extensionToType = $this->dumpExtensionToType();
+
+        if (isset($extensionToType[$extension])) {
+            return $extensionToType[$extension];
+        }
+
+        return null;
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/FlatRepository.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/FlatRepository.php
new file mode 100644
index 0000000000..34e6f3b745
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/FlatRepository.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * Flat Repository
+ *
+ * Reads a standard flat Apache mime.types file.
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class FlatRepository extends AbstractRepository
+{
+    protected $filename;
+
+    /**
+     * Constructor
+     *
+     * @param string $filename
+     */
+    public function __construct($filename = null)
+    {
+        if (null === $filename) {
+            $filename = __DIR__.'/Resources/mime.types';
+        }
+
+        $this->filename = $filename;
+    }
+
+    protected function internalInit()
+    {
+        $parser = new Parser;
+
+        $this->setFromMap($parser->parse($this->filename));
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/JsonRepository.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/JsonRepository.php
new file mode 100644
index 0000000000..4b7ad777ca
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/JsonRepository.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * JSON Repository
+ *
+ * Reads a JSON file.
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class JsonRepository extends AbstractRepository
+{
+    protected $filename;
+
+    /**
+     * Constructor
+     *
+     * @param string $filename
+     */
+    public function __construct($filename = null)
+    {
+        if (null === $filename) {
+            $filename = __DIR__.'/Resources/mime.types.json';
+        }
+
+        $this->filename = $filename;
+    }
+
+    protected function internalInit()
+    {
+        $this->setFromMap(json_decode(file_get_contents($this->filename), true));
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Parser.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Parser.php
new file mode 100644
index 0000000000..1b648c9906
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Parser.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * Parser
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class Parser
+{
+    /**
+     * Parse Apache MIME Types
+     *
+     * @param string $filename Filename
+     *
+     * @return array
+     */
+    public function parse($filename)
+    {
+        $lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+        $map = array();
+
+        foreach ($lines as $line) {
+            if (strpos($line, '#') !== 0) {
+                preg_match_all('/^((\w|\/|\.|-|\+)+)(\s+)([^\n]*)$/im', $line, $match);
+                $type = $match[1][0];
+                $extensions = explode(' ', $match[4][0]);
+
+                $map[$type] = $extensions;
+            }
+        }
+
+        return $map;
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/PhpRepository.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/PhpRepository.php
new file mode 100644
index 0000000000..7e689d25ac
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/PhpRepository.php
@@ -0,0 +1,1812 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * PHP Repository
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+class PhpRepository implements RepositoryInterface
+{
+    protected $extensionToType = array(
+        'ez' => 'application/andrew-inset',
+        'aw' => 'application/applixware',
+        'atom' => 'application/atom+xml',
+        'atomcat' => 'application/atomcat+xml',
+        'atomsvc' => 'application/atomsvc+xml',
+        'ccxml' => 'application/ccxml+xml',
+        'cdmia' => 'application/cdmi-capability',
+        'cdmic' => 'application/cdmi-container',
+        'cdmid' => 'application/cdmi-domain',
+        'cdmio' => 'application/cdmi-object',
+        'cdmiq' => 'application/cdmi-queue',
+        'cu' => 'application/cu-seeme',
+        'davmount' => 'application/davmount+xml',
+        'dbk' => 'application/docbook+xml',
+        'dssc' => 'application/dssc+der',
+        'xdssc' => 'application/dssc+xml',
+        'ecma' => 'application/ecmascript',
+        'emma' => 'application/emma+xml',
+        'epub' => 'application/epub+zip',
+        'exi' => 'application/exi',
+        'pfr' => 'application/font-tdpfr',
+        'gml' => 'application/gml+xml',
+        'gpx' => 'application/gpx+xml',
+        'gxf' => 'application/gxf',
+        'stk' => 'application/hyperstudio',
+        'ink' => 'application/inkml+xml',
+        'inkml' => 'application/inkml+xml',
+        'ipfix' => 'application/ipfix',
+        'jar' => 'application/java-archive',
+        'ser' => 'application/java-serialized-object',
+        'class' => 'application/java-vm',
+        'js' => 'application/javascript',
+        'json' => 'application/json',
+        'jsonml' => 'application/jsonml+json',
+        'lostxml' => 'application/lost+xml',
+        'hqx' => 'application/mac-binhex40',
+        'cpt' => 'application/mac-compactpro',
+        'mads' => 'application/mads+xml',
+        'mrc' => 'application/marc',
+        'mrcx' => 'application/marcxml+xml',
+        'ma' => 'application/mathematica',
+        'nb' => 'application/mathematica',
+        'mb' => 'application/mathematica',
+        'mathml' => 'application/mathml+xml',
+        'mbox' => 'application/mbox',
+        'mscml' => 'application/mediaservercontrol+xml',
+        'metalink' => 'application/metalink+xml',
+        'meta4' => 'application/metalink4+xml',
+        'mets' => 'application/mets+xml',
+        'mods' => 'application/mods+xml',
+        'm21' => 'application/mp21',
+        'mp21' => 'application/mp21',
+        'mp4s' => 'application/mp4',
+        'doc' => 'application/msword',
+        'dot' => 'application/msword',
+        'mxf' => 'application/mxf',
+        'bin' => 'application/octet-stream',
+        'dms' => 'application/octet-stream',
+        'lrf' => 'application/octet-stream',
+        'mar' => 'application/octet-stream',
+        'so' => 'application/octet-stream',
+        'dist' => 'application/octet-stream',
+        'distz' => 'application/octet-stream',
+        'pkg' => 'application/octet-stream',
+        'bpk' => 'application/octet-stream',
+        'dump' => 'application/octet-stream',
+        'elc' => 'application/octet-stream',
+        'deploy' => 'application/octet-stream',
+        'oda' => 'application/oda',
+        'opf' => 'application/oebps-package+xml',
+        'ogx' => 'application/ogg',
+        'omdoc' => 'application/omdoc+xml',
+        'onetoc' => 'application/onenote',
+        'onetoc2' => 'application/onenote',
+        'onetmp' => 'application/onenote',
+        'onepkg' => 'application/onenote',
+        'oxps' => 'application/oxps',
+        'xer' => 'application/patch-ops-error+xml',
+        'pdf' => 'application/pdf',
+        'pgp' => 'application/pgp-encrypted',
+        'asc' => 'application/pgp-signature',
+        'sig' => 'application/pgp-signature',
+        'prf' => 'application/pics-rules',
+        'p10' => 'application/pkcs10',
+        'p7m' => 'application/pkcs7-mime',
+        'p7c' => 'application/pkcs7-mime',
+        'p7s' => 'application/pkcs7-signature',
+        'p8' => 'application/pkcs8',
+        'ac' => 'application/pkix-attr-cert',
+        'cer' => 'application/pkix-cert',
+        'crl' => 'application/pkix-crl',
+        'pkipath' => 'application/pkix-pkipath',
+        'pki' => 'application/pkixcmp',
+        'pls' => 'application/pls+xml',
+        'ai' => 'application/postscript',
+        'eps' => 'application/postscript',
+        'ps' => 'application/postscript',
+        'cww' => 'application/prs.cww',
+        'pskcxml' => 'application/pskc+xml',
+        'rdf' => 'application/rdf+xml',
+        'rif' => 'application/reginfo+xml',
+        'rnc' => 'application/relax-ng-compact-syntax',
+        'rl' => 'application/resource-lists+xml',
+        'rld' => 'application/resource-lists-diff+xml',
+        'rs' => 'application/rls-services+xml',
+        'gbr' => 'application/rpki-ghostbusters',
+        'mft' => 'application/rpki-manifest',
+        'roa' => 'application/rpki-roa',
+        'rsd' => 'application/rsd+xml',
+        'rss' => 'application/rss+xml',
+        'rtf' => 'application/rtf',
+        'sbml' => 'application/sbml+xml',
+        'scq' => 'application/scvp-cv-request',
+        'scs' => 'application/scvp-cv-response',
+        'spq' => 'application/scvp-vp-request',
+        'spp' => 'application/scvp-vp-response',
+        'sdp' => 'application/sdp',
+        'setpay' => 'application/set-payment-initiation',
+        'setreg' => 'application/set-registration-initiation',
+        'shf' => 'application/shf+xml',
+        'smi' => 'application/smil+xml',
+        'smil' => 'application/smil+xml',
+        'rq' => 'application/sparql-query',
+        'srx' => 'application/sparql-results+xml',
+        'gram' => 'application/srgs',
+        'grxml' => 'application/srgs+xml',
+        'sru' => 'application/sru+xml',
+        'ssdl' => 'application/ssdl+xml',
+        'ssml' => 'application/ssml+xml',
+        'tei' => 'application/tei+xml',
+        'teicorpus' => 'application/tei+xml',
+        'tfi' => 'application/thraud+xml',
+        'tsd' => 'application/timestamped-data',
+        'plb' => 'application/vnd.3gpp.pic-bw-large',
+        'psb' => 'application/vnd.3gpp.pic-bw-small',
+        'pvb' => 'application/vnd.3gpp.pic-bw-var',
+        'tcap' => 'application/vnd.3gpp2.tcap',
+        'pwn' => 'application/vnd.3m.post-it-notes',
+        'aso' => 'application/vnd.accpac.simply.aso',
+        'imp' => 'application/vnd.accpac.simply.imp',
+        'acu' => 'application/vnd.acucobol',
+        'atc' => 'application/vnd.acucorp',
+        'acutc' => 'application/vnd.acucorp',
+        'air' => 'application/vnd.adobe.air-application-installer-package+zip',
+        'fcdt' => 'application/vnd.adobe.formscentral.fcdt',
+        'fxp' => 'application/vnd.adobe.fxp',
+        'fxpl' => 'application/vnd.adobe.fxp',
+        'xdp' => 'application/vnd.adobe.xdp+xml',
+        'xfdf' => 'application/vnd.adobe.xfdf',
+        'ahead' => 'application/vnd.ahead.space',
+        'azf' => 'application/vnd.airzip.filesecure.azf',
+        'azs' => 'application/vnd.airzip.filesecure.azs',
+        'azw' => 'application/vnd.amazon.ebook',
+        'acc' => 'application/vnd.americandynamics.acc',
+        'ami' => 'application/vnd.amiga.ami',
+        'apk' => 'application/vnd.android.package-archive',
+        'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
+        'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
+        'atx' => 'application/vnd.antix.game-component',
+        'mpkg' => 'application/vnd.apple.installer+xml',
+        'm3u8' => 'application/vnd.apple.mpegurl',
+        'swi' => 'application/vnd.aristanetworks.swi',
+        'iota' => 'application/vnd.astraea-software.iota',
+        'aep' => 'application/vnd.audiograph',
+        'mpm' => 'application/vnd.blueice.multipass',
+        'bmi' => 'application/vnd.bmi',
+        'rep' => 'application/vnd.businessobjects',
+        'cdxml' => 'application/vnd.chemdraw+xml',
+        'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
+        'cdy' => 'application/vnd.cinderella',
+        'cla' => 'application/vnd.claymore',
+        'rp9' => 'application/vnd.cloanto.rp9',
+        'c4g' => 'application/vnd.clonk.c4group',
+        'c4d' => 'application/vnd.clonk.c4group',
+        'c4f' => 'application/vnd.clonk.c4group',
+        'c4p' => 'application/vnd.clonk.c4group',
+        'c4u' => 'application/vnd.clonk.c4group',
+        'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
+        'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
+        'csp' => 'application/vnd.commonspace',
+        'cdbcmsg' => 'application/vnd.contact.cmsg',
+        'cmc' => 'application/vnd.cosmocaller',
+        'clkx' => 'application/vnd.crick.clicker',
+        'clkk' => 'application/vnd.crick.clicker.keyboard',
+        'clkp' => 'application/vnd.crick.clicker.palette',
+        'clkt' => 'application/vnd.crick.clicker.template',
+        'clkw' => 'application/vnd.crick.clicker.wordbank',
+        'wbs' => 'application/vnd.criticaltools.wbs+xml',
+        'pml' => 'application/vnd.ctc-posml',
+        'ppd' => 'application/vnd.cups-ppd',
+        'car' => 'application/vnd.curl.car',
+        'pcurl' => 'application/vnd.curl.pcurl',
+        'dart' => 'application/vnd.dart',
+        'rdz' => 'application/vnd.data-vision.rdz',
+        'uvf' => 'application/vnd.dece.data',
+        'uvvf' => 'application/vnd.dece.data',
+        'uvd' => 'application/vnd.dece.data',
+        'uvvd' => 'application/vnd.dece.data',
+        'uvt' => 'application/vnd.dece.ttml+xml',
+        'uvvt' => 'application/vnd.dece.ttml+xml',
+        'uvx' => 'application/vnd.dece.unspecified',
+        'uvvx' => 'application/vnd.dece.unspecified',
+        'uvz' => 'application/vnd.dece.zip',
+        'uvvz' => 'application/vnd.dece.zip',
+        'fe_launch' => 'application/vnd.denovo.fcselayout-link',
+        'dna' => 'application/vnd.dna',
+        'mlp' => 'application/vnd.dolby.mlp',
+        'dpg' => 'application/vnd.dpgraph',
+        'dfac' => 'application/vnd.dreamfactory',
+        'kpxx' => 'application/vnd.ds-keypoint',
+        'ait' => 'application/vnd.dvb.ait',
+        'svc' => 'application/vnd.dvb.service',
+        'geo' => 'application/vnd.dynageo',
+        'mag' => 'application/vnd.ecowin.chart',
+        'nml' => 'application/vnd.enliven',
+        'esf' => 'application/vnd.epson.esf',
+        'msf' => 'application/vnd.epson.msf',
+        'qam' => 'application/vnd.epson.quickanime',
+        'slt' => 'application/vnd.epson.salt',
+        'ssf' => 'application/vnd.epson.ssf',
+        'es3' => 'application/vnd.eszigno3+xml',
+        'et3' => 'application/vnd.eszigno3+xml',
+        'ez2' => 'application/vnd.ezpix-album',
+        'ez3' => 'application/vnd.ezpix-package',
+        'fdf' => 'application/vnd.fdf',
+        'mseed' => 'application/vnd.fdsn.mseed',
+        'seed' => 'application/vnd.fdsn.seed',
+        'dataless' => 'application/vnd.fdsn.seed',
+        'gph' => 'application/vnd.flographit',
+        'ftc' => 'application/vnd.fluxtime.clip',
+        'fm' => 'application/vnd.framemaker',
+        'frame' => 'application/vnd.framemaker',
+        'maker' => 'application/vnd.framemaker',
+        'book' => 'application/vnd.framemaker',
+        'fnc' => 'application/vnd.frogans.fnc',
+        'ltf' => 'application/vnd.frogans.ltf',
+        'fsc' => 'application/vnd.fsc.weblaunch',
+        'oas' => 'application/vnd.fujitsu.oasys',
+        'oa2' => 'application/vnd.fujitsu.oasys2',
+        'oa3' => 'application/vnd.fujitsu.oasys3',
+        'fg5' => 'application/vnd.fujitsu.oasysgp',
+        'bh2' => 'application/vnd.fujitsu.oasysprs',
+        'ddd' => 'application/vnd.fujixerox.ddd',
+        'xdw' => 'application/vnd.fujixerox.docuworks',
+        'xbd' => 'application/vnd.fujixerox.docuworks.binder',
+        'fzs' => 'application/vnd.fuzzysheet',
+        'txd' => 'application/vnd.genomatix.tuxedo',
+        'ggb' => 'application/vnd.geogebra.file',
+        'ggt' => 'application/vnd.geogebra.tool',
+        'gex' => 'application/vnd.geometry-explorer',
+        'gre' => 'application/vnd.geometry-explorer',
+        'gxt' => 'application/vnd.geonext',
+        'g2w' => 'application/vnd.geoplan',
+        'g3w' => 'application/vnd.geospace',
+        'gmx' => 'application/vnd.gmx',
+        'kml' => 'application/vnd.google-earth.kml+xml',
+        'kmz' => 'application/vnd.google-earth.kmz',
+        'gqf' => 'application/vnd.grafeq',
+        'gqs' => 'application/vnd.grafeq',
+        'gac' => 'application/vnd.groove-account',
+        'ghf' => 'application/vnd.groove-help',
+        'gim' => 'application/vnd.groove-identity-message',
+        'grv' => 'application/vnd.groove-injector',
+        'gtm' => 'application/vnd.groove-tool-message',
+        'tpl' => 'application/vnd.groove-tool-template',
+        'vcg' => 'application/vnd.groove-vcard',
+        'hal' => 'application/vnd.hal+xml',
+        'zmm' => 'application/vnd.handheld-entertainment+xml',
+        'hbci' => 'application/vnd.hbci',
+        'les' => 'application/vnd.hhe.lesson-player',
+        'hpgl' => 'application/vnd.hp-hpgl',
+        'hpid' => 'application/vnd.hp-hpid',
+        'hps' => 'application/vnd.hp-hps',
+        'jlt' => 'application/vnd.hp-jlyt',
+        'pcl' => 'application/vnd.hp-pcl',
+        'pclxl' => 'application/vnd.hp-pclxl',
+        'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
+        'mpy' => 'application/vnd.ibm.minipay',
+        'afp' => 'application/vnd.ibm.modcap',
+        'listafp' => 'application/vnd.ibm.modcap',
+        'list3820' => 'application/vnd.ibm.modcap',
+        'irm' => 'application/vnd.ibm.rights-management',
+        'sc' => 'application/vnd.ibm.secure-container',
+        'icc' => 'application/vnd.iccprofile',
+        'icm' => 'application/vnd.iccprofile',
+        'igl' => 'application/vnd.igloader',
+        'ivp' => 'application/vnd.immervision-ivp',
+        'ivu' => 'application/vnd.immervision-ivu',
+        'igm' => 'application/vnd.insors.igm',
+        'xpw' => 'application/vnd.intercon.formnet',
+        'xpx' => 'application/vnd.intercon.formnet',
+        'i2g' => 'application/vnd.intergeo',
+        'qbo' => 'application/vnd.intu.qbo',
+        'qfx' => 'application/vnd.intu.qfx',
+        'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
+        'irp' => 'application/vnd.irepository.package+xml',
+        'xpr' => 'application/vnd.is-xpr',
+        'fcs' => 'application/vnd.isac.fcs',
+        'jam' => 'application/vnd.jam',
+        'rms' => 'application/vnd.jcp.javame.midlet-rms',
+        'jisp' => 'application/vnd.jisp',
+        'joda' => 'application/vnd.joost.joda-archive',
+        'ktz' => 'application/vnd.kahootz',
+        'ktr' => 'application/vnd.kahootz',
+        'karbon' => 'application/vnd.kde.karbon',
+        'chrt' => 'application/vnd.kde.kchart',
+        'kfo' => 'application/vnd.kde.kformula',
+        'flw' => 'application/vnd.kde.kivio',
+        'kon' => 'application/vnd.kde.kontour',
+        'kpr' => 'application/vnd.kde.kpresenter',
+        'kpt' => 'application/vnd.kde.kpresenter',
+        'ksp' => 'application/vnd.kde.kspread',
+        'kwd' => 'application/vnd.kde.kword',
+        'kwt' => 'application/vnd.kde.kword',
+        'htke' => 'application/vnd.kenameaapp',
+        'kia' => 'application/vnd.kidspiration',
+        'kne' => 'application/vnd.kinar',
+        'knp' => 'application/vnd.kinar',
+        'skp' => 'application/vnd.koan',
+        'skd' => 'application/vnd.koan',
+        'skt' => 'application/vnd.koan',
+        'skm' => 'application/vnd.koan',
+        'sse' => 'application/vnd.kodak-descriptor',
+        'lasxml' => 'application/vnd.las.las+xml',
+        'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
+        'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
+        '123' => 'application/vnd.lotus-1-2-3',
+        'apr' => 'application/vnd.lotus-approach',
+        'pre' => 'application/vnd.lotus-freelance',
+        'nsf' => 'application/vnd.lotus-notes',
+        'org' => 'application/vnd.lotus-organizer',
+        'scm' => 'application/vnd.lotus-screencam',
+        'lwp' => 'application/vnd.lotus-wordpro',
+        'portpkg' => 'application/vnd.macports.portpkg',
+        'mcd' => 'application/vnd.mcd',
+        'mc1' => 'application/vnd.medcalcdata',
+        'cdkey' => 'application/vnd.mediastation.cdkey',
+        'mwf' => 'application/vnd.mfer',
+        'mfm' => 'application/vnd.mfmp',
+        'flo' => 'application/vnd.micrografx.flo',
+        'igx' => 'application/vnd.micrografx.igx',
+        'mif' => 'application/vnd.mif',
+        'daf' => 'application/vnd.mobius.daf',
+        'dis' => 'application/vnd.mobius.dis',
+        'mbk' => 'application/vnd.mobius.mbk',
+        'mqy' => 'application/vnd.mobius.mqy',
+        'msl' => 'application/vnd.mobius.msl',
+        'plc' => 'application/vnd.mobius.plc',
+        'txf' => 'application/vnd.mobius.txf',
+        'mpn' => 'application/vnd.mophun.application',
+        'mpc' => 'application/vnd.mophun.certificate',
+        'xul' => 'application/vnd.mozilla.xul+xml',
+        'cil' => 'application/vnd.ms-artgalry',
+        'cab' => 'application/vnd.ms-cab-compressed',
+        'xls' => 'application/vnd.ms-excel',
+        'xlm' => 'application/vnd.ms-excel',
+        'xla' => 'application/vnd.ms-excel',
+        'xlc' => 'application/vnd.ms-excel',
+        'xlt' => 'application/vnd.ms-excel',
+        'xlw' => 'application/vnd.ms-excel',
+        'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12',
+        'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
+        'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12',
+        'xltm' => 'application/vnd.ms-excel.template.macroenabled.12',
+        'eot' => 'application/vnd.ms-fontobject',
+        'chm' => 'application/vnd.ms-htmlhelp',
+        'ims' => 'application/vnd.ms-ims',
+        'lrm' => 'application/vnd.ms-lrm',
+        'thmx' => 'application/vnd.ms-officetheme',
+        'cat' => 'application/vnd.ms-pki.seccat',
+        'stl' => 'application/vnd.ms-pki.stl',
+        'ppt' => 'application/vnd.ms-powerpoint',
+        'pps' => 'application/vnd.ms-powerpoint',
+        'pot' => 'application/vnd.ms-powerpoint',
+        'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
+        'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
+        'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
+        'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
+        'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12',
+        'mpp' => 'application/vnd.ms-project',
+        'mpt' => 'application/vnd.ms-project',
+        'docm' => 'application/vnd.ms-word.document.macroenabled.12',
+        'dotm' => 'application/vnd.ms-word.template.macroenabled.12',
+        'wps' => 'application/vnd.ms-works',
+        'wks' => 'application/vnd.ms-works',
+        'wcm' => 'application/vnd.ms-works',
+        'wdb' => 'application/vnd.ms-works',
+        'wpl' => 'application/vnd.ms-wpl',
+        'xps' => 'application/vnd.ms-xpsdocument',
+        'mseq' => 'application/vnd.mseq',
+        'mus' => 'application/vnd.musician',
+        'msty' => 'application/vnd.muvee.style',
+        'taglet' => 'application/vnd.mynfc',
+        'nlu' => 'application/vnd.neurolanguage.nlu',
+        'ntf' => 'application/vnd.nitf',
+        'nitf' => 'application/vnd.nitf',
+        'nnd' => 'application/vnd.noblenet-directory',
+        'nns' => 'application/vnd.noblenet-sealer',
+        'nnw' => 'application/vnd.noblenet-web',
+        'ngdat' => 'application/vnd.nokia.n-gage.data',
+        'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
+        'rpst' => 'application/vnd.nokia.radio-preset',
+        'rpss' => 'application/vnd.nokia.radio-presets',
+        'edm' => 'application/vnd.novadigm.edm',
+        'edx' => 'application/vnd.novadigm.edx',
+        'ext' => 'application/vnd.novadigm.ext',
+        'odc' => 'application/vnd.oasis.opendocument.chart',
+        'otc' => 'application/vnd.oasis.opendocument.chart-template',
+        'odb' => 'application/vnd.oasis.opendocument.database',
+        'odf' => 'application/vnd.oasis.opendocument.formula',
+        'odft' => 'application/vnd.oasis.opendocument.formula-template',
+        'odg' => 'application/vnd.oasis.opendocument.graphics',
+        'otg' => 'application/vnd.oasis.opendocument.graphics-template',
+        'odi' => 'application/vnd.oasis.opendocument.image',
+        'oti' => 'application/vnd.oasis.opendocument.image-template',
+        'odp' => 'application/vnd.oasis.opendocument.presentation',
+        'otp' => 'application/vnd.oasis.opendocument.presentation-template',
+        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+        'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
+        'odt' => 'application/vnd.oasis.opendocument.text',
+        'odm' => 'application/vnd.oasis.opendocument.text-master',
+        'ott' => 'application/vnd.oasis.opendocument.text-template',
+        'oth' => 'application/vnd.oasis.opendocument.text-web',
+        'xo' => 'application/vnd.olpc-sugar',
+        'dd2' => 'application/vnd.oma.dd2+xml',
+        'oxt' => 'application/vnd.openofficeorg.extension',
+        'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+        'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
+        'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+        'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+        'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+        'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+        'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+        'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+        'mgp' => 'application/vnd.osgeo.mapguide.package',
+        'dp' => 'application/vnd.osgi.dp',
+        'esa' => 'application/vnd.osgi.subsystem',
+        'pdb' => 'application/vnd.palm',
+        'pqa' => 'application/vnd.palm',
+        'oprc' => 'application/vnd.palm',
+        'paw' => 'application/vnd.pawaafile',
+        'str' => 'application/vnd.pg.format',
+        'ei6' => 'application/vnd.pg.osasli',
+        'efif' => 'application/vnd.picsel',
+        'wg' => 'application/vnd.pmi.widget',
+        'plf' => 'application/vnd.pocketlearn',
+        'pbd' => 'application/vnd.powerbuilder6',
+        'box' => 'application/vnd.previewsystems.box',
+        'mgz' => 'application/vnd.proteus.magazine',
+        'qps' => 'application/vnd.publishare-delta-tree',
+        'ptid' => 'application/vnd.pvi.ptid1',
+        'qxd' => 'application/vnd.quark.quarkxpress',
+        'qxt' => 'application/vnd.quark.quarkxpress',
+        'qwd' => 'application/vnd.quark.quarkxpress',
+        'qwt' => 'application/vnd.quark.quarkxpress',
+        'qxl' => 'application/vnd.quark.quarkxpress',
+        'qxb' => 'application/vnd.quark.quarkxpress',
+        'bed' => 'application/vnd.realvnc.bed',
+        'mxl' => 'application/vnd.recordare.musicxml',
+        'musicxml' => 'application/vnd.recordare.musicxml+xml',
+        'cryptonote' => 'application/vnd.rig.cryptonote',
+        'cod' => 'application/vnd.rim.cod',
+        'rm' => 'application/vnd.rn-realmedia',
+        'rmvb' => 'application/vnd.rn-realmedia-vbr',
+        'link66' => 'application/vnd.route66.link66+xml',
+        'st' => 'application/vnd.sailingtracker.track',
+        'see' => 'application/vnd.seemail',
+        'sema' => 'application/vnd.sema',
+        'semd' => 'application/vnd.semd',
+        'semf' => 'application/vnd.semf',
+        'ifm' => 'application/vnd.shana.informed.formdata',
+        'itp' => 'application/vnd.shana.informed.formtemplate',
+        'iif' => 'application/vnd.shana.informed.interchange',
+        'ipk' => 'application/vnd.shana.informed.package',
+        'twd' => 'application/vnd.simtech-mindmapper',
+        'twds' => 'application/vnd.simtech-mindmapper',
+        'mmf' => 'application/vnd.smaf',
+        'teacher' => 'application/vnd.smart.teacher',
+        'sdkm' => 'application/vnd.solent.sdkm+xml',
+        'sdkd' => 'application/vnd.solent.sdkm+xml',
+        'dxp' => 'application/vnd.spotfire.dxp',
+        'sfs' => 'application/vnd.spotfire.sfs',
+        'sdc' => 'application/vnd.stardivision.calc',
+        'sda' => 'application/vnd.stardivision.draw',
+        'sdd' => 'application/vnd.stardivision.impress',
+        'smf' => 'application/vnd.stardivision.math',
+        'sdw' => 'application/vnd.stardivision.writer',
+        'vor' => 'application/vnd.stardivision.writer',
+        'sgl' => 'application/vnd.stardivision.writer-global',
+        'smzip' => 'application/vnd.stepmania.package',
+        'sm' => 'application/vnd.stepmania.stepchart',
+        'sxc' => 'application/vnd.sun.xml.calc',
+        'stc' => 'application/vnd.sun.xml.calc.template',
+        'sxd' => 'application/vnd.sun.xml.draw',
+        'std' => 'application/vnd.sun.xml.draw.template',
+        'sxi' => 'application/vnd.sun.xml.impress',
+        'sti' => 'application/vnd.sun.xml.impress.template',
+        'sxm' => 'application/vnd.sun.xml.math',
+        'sxw' => 'application/vnd.sun.xml.writer',
+        'sxg' => 'application/vnd.sun.xml.writer.global',
+        'stw' => 'application/vnd.sun.xml.writer.template',
+        'sus' => 'application/vnd.sus-calendar',
+        'susp' => 'application/vnd.sus-calendar',
+        'svd' => 'application/vnd.svd',
+        'sis' => 'application/vnd.symbian.install',
+        'sisx' => 'application/vnd.symbian.install',
+        'xsm' => 'application/vnd.syncml+xml',
+        'bdm' => 'application/vnd.syncml.dm+wbxml',
+        'xdm' => 'application/vnd.syncml.dm+xml',
+        'tao' => 'application/vnd.tao.intent-module-archive',
+        'pcap' => 'application/vnd.tcpdump.pcap',
+        'cap' => 'application/vnd.tcpdump.pcap',
+        'dmp' => 'application/vnd.tcpdump.pcap',
+        'tmo' => 'application/vnd.tmobile-livetv',
+        'tpt' => 'application/vnd.trid.tpt',
+        'mxs' => 'application/vnd.triscape.mxs',
+        'tra' => 'application/vnd.trueapp',
+        'ufd' => 'application/vnd.ufdl',
+        'ufdl' => 'application/vnd.ufdl',
+        'utz' => 'application/vnd.uiq.theme',
+        'umj' => 'application/vnd.umajin',
+        'unityweb' => 'application/vnd.unity',
+        'uoml' => 'application/vnd.uoml+xml',
+        'vcx' => 'application/vnd.vcx',
+        'vsd' => 'application/vnd.visio',
+        'vst' => 'application/vnd.visio',
+        'vss' => 'application/vnd.visio',
+        'vsw' => 'application/vnd.visio',
+        'vis' => 'application/vnd.visionary',
+        'vsf' => 'application/vnd.vsf',
+        'wbxml' => 'application/vnd.wap.wbxml',
+        'wmlc' => 'application/vnd.wap.wmlc',
+        'wmlsc' => 'application/vnd.wap.wmlscriptc',
+        'wtb' => 'application/vnd.webturbo',
+        'nbp' => 'application/vnd.wolfram.player',
+        'wpd' => 'application/vnd.wordperfect',
+        'wqd' => 'application/vnd.wqd',
+        'stf' => 'application/vnd.wt.stf',
+        'xar' => 'application/vnd.xara',
+        'xfdl' => 'application/vnd.xfdl',
+        'hvd' => 'application/vnd.yamaha.hv-dic',
+        'hvs' => 'application/vnd.yamaha.hv-script',
+        'hvp' => 'application/vnd.yamaha.hv-voice',
+        'osf' => 'application/vnd.yamaha.openscoreformat',
+        'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
+        'saf' => 'application/vnd.yamaha.smaf-audio',
+        'spf' => 'application/vnd.yamaha.smaf-phrase',
+        'cmp' => 'application/vnd.yellowriver-custom-menu',
+        'zir' => 'application/vnd.zul',
+        'zirz' => 'application/vnd.zul',
+        'zaz' => 'application/vnd.zzazz.deck+xml',
+        'vxml' => 'application/voicexml+xml',
+        'wgt' => 'application/widget',
+        'hlp' => 'application/winhlp',
+        'wsdl' => 'application/wsdl+xml',
+        'wspolicy' => 'application/wspolicy+xml',
+        '7z' => 'application/x-7z-compressed',
+        'abw' => 'application/x-abiword',
+        'ace' => 'application/x-ace-compressed',
+        'dmg' => 'application/x-apple-diskimage',
+        'aab' => 'application/x-authorware-bin',
+        'x32' => 'application/x-authorware-bin',
+        'u32' => 'application/x-authorware-bin',
+        'vox' => 'application/x-authorware-bin',
+        'aam' => 'application/x-authorware-map',
+        'aas' => 'application/x-authorware-seg',
+        'bcpio' => 'application/x-bcpio',
+        'torrent' => 'application/x-bittorrent',
+        'blb' => 'application/x-blorb',
+        'blorb' => 'application/x-blorb',
+        'bz' => 'application/x-bzip',
+        'bz2' => 'application/x-bzip2',
+        'boz' => 'application/x-bzip2',
+        'cbr' => 'application/x-cbr',
+        'cba' => 'application/x-cbr',
+        'cbt' => 'application/x-cbr',
+        'cbz' => 'application/x-cbr',
+        'cb7' => 'application/x-cbr',
+        'vcd' => 'application/x-cdlink',
+        'cfs' => 'application/x-cfs-compressed',
+        'chat' => 'application/x-chat',
+        'pgn' => 'application/x-chess-pgn',
+        'nsc' => 'application/x-conference',
+        'cpio' => 'application/x-cpio',
+        'csh' => 'application/x-csh',
+        'deb' => 'application/x-debian-package',
+        'udeb' => 'application/x-debian-package',
+        'dgc' => 'application/x-dgc-compressed',
+        'dir' => 'application/x-director',
+        'dcr' => 'application/x-director',
+        'dxr' => 'application/x-director',
+        'cst' => 'application/x-director',
+        'cct' => 'application/x-director',
+        'cxt' => 'application/x-director',
+        'w3d' => 'application/x-director',
+        'fgd' => 'application/x-director',
+        'swa' => 'application/x-director',
+        'wad' => 'application/x-doom',
+        'ncx' => 'application/x-dtbncx+xml',
+        'dtb' => 'application/x-dtbook+xml',
+        'res' => 'application/x-dtbresource+xml',
+        'dvi' => 'application/x-dvi',
+        'evy' => 'application/x-envoy',
+        'eva' => 'application/x-eva',
+        'bdf' => 'application/x-font-bdf',
+        'gsf' => 'application/x-font-ghostscript',
+        'psf' => 'application/x-font-linux-psf',
+        'otf' => 'application/x-font-otf',
+        'pcf' => 'application/x-font-pcf',
+        'snf' => 'application/x-font-snf',
+        'ttf' => 'application/x-font-ttf',
+        'ttc' => 'application/x-font-ttf',
+        'pfa' => 'application/x-font-type1',
+        'pfb' => 'application/x-font-type1',
+        'pfm' => 'application/x-font-type1',
+        'afm' => 'application/x-font-type1',
+        'woff' => 'application/x-font-woff',
+        'arc' => 'application/x-freearc',
+        'spl' => 'application/x-futuresplash',
+        'gca' => 'application/x-gca-compressed',
+        'ulx' => 'application/x-glulx',
+        'gnumeric' => 'application/x-gnumeric',
+        'gramps' => 'application/x-gramps-xml',
+        'gtar' => 'application/x-gtar',
+        'hdf' => 'application/x-hdf',
+        'install' => 'application/x-install-instructions',
+        'iso' => 'application/x-iso9660-image',
+        'jnlp' => 'application/x-java-jnlp-file',
+        'latex' => 'application/x-latex',
+        'lzh' => 'application/x-lzh-compressed',
+        'lha' => 'application/x-lzh-compressed',
+        'mie' => 'application/x-mie',
+        'prc' => 'application/x-mobipocket-ebook',
+        'mobi' => 'application/x-mobipocket-ebook',
+        'application' => 'application/x-ms-application',
+        'lnk' => 'application/x-ms-shortcut',
+        'wmd' => 'application/x-ms-wmd',
+        'wmz' => 'application/x-ms-wmz',
+        'xbap' => 'application/x-ms-xbap',
+        'mdb' => 'application/x-msaccess',
+        'obd' => 'application/x-msbinder',
+        'crd' => 'application/x-mscardfile',
+        'clp' => 'application/x-msclip',
+        'exe' => 'application/x-msdownload',
+        'dll' => 'application/x-msdownload',
+        'com' => 'application/x-msdownload',
+        'bat' => 'application/x-msdownload',
+        'msi' => 'application/x-msdownload',
+        'mvb' => 'application/x-msmediaview',
+        'm13' => 'application/x-msmediaview',
+        'm14' => 'application/x-msmediaview',
+        'wmf' => 'application/x-msmetafile',
+        'emf' => 'application/x-msmetafile',
+        'emz' => 'application/x-msmetafile',
+        'mny' => 'application/x-msmoney',
+        'pub' => 'application/x-mspublisher',
+        'scd' => 'application/x-msschedule',
+        'trm' => 'application/x-msterminal',
+        'wri' => 'application/x-mswrite',
+        'nc' => 'application/x-netcdf',
+        'cdf' => 'application/x-netcdf',
+        'nzb' => 'application/x-nzb',
+        'p12' => 'application/x-pkcs12',
+        'pfx' => 'application/x-pkcs12',
+        'p7b' => 'application/x-pkcs7-certificates',
+        'spc' => 'application/x-pkcs7-certificates',
+        'p7r' => 'application/x-pkcs7-certreqresp',
+        'rar' => 'application/x-rar-compressed',
+        'ris' => 'application/x-research-info-systems',
+        'sh' => 'application/x-sh',
+        'shar' => 'application/x-shar',
+        'swf' => 'application/x-shockwave-flash',
+        'xap' => 'application/x-silverlight-app',
+        'sql' => 'application/x-sql',
+        'sit' => 'application/x-stuffit',
+        'sitx' => 'application/x-stuffitx',
+        'srt' => 'application/x-subrip',
+        'sv4cpio' => 'application/x-sv4cpio',
+        'sv4crc' => 'application/x-sv4crc',
+        't3' => 'application/x-t3vm-image',
+        'gam' => 'application/x-tads',
+        'tar' => 'application/x-tar',
+        'tcl' => 'application/x-tcl',
+        'tex' => 'application/x-tex',
+        'tfm' => 'application/x-tex-tfm',
+        'texinfo' => 'application/x-texinfo',
+        'texi' => 'application/x-texinfo',
+        'obj' => 'application/x-tgif',
+        'ustar' => 'application/x-ustar',
+        'src' => 'application/x-wais-source',
+        'der' => 'application/x-x509-ca-cert',
+        'crt' => 'application/x-x509-ca-cert',
+        'fig' => 'application/x-xfig',
+        'xlf' => 'application/x-xliff+xml',
+        'xpi' => 'application/x-xpinstall',
+        'xz' => 'application/x-xz',
+        'z1' => 'application/x-zmachine',
+        'z2' => 'application/x-zmachine',
+        'z3' => 'application/x-zmachine',
+        'z4' => 'application/x-zmachine',
+        'z5' => 'application/x-zmachine',
+        'z6' => 'application/x-zmachine',
+        'z7' => 'application/x-zmachine',
+        'z8' => 'application/x-zmachine',
+        'xaml' => 'application/xaml+xml',
+        'xdf' => 'application/xcap-diff+xml',
+        'xenc' => 'application/xenc+xml',
+        'xhtml' => 'application/xhtml+xml',
+        'xht' => 'application/xhtml+xml',
+        'xml' => 'application/xml',
+        'xsl' => 'application/xml',
+        'dtd' => 'application/xml-dtd',
+        'xop' => 'application/xop+xml',
+        'xpl' => 'application/xproc+xml',
+        'xslt' => 'application/xslt+xml',
+        'xspf' => 'application/xspf+xml',
+        'mxml' => 'application/xv+xml',
+        'xhvml' => 'application/xv+xml',
+        'xvml' => 'application/xv+xml',
+        'xvm' => 'application/xv+xml',
+        'yang' => 'application/yang',
+        'yin' => 'application/yin+xml',
+        'zip' => 'application/zip',
+        'adp' => 'audio/adpcm',
+        'au' => 'audio/basic',
+        'snd' => 'audio/basic',
+        'mid' => 'audio/midi',
+        'midi' => 'audio/midi',
+        'kar' => 'audio/midi',
+        'rmi' => 'audio/midi',
+        'mp4a' => 'audio/mp4',
+        'mpga' => 'audio/mpeg',
+        'mp2' => 'audio/mpeg',
+        'mp2a' => 'audio/mpeg',
+        'mp3' => 'audio/mpeg',
+        'm2a' => 'audio/mpeg',
+        'm3a' => 'audio/mpeg',
+        'oga' => 'audio/ogg',
+        'ogg' => 'audio/ogg',
+        'spx' => 'audio/ogg',
+        's3m' => 'audio/s3m',
+        'sil' => 'audio/silk',
+        'uva' => 'audio/vnd.dece.audio',
+        'uvva' => 'audio/vnd.dece.audio',
+        'eol' => 'audio/vnd.digital-winds',
+        'dra' => 'audio/vnd.dra',
+        'dts' => 'audio/vnd.dts',
+        'dtshd' => 'audio/vnd.dts.hd',
+        'lvp' => 'audio/vnd.lucent.voice',
+        'pya' => 'audio/vnd.ms-playready.media.pya',
+        'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
+        'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
+        'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
+        'rip' => 'audio/vnd.rip',
+        'weba' => 'audio/webm',
+        'aac' => 'audio/x-aac',
+        'aif' => 'audio/x-aiff',
+        'aiff' => 'audio/x-aiff',
+        'aifc' => 'audio/x-aiff',
+        'caf' => 'audio/x-caf',
+        'flac' => 'audio/x-flac',
+        'mka' => 'audio/x-matroska',
+        'm3u' => 'audio/x-mpegurl',
+        'wax' => 'audio/x-ms-wax',
+        'wma' => 'audio/x-ms-wma',
+        'ram' => 'audio/x-pn-realaudio',
+        'ra' => 'audio/x-pn-realaudio',
+        'rmp' => 'audio/x-pn-realaudio-plugin',
+        'wav' => 'audio/x-wav',
+        'xm' => 'audio/xm',
+        'cdx' => 'chemical/x-cdx',
+        'cif' => 'chemical/x-cif',
+        'cmdf' => 'chemical/x-cmdf',
+        'cml' => 'chemical/x-cml',
+        'csml' => 'chemical/x-csml',
+        'xyz' => 'chemical/x-xyz',
+        'bmp' => 'image/bmp',
+        'cgm' => 'image/cgm',
+        'g3' => 'image/g3fax',
+        'gif' => 'image/gif',
+        'ief' => 'image/ief',
+        'jpeg' => 'image/jpeg',
+        'jpg' => 'image/jpeg',
+        'jpe' => 'image/jpeg',
+        'ktx' => 'image/ktx',
+        'png' => 'image/png',
+        'btif' => 'image/prs.btif',
+        'sgi' => 'image/sgi',
+        'svg' => 'image/svg+xml',
+        'svgz' => 'image/svg+xml',
+        'tiff' => 'image/tiff',
+        'tif' => 'image/tiff',
+        'psd' => 'image/vnd.adobe.photoshop',
+        'uvi' => 'image/vnd.dece.graphic',
+        'uvvi' => 'image/vnd.dece.graphic',
+        'uvg' => 'image/vnd.dece.graphic',
+        'uvvg' => 'image/vnd.dece.graphic',
+        'sub' => 'image/vnd.dvb.subtitle',
+        'djvu' => 'image/vnd.djvu',
+        'djv' => 'image/vnd.djvu',
+        'dwg' => 'image/vnd.dwg',
+        'dxf' => 'image/vnd.dxf',
+        'fbs' => 'image/vnd.fastbidsheet',
+        'fpx' => 'image/vnd.fpx',
+        'fst' => 'image/vnd.fst',
+        'mmr' => 'image/vnd.fujixerox.edmics-mmr',
+        'rlc' => 'image/vnd.fujixerox.edmics-rlc',
+        'mdi' => 'image/vnd.ms-modi',
+        'wdp' => 'image/vnd.ms-photo',
+        'npx' => 'image/vnd.net-fpx',
+        'wbmp' => 'image/vnd.wap.wbmp',
+        'xif' => 'image/vnd.xiff',
+        'webp' => 'image/webp',
+        '3ds' => 'image/x-3ds',
+        'ras' => 'image/x-cmu-raster',
+        'cmx' => 'image/x-cmx',
+        'fh' => 'image/x-freehand',
+        'fhc' => 'image/x-freehand',
+        'fh4' => 'image/x-freehand',
+        'fh5' => 'image/x-freehand',
+        'fh7' => 'image/x-freehand',
+        'ico' => 'image/x-icon',
+        'sid' => 'image/x-mrsid-image',
+        'pcx' => 'image/x-pcx',
+        'pic' => 'image/x-pict',
+        'pct' => 'image/x-pict',
+        'pnm' => 'image/x-portable-anymap',
+        'pbm' => 'image/x-portable-bitmap',
+        'pgm' => 'image/x-portable-graymap',
+        'ppm' => 'image/x-portable-pixmap',
+        'rgb' => 'image/x-rgb',
+        'tga' => 'image/x-tga',
+        'xbm' => 'image/x-xbitmap',
+        'xpm' => 'image/x-xpixmap',
+        'xwd' => 'image/x-xwindowdump',
+        'eml' => 'message/rfc822',
+        'mime' => 'message/rfc822',
+        'igs' => 'model/iges',
+        'iges' => 'model/iges',
+        'msh' => 'model/mesh',
+        'mesh' => 'model/mesh',
+        'silo' => 'model/mesh',
+        'dae' => 'model/vnd.collada+xml',
+        'dwf' => 'model/vnd.dwf',
+        'gdl' => 'model/vnd.gdl',
+        'gtw' => 'model/vnd.gtw',
+        'mts' => 'model/vnd.mts',
+        'vtu' => 'model/vnd.vtu',
+        'wrl' => 'model/vrml',
+        'vrml' => 'model/vrml',
+        'x3db' => 'model/x3d+binary',
+        'x3dbz' => 'model/x3d+binary',
+        'x3dv' => 'model/x3d+vrml',
+        'x3dvz' => 'model/x3d+vrml',
+        'x3d' => 'model/x3d+xml',
+        'x3dz' => 'model/x3d+xml',
+        'appcache' => 'text/cache-manifest',
+        'ics' => 'text/calendar',
+        'ifb' => 'text/calendar',
+        'css' => 'text/css',
+        'csv' => 'text/csv',
+        'html' => 'text/html',
+        'htm' => 'text/html',
+        'n3' => 'text/n3',
+        'txt' => 'text/plain',
+        'text' => 'text/plain',
+        'conf' => 'text/plain',
+        'def' => 'text/plain',
+        'list' => 'text/plain',
+        'log' => 'text/plain',
+        'in' => 'text/plain',
+        'dsc' => 'text/prs.lines.tag',
+        'rtx' => 'text/richtext',
+        'sgml' => 'text/sgml',
+        'sgm' => 'text/sgml',
+        'tsv' => 'text/tab-separated-values',
+        't' => 'text/troff',
+        'tr' => 'text/troff',
+        'roff' => 'text/troff',
+        'man' => 'text/troff',
+        'me' => 'text/troff',
+        'ms' => 'text/troff',
+        'ttl' => 'text/turtle',
+        'uri' => 'text/uri-list',
+        'uris' => 'text/uri-list',
+        'urls' => 'text/uri-list',
+        'vcard' => 'text/vcard',
+        'curl' => 'text/vnd.curl',
+        'dcurl' => 'text/vnd.curl.dcurl',
+        'scurl' => 'text/vnd.curl.scurl',
+        'mcurl' => 'text/vnd.curl.mcurl',
+        'fly' => 'text/vnd.fly',
+        'flx' => 'text/vnd.fmi.flexstor',
+        'gv' => 'text/vnd.graphviz',
+        '3dml' => 'text/vnd.in3d.3dml',
+        'spot' => 'text/vnd.in3d.spot',
+        'jad' => 'text/vnd.sun.j2me.app-descriptor',
+        'wml' => 'text/vnd.wap.wml',
+        'wmls' => 'text/vnd.wap.wmlscript',
+        's' => 'text/x-asm',
+        'asm' => 'text/x-asm',
+        'c' => 'text/x-c',
+        'cc' => 'text/x-c',
+        'cxx' => 'text/x-c',
+        'cpp' => 'text/x-c',
+        'h' => 'text/x-c',
+        'hh' => 'text/x-c',
+        'dic' => 'text/x-c',
+        'f' => 'text/x-fortran',
+        'for' => 'text/x-fortran',
+        'f77' => 'text/x-fortran',
+        'f90' => 'text/x-fortran',
+        'java' => 'text/x-java-source',
+        'opml' => 'text/x-opml',
+        'p' => 'text/x-pascal',
+        'pas' => 'text/x-pascal',
+        'nfo' => 'text/x-nfo',
+        'etx' => 'text/x-setext',
+        'sfv' => 'text/x-sfv',
+        'uu' => 'text/x-uuencode',
+        'vcs' => 'text/x-vcalendar',
+        'vcf' => 'text/x-vcard',
+        '3gp' => 'video/3gpp',
+        '3g2' => 'video/3gpp2',
+        'h261' => 'video/h261',
+        'h263' => 'video/h263',
+        'h264' => 'video/h264',
+        'jpgv' => 'video/jpeg',
+        'jpm' => 'video/jpm',
+        'jpgm' => 'video/jpm',
+        'mj2' => 'video/mj2',
+        'mjp2' => 'video/mj2',
+        'mp4' => 'video/mp4',
+        'mp4v' => 'video/mp4',
+        'mpg4' => 'video/mp4',
+        'mpeg' => 'video/mpeg',
+        'mpg' => 'video/mpeg',
+        'mpe' => 'video/mpeg',
+        'm1v' => 'video/mpeg',
+        'm2v' => 'video/mpeg',
+        'ogv' => 'video/ogg',
+        'qt' => 'video/quicktime',
+        'mov' => 'video/quicktime',
+        'uvh' => 'video/vnd.dece.hd',
+        'uvvh' => 'video/vnd.dece.hd',
+        'uvm' => 'video/vnd.dece.mobile',
+        'uvvm' => 'video/vnd.dece.mobile',
+        'uvp' => 'video/vnd.dece.pd',
+        'uvvp' => 'video/vnd.dece.pd',
+        'uvs' => 'video/vnd.dece.sd',
+        'uvvs' => 'video/vnd.dece.sd',
+        'uvv' => 'video/vnd.dece.video',
+        'uvvv' => 'video/vnd.dece.video',
+        'dvb' => 'video/vnd.dvb.file',
+        'fvt' => 'video/vnd.fvt',
+        'mxu' => 'video/vnd.mpegurl',
+        'm4u' => 'video/vnd.mpegurl',
+        'pyv' => 'video/vnd.ms-playready.media.pyv',
+        'uvu' => 'video/vnd.uvvu.mp4',
+        'uvvu' => 'video/vnd.uvvu.mp4',
+        'viv' => 'video/vnd.vivo',
+        'webm' => 'video/webm',
+        'f4v' => 'video/x-f4v',
+        'fli' => 'video/x-fli',
+        'flv' => 'video/x-flv',
+        'm4v' => 'video/x-m4v',
+        'mkv' => 'video/x-matroska',
+        'mk3d' => 'video/x-matroska',
+        'mks' => 'video/x-matroska',
+        'mng' => 'video/x-mng',
+        'asf' => 'video/x-ms-asf',
+        'asx' => 'video/x-ms-asf',
+        'vob' => 'video/x-ms-vob',
+        'wm' => 'video/x-ms-wm',
+        'wmv' => 'video/x-ms-wmv',
+        'wmx' => 'video/x-ms-wmx',
+        'wvx' => 'video/x-ms-wvx',
+        'avi' => 'video/x-msvideo',
+        'movie' => 'video/x-sgi-movie',
+        'smv' => 'video/x-smv',
+        'ice' => 'x-conference/x-cooltalk',
+    );
+
+    protected $typeToExtensions = array(
+        'application/andrew-inset' => array('ez'),
+        'application/applixware' => array('aw'),
+        'application/atom+xml' => array('atom'),
+        'application/atomcat+xml' => array('atomcat'),
+        'application/atomsvc+xml' => array('atomsvc'),
+        'application/ccxml+xml' => array('ccxml'),
+        'application/cdmi-capability' => array('cdmia'),
+        'application/cdmi-container' => array('cdmic'),
+        'application/cdmi-domain' => array('cdmid'),
+        'application/cdmi-object' => array('cdmio'),
+        'application/cdmi-queue' => array('cdmiq'),
+        'application/cu-seeme' => array('cu'),
+        'application/davmount+xml' => array('davmount'),
+        'application/docbook+xml' => array('dbk'),
+        'application/dssc+der' => array('dssc'),
+        'application/dssc+xml' => array('xdssc'),
+        'application/ecmascript' => array('ecma'),
+        'application/emma+xml' => array('emma'),
+        'application/epub+zip' => array('epub'),
+        'application/exi' => array('exi'),
+        'application/font-tdpfr' => array('pfr'),
+        'application/gml+xml' => array('gml'),
+        'application/gpx+xml' => array('gpx'),
+        'application/gxf' => array('gxf'),
+        'application/hyperstudio' => array('stk'),
+        'application/inkml+xml' => array('ink', 'inkml'),
+        'application/ipfix' => array('ipfix'),
+        'application/java-archive' => array('jar'),
+        'application/java-serialized-object' => array('ser'),
+        'application/java-vm' => array('class'),
+        'application/javascript' => array('js'),
+        'application/json' => array('json'),
+        'application/jsonml+json' => array('jsonml'),
+        'application/lost+xml' => array('lostxml'),
+        'application/mac-binhex40' => array('hqx'),
+        'application/mac-compactpro' => array('cpt'),
+        'application/mads+xml' => array('mads'),
+        'application/marc' => array('mrc'),
+        'application/marcxml+xml' => array('mrcx'),
+        'application/mathematica' => array('ma', 'nb', 'mb'),
+        'application/mathml+xml' => array('mathml'),
+        'application/mbox' => array('mbox'),
+        'application/mediaservercontrol+xml' => array('mscml'),
+        'application/metalink+xml' => array('metalink'),
+        'application/metalink4+xml' => array('meta4'),
+        'application/mets+xml' => array('mets'),
+        'application/mods+xml' => array('mods'),
+        'application/mp21' => array('m21', 'mp21'),
+        'application/mp4' => array('mp4s'),
+        'application/msword' => array('doc', 'dot'),
+        'application/mxf' => array('mxf'),
+        'application/octet-stream' => array('bin', 'dms', 'lrf', 'mar', 'so', 'dist', 'distz', 'pkg', 'bpk', 'dump', 'elc', 'deploy'),
+        'application/oda' => array('oda'),
+        'application/oebps-package+xml' => array('opf'),
+        'application/ogg' => array('ogx'),
+        'application/omdoc+xml' => array('omdoc'),
+        'application/onenote' => array('onetoc', 'onetoc2', 'onetmp', 'onepkg'),
+        'application/oxps' => array('oxps'),
+        'application/patch-ops-error+xml' => array('xer'),
+        'application/pdf' => array('pdf'),
+        'application/pgp-encrypted' => array('pgp'),
+        'application/pgp-signature' => array('asc', 'sig'),
+        'application/pics-rules' => array('prf'),
+        'application/pkcs10' => array('p10'),
+        'application/pkcs7-mime' => array('p7m', 'p7c'),
+        'application/pkcs7-signature' => array('p7s'),
+        'application/pkcs8' => array('p8'),
+        'application/pkix-attr-cert' => array('ac'),
+        'application/pkix-cert' => array('cer'),
+        'application/pkix-crl' => array('crl'),
+        'application/pkix-pkipath' => array('pkipath'),
+        'application/pkixcmp' => array('pki'),
+        'application/pls+xml' => array('pls'),
+        'application/postscript' => array('ai', 'eps', 'ps'),
+        'application/prs.cww' => array('cww'),
+        'application/pskc+xml' => array('pskcxml'),
+        'application/rdf+xml' => array('rdf'),
+        'application/reginfo+xml' => array('rif'),
+        'application/relax-ng-compact-syntax' => array('rnc'),
+        'application/resource-lists+xml' => array('rl'),
+        'application/resource-lists-diff+xml' => array('rld'),
+        'application/rls-services+xml' => array('rs'),
+        'application/rpki-ghostbusters' => array('gbr'),
+        'application/rpki-manifest' => array('mft'),
+        'application/rpki-roa' => array('roa'),
+        'application/rsd+xml' => array('rsd'),
+        'application/rss+xml' => array('rss'),
+        'application/rtf' => array('rtf'),
+        'application/sbml+xml' => array('sbml'),
+        'application/scvp-cv-request' => array('scq'),
+        'application/scvp-cv-response' => array('scs'),
+        'application/scvp-vp-request' => array('spq'),
+        'application/scvp-vp-response' => array('spp'),
+        'application/sdp' => array('sdp'),
+        'application/set-payment-initiation' => array('setpay'),
+        'application/set-registration-initiation' => array('setreg'),
+        'application/shf+xml' => array('shf'),
+        'application/smil+xml' => array('smi', 'smil'),
+        'application/sparql-query' => array('rq'),
+        'application/sparql-results+xml' => array('srx'),
+        'application/srgs' => array('gram'),
+        'application/srgs+xml' => array('grxml'),
+        'application/sru+xml' => array('sru'),
+        'application/ssdl+xml' => array('ssdl'),
+        'application/ssml+xml' => array('ssml'),
+        'application/tei+xml' => array('tei', 'teicorpus'),
+        'application/thraud+xml' => array('tfi'),
+        'application/timestamped-data' => array('tsd'),
+        'application/vnd.3gpp.pic-bw-large' => array('plb'),
+        'application/vnd.3gpp.pic-bw-small' => array('psb'),
+        'application/vnd.3gpp.pic-bw-var' => array('pvb'),
+        'application/vnd.3gpp2.tcap' => array('tcap'),
+        'application/vnd.3m.post-it-notes' => array('pwn'),
+        'application/vnd.accpac.simply.aso' => array('aso'),
+        'application/vnd.accpac.simply.imp' => array('imp'),
+        'application/vnd.acucobol' => array('acu'),
+        'application/vnd.acucorp' => array('atc', 'acutc'),
+        'application/vnd.adobe.air-application-installer-package+zip' => array('air'),
+        'application/vnd.adobe.formscentral.fcdt' => array('fcdt'),
+        'application/vnd.adobe.fxp' => array('fxp', 'fxpl'),
+        'application/vnd.adobe.xdp+xml' => array('xdp'),
+        'application/vnd.adobe.xfdf' => array('xfdf'),
+        'application/vnd.ahead.space' => array('ahead'),
+        'application/vnd.airzip.filesecure.azf' => array('azf'),
+        'application/vnd.airzip.filesecure.azs' => array('azs'),
+        'application/vnd.amazon.ebook' => array('azw'),
+        'application/vnd.americandynamics.acc' => array('acc'),
+        'application/vnd.amiga.ami' => array('ami'),
+        'application/vnd.android.package-archive' => array('apk'),
+        'application/vnd.anser-web-certificate-issue-initiation' => array('cii'),
+        'application/vnd.anser-web-funds-transfer-initiation' => array('fti'),
+        'application/vnd.antix.game-component' => array('atx'),
+        'application/vnd.apple.installer+xml' => array('mpkg'),
+        'application/vnd.apple.mpegurl' => array('m3u8'),
+        'application/vnd.aristanetworks.swi' => array('swi'),
+        'application/vnd.astraea-software.iota' => array('iota'),
+        'application/vnd.audiograph' => array('aep'),
+        'application/vnd.blueice.multipass' => array('mpm'),
+        'application/vnd.bmi' => array('bmi'),
+        'application/vnd.businessobjects' => array('rep'),
+        'application/vnd.chemdraw+xml' => array('cdxml'),
+        'application/vnd.chipnuts.karaoke-mmd' => array('mmd'),
+        'application/vnd.cinderella' => array('cdy'),
+        'application/vnd.claymore' => array('cla'),
+        'application/vnd.cloanto.rp9' => array('rp9'),
+        'application/vnd.clonk.c4group' => array('c4g', 'c4d', 'c4f', 'c4p', 'c4u'),
+        'application/vnd.cluetrust.cartomobile-config' => array('c11amc'),
+        'application/vnd.cluetrust.cartomobile-config-pkg' => array('c11amz'),
+        'application/vnd.commonspace' => array('csp'),
+        'application/vnd.contact.cmsg' => array('cdbcmsg'),
+        'application/vnd.cosmocaller' => array('cmc'),
+        'application/vnd.crick.clicker' => array('clkx'),
+        'application/vnd.crick.clicker.keyboard' => array('clkk'),
+        'application/vnd.crick.clicker.palette' => array('clkp'),
+        'application/vnd.crick.clicker.template' => array('clkt'),
+        'application/vnd.crick.clicker.wordbank' => array('clkw'),
+        'application/vnd.criticaltools.wbs+xml' => array('wbs'),
+        'application/vnd.ctc-posml' => array('pml'),
+        'application/vnd.cups-ppd' => array('ppd'),
+        'application/vnd.curl.car' => array('car'),
+        'application/vnd.curl.pcurl' => array('pcurl'),
+        'application/vnd.dart' => array('dart'),
+        'application/vnd.data-vision.rdz' => array('rdz'),
+        'application/vnd.dece.data' => array('uvf', 'uvvf', 'uvd', 'uvvd'),
+        'application/vnd.dece.ttml+xml' => array('uvt', 'uvvt'),
+        'application/vnd.dece.unspecified' => array('uvx', 'uvvx'),
+        'application/vnd.dece.zip' => array('uvz', 'uvvz'),
+        'application/vnd.denovo.fcselayout-link' => array('fe_launch'),
+        'application/vnd.dna' => array('dna'),
+        'application/vnd.dolby.mlp' => array('mlp'),
+        'application/vnd.dpgraph' => array('dpg'),
+        'application/vnd.dreamfactory' => array('dfac'),
+        'application/vnd.ds-keypoint' => array('kpxx'),
+        'application/vnd.dvb.ait' => array('ait'),
+        'application/vnd.dvb.service' => array('svc'),
+        'application/vnd.dynageo' => array('geo'),
+        'application/vnd.ecowin.chart' => array('mag'),
+        'application/vnd.enliven' => array('nml'),
+        'application/vnd.epson.esf' => array('esf'),
+        'application/vnd.epson.msf' => array('msf'),
+        'application/vnd.epson.quickanime' => array('qam'),
+        'application/vnd.epson.salt' => array('slt'),
+        'application/vnd.epson.ssf' => array('ssf'),
+        'application/vnd.eszigno3+xml' => array('es3', 'et3'),
+        'application/vnd.ezpix-album' => array('ez2'),
+        'application/vnd.ezpix-package' => array('ez3'),
+        'application/vnd.fdf' => array('fdf'),
+        'application/vnd.fdsn.mseed' => array('mseed'),
+        'application/vnd.fdsn.seed' => array('seed', 'dataless'),
+        'application/vnd.flographit' => array('gph'),
+        'application/vnd.fluxtime.clip' => array('ftc'),
+        'application/vnd.framemaker' => array('fm', 'frame', 'maker', 'book'),
+        'application/vnd.frogans.fnc' => array('fnc'),
+        'application/vnd.frogans.ltf' => array('ltf'),
+        'application/vnd.fsc.weblaunch' => array('fsc'),
+        'application/vnd.fujitsu.oasys' => array('oas'),
+        'application/vnd.fujitsu.oasys2' => array('oa2'),
+        'application/vnd.fujitsu.oasys3' => array('oa3'),
+        'application/vnd.fujitsu.oasysgp' => array('fg5'),
+        'application/vnd.fujitsu.oasysprs' => array('bh2'),
+        'application/vnd.fujixerox.ddd' => array('ddd'),
+        'application/vnd.fujixerox.docuworks' => array('xdw'),
+        'application/vnd.fujixerox.docuworks.binder' => array('xbd'),
+        'application/vnd.fuzzysheet' => array('fzs'),
+        'application/vnd.genomatix.tuxedo' => array('txd'),
+        'application/vnd.geogebra.file' => array('ggb'),
+        'application/vnd.geogebra.tool' => array('ggt'),
+        'application/vnd.geometry-explorer' => array('gex', 'gre'),
+        'application/vnd.geonext' => array('gxt'),
+        'application/vnd.geoplan' => array('g2w'),
+        'application/vnd.geospace' => array('g3w'),
+        'application/vnd.gmx' => array('gmx'),
+        'application/vnd.google-earth.kml+xml' => array('kml'),
+        'application/vnd.google-earth.kmz' => array('kmz'),
+        'application/vnd.grafeq' => array('gqf', 'gqs'),
+        'application/vnd.groove-account' => array('gac'),
+        'application/vnd.groove-help' => array('ghf'),
+        'application/vnd.groove-identity-message' => array('gim'),
+        'application/vnd.groove-injector' => array('grv'),
+        'application/vnd.groove-tool-message' => array('gtm'),
+        'application/vnd.groove-tool-template' => array('tpl'),
+        'application/vnd.groove-vcard' => array('vcg'),
+        'application/vnd.hal+xml' => array('hal'),
+        'application/vnd.handheld-entertainment+xml' => array('zmm'),
+        'application/vnd.hbci' => array('hbci'),
+        'application/vnd.hhe.lesson-player' => array('les'),
+        'application/vnd.hp-hpgl' => array('hpgl'),
+        'application/vnd.hp-hpid' => array('hpid'),
+        'application/vnd.hp-hps' => array('hps'),
+        'application/vnd.hp-jlyt' => array('jlt'),
+        'application/vnd.hp-pcl' => array('pcl'),
+        'application/vnd.hp-pclxl' => array('pclxl'),
+        'application/vnd.hydrostatix.sof-data' => array('sfd-hdstx'),
+        'application/vnd.ibm.minipay' => array('mpy'),
+        'application/vnd.ibm.modcap' => array('afp', 'listafp', 'list3820'),
+        'application/vnd.ibm.rights-management' => array('irm'),
+        'application/vnd.ibm.secure-container' => array('sc'),
+        'application/vnd.iccprofile' => array('icc', 'icm'),
+        'application/vnd.igloader' => array('igl'),
+        'application/vnd.immervision-ivp' => array('ivp'),
+        'application/vnd.immervision-ivu' => array('ivu'),
+        'application/vnd.insors.igm' => array('igm'),
+        'application/vnd.intercon.formnet' => array('xpw', 'xpx'),
+        'application/vnd.intergeo' => array('i2g'),
+        'application/vnd.intu.qbo' => array('qbo'),
+        'application/vnd.intu.qfx' => array('qfx'),
+        'application/vnd.ipunplugged.rcprofile' => array('rcprofile'),
+        'application/vnd.irepository.package+xml' => array('irp'),
+        'application/vnd.is-xpr' => array('xpr'),
+        'application/vnd.isac.fcs' => array('fcs'),
+        'application/vnd.jam' => array('jam'),
+        'application/vnd.jcp.javame.midlet-rms' => array('rms'),
+        'application/vnd.jisp' => array('jisp'),
+        'application/vnd.joost.joda-archive' => array('joda'),
+        'application/vnd.kahootz' => array('ktz', 'ktr'),
+        'application/vnd.kde.karbon' => array('karbon'),
+        'application/vnd.kde.kchart' => array('chrt'),
+        'application/vnd.kde.kformula' => array('kfo'),
+        'application/vnd.kde.kivio' => array('flw'),
+        'application/vnd.kde.kontour' => array('kon'),
+        'application/vnd.kde.kpresenter' => array('kpr', 'kpt'),
+        'application/vnd.kde.kspread' => array('ksp'),
+        'application/vnd.kde.kword' => array('kwd', 'kwt'),
+        'application/vnd.kenameaapp' => array('htke'),
+        'application/vnd.kidspiration' => array('kia'),
+        'application/vnd.kinar' => array('kne', 'knp'),
+        'application/vnd.koan' => array('skp', 'skd', 'skt', 'skm'),
+        'application/vnd.kodak-descriptor' => array('sse'),
+        'application/vnd.las.las+xml' => array('lasxml'),
+        'application/vnd.llamagraphics.life-balance.desktop' => array('lbd'),
+        'application/vnd.llamagraphics.life-balance.exchange+xml' => array('lbe'),
+        'application/vnd.lotus-1-2-3' => array('123'),
+        'application/vnd.lotus-approach' => array('apr'),
+        'application/vnd.lotus-freelance' => array('pre'),
+        'application/vnd.lotus-notes' => array('nsf'),
+        'application/vnd.lotus-organizer' => array('org'),
+        'application/vnd.lotus-screencam' => array('scm'),
+        'application/vnd.lotus-wordpro' => array('lwp'),
+        'application/vnd.macports.portpkg' => array('portpkg'),
+        'application/vnd.mcd' => array('mcd'),
+        'application/vnd.medcalcdata' => array('mc1'),
+        'application/vnd.mediastation.cdkey' => array('cdkey'),
+        'application/vnd.mfer' => array('mwf'),
+        'application/vnd.mfmp' => array('mfm'),
+        'application/vnd.micrografx.flo' => array('flo'),
+        'application/vnd.micrografx.igx' => array('igx'),
+        'application/vnd.mif' => array('mif'),
+        'application/vnd.mobius.daf' => array('daf'),
+        'application/vnd.mobius.dis' => array('dis'),
+        'application/vnd.mobius.mbk' => array('mbk'),
+        'application/vnd.mobius.mqy' => array('mqy'),
+        'application/vnd.mobius.msl' => array('msl'),
+        'application/vnd.mobius.plc' => array('plc'),
+        'application/vnd.mobius.txf' => array('txf'),
+        'application/vnd.mophun.application' => array('mpn'),
+        'application/vnd.mophun.certificate' => array('mpc'),
+        'application/vnd.mozilla.xul+xml' => array('xul'),
+        'application/vnd.ms-artgalry' => array('cil'),
+        'application/vnd.ms-cab-compressed' => array('cab'),
+        'application/vnd.ms-excel' => array('xls', 'xlm', 'xla', 'xlc', 'xlt', 'xlw'),
+        'application/vnd.ms-excel.addin.macroenabled.12' => array('xlam'),
+        'application/vnd.ms-excel.sheet.binary.macroenabled.12' => array('xlsb'),
+        'application/vnd.ms-excel.sheet.macroenabled.12' => array('xlsm'),
+        'application/vnd.ms-excel.template.macroenabled.12' => array('xltm'),
+        'application/vnd.ms-fontobject' => array('eot'),
+        'application/vnd.ms-htmlhelp' => array('chm'),
+        'application/vnd.ms-ims' => array('ims'),
+        'application/vnd.ms-lrm' => array('lrm'),
+        'application/vnd.ms-officetheme' => array('thmx'),
+        'application/vnd.ms-pki.seccat' => array('cat'),
+        'application/vnd.ms-pki.stl' => array('stl'),
+        'application/vnd.ms-powerpoint' => array('ppt', 'pps', 'pot'),
+        'application/vnd.ms-powerpoint.addin.macroenabled.12' => array('ppam'),
+        'application/vnd.ms-powerpoint.presentation.macroenabled.12' => array('pptm'),
+        'application/vnd.ms-powerpoint.slide.macroenabled.12' => array('sldm'),
+        'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => array('ppsm'),
+        'application/vnd.ms-powerpoint.template.macroenabled.12' => array('potm'),
+        'application/vnd.ms-project' => array('mpp', 'mpt'),
+        'application/vnd.ms-word.document.macroenabled.12' => array('docm'),
+        'application/vnd.ms-word.template.macroenabled.12' => array('dotm'),
+        'application/vnd.ms-works' => array('wps', 'wks', 'wcm', 'wdb'),
+        'application/vnd.ms-wpl' => array('wpl'),
+        'application/vnd.ms-xpsdocument' => array('xps'),
+        'application/vnd.mseq' => array('mseq'),
+        'application/vnd.musician' => array('mus'),
+        'application/vnd.muvee.style' => array('msty'),
+        'application/vnd.mynfc' => array('taglet'),
+        'application/vnd.neurolanguage.nlu' => array('nlu'),
+        'application/vnd.nitf' => array('ntf', 'nitf'),
+        'application/vnd.noblenet-directory' => array('nnd'),
+        'application/vnd.noblenet-sealer' => array('nns'),
+        'application/vnd.noblenet-web' => array('nnw'),
+        'application/vnd.nokia.n-gage.data' => array('ngdat'),
+        'application/vnd.nokia.n-gage.symbian.install' => array('n-gage'),
+        'application/vnd.nokia.radio-preset' => array('rpst'),
+        'application/vnd.nokia.radio-presets' => array('rpss'),
+        'application/vnd.novadigm.edm' => array('edm'),
+        'application/vnd.novadigm.edx' => array('edx'),
+        'application/vnd.novadigm.ext' => array('ext'),
+        'application/vnd.oasis.opendocument.chart' => array('odc'),
+        'application/vnd.oasis.opendocument.chart-template' => array('otc'),
+        'application/vnd.oasis.opendocument.database' => array('odb'),
+        'application/vnd.oasis.opendocument.formula' => array('odf'),
+        'application/vnd.oasis.opendocument.formula-template' => array('odft'),
+        'application/vnd.oasis.opendocument.graphics' => array('odg'),
+        'application/vnd.oasis.opendocument.graphics-template' => array('otg'),
+        'application/vnd.oasis.opendocument.image' => array('odi'),
+        'application/vnd.oasis.opendocument.image-template' => array('oti'),
+        'application/vnd.oasis.opendocument.presentation' => array('odp'),
+        'application/vnd.oasis.opendocument.presentation-template' => array('otp'),
+        'application/vnd.oasis.opendocument.spreadsheet' => array('ods'),
+        'application/vnd.oasis.opendocument.spreadsheet-template' => array('ots'),
+        'application/vnd.oasis.opendocument.text' => array('odt'),
+        'application/vnd.oasis.opendocument.text-master' => array('odm'),
+        'application/vnd.oasis.opendocument.text-template' => array('ott'),
+        'application/vnd.oasis.opendocument.text-web' => array('oth'),
+        'application/vnd.olpc-sugar' => array('xo'),
+        'application/vnd.oma.dd2+xml' => array('dd2'),
+        'application/vnd.openofficeorg.extension' => array('oxt'),
+        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => array('pptx'),
+        'application/vnd.openxmlformats-officedocument.presentationml.slide' => array('sldx'),
+        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => array('ppsx'),
+        'application/vnd.openxmlformats-officedocument.presentationml.template' => array('potx'),
+        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => array('xlsx'),
+        'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => array('xltx'),
+        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => array('docx'),
+        'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => array('dotx'),
+        'application/vnd.osgeo.mapguide.package' => array('mgp'),
+        'application/vnd.osgi.dp' => array('dp'),
+        'application/vnd.osgi.subsystem' => array('esa'),
+        'application/vnd.palm' => array('pdb', 'pqa', 'oprc'),
+        'application/vnd.pawaafile' => array('paw'),
+        'application/vnd.pg.format' => array('str'),
+        'application/vnd.pg.osasli' => array('ei6'),
+        'application/vnd.picsel' => array('efif'),
+        'application/vnd.pmi.widget' => array('wg'),
+        'application/vnd.pocketlearn' => array('plf'),
+        'application/vnd.powerbuilder6' => array('pbd'),
+        'application/vnd.previewsystems.box' => array('box'),
+        'application/vnd.proteus.magazine' => array('mgz'),
+        'application/vnd.publishare-delta-tree' => array('qps'),
+        'application/vnd.pvi.ptid1' => array('ptid'),
+        'application/vnd.quark.quarkxpress' => array('qxd', 'qxt', 'qwd', 'qwt', 'qxl', 'qxb'),
+        'application/vnd.realvnc.bed' => array('bed'),
+        'application/vnd.recordare.musicxml' => array('mxl'),
+        'application/vnd.recordare.musicxml+xml' => array('musicxml'),
+        'application/vnd.rig.cryptonote' => array('cryptonote'),
+        'application/vnd.rim.cod' => array('cod'),
+        'application/vnd.rn-realmedia' => array('rm'),
+        'application/vnd.rn-realmedia-vbr' => array('rmvb'),
+        'application/vnd.route66.link66+xml' => array('link66'),
+        'application/vnd.sailingtracker.track' => array('st'),
+        'application/vnd.seemail' => array('see'),
+        'application/vnd.sema' => array('sema'),
+        'application/vnd.semd' => array('semd'),
+        'application/vnd.semf' => array('semf'),
+        'application/vnd.shana.informed.formdata' => array('ifm'),
+        'application/vnd.shana.informed.formtemplate' => array('itp'),
+        'application/vnd.shana.informed.interchange' => array('iif'),
+        'application/vnd.shana.informed.package' => array('ipk'),
+        'application/vnd.simtech-mindmapper' => array('twd', 'twds'),
+        'application/vnd.smaf' => array('mmf'),
+        'application/vnd.smart.teacher' => array('teacher'),
+        'application/vnd.solent.sdkm+xml' => array('sdkm', 'sdkd'),
+        'application/vnd.spotfire.dxp' => array('dxp'),
+        'application/vnd.spotfire.sfs' => array('sfs'),
+        'application/vnd.stardivision.calc' => array('sdc'),
+        'application/vnd.stardivision.draw' => array('sda'),
+        'application/vnd.stardivision.impress' => array('sdd'),
+        'application/vnd.stardivision.math' => array('smf'),
+        'application/vnd.stardivision.writer' => array('sdw', 'vor'),
+        'application/vnd.stardivision.writer-global' => array('sgl'),
+        'application/vnd.stepmania.package' => array('smzip'),
+        'application/vnd.stepmania.stepchart' => array('sm'),
+        'application/vnd.sun.xml.calc' => array('sxc'),
+        'application/vnd.sun.xml.calc.template' => array('stc'),
+        'application/vnd.sun.xml.draw' => array('sxd'),
+        'application/vnd.sun.xml.draw.template' => array('std'),
+        'application/vnd.sun.xml.impress' => array('sxi'),
+        'application/vnd.sun.xml.impress.template' => array('sti'),
+        'application/vnd.sun.xml.math' => array('sxm'),
+        'application/vnd.sun.xml.writer' => array('sxw'),
+        'application/vnd.sun.xml.writer.global' => array('sxg'),
+        'application/vnd.sun.xml.writer.template' => array('stw'),
+        'application/vnd.sus-calendar' => array('sus', 'susp'),
+        'application/vnd.svd' => array('svd'),
+        'application/vnd.symbian.install' => array('sis', 'sisx'),
+        'application/vnd.syncml+xml' => array('xsm'),
+        'application/vnd.syncml.dm+wbxml' => array('bdm'),
+        'application/vnd.syncml.dm+xml' => array('xdm'),
+        'application/vnd.tao.intent-module-archive' => array('tao'),
+        'application/vnd.tcpdump.pcap' => array('pcap', 'cap', 'dmp'),
+        'application/vnd.tmobile-livetv' => array('tmo'),
+        'application/vnd.trid.tpt' => array('tpt'),
+        'application/vnd.triscape.mxs' => array('mxs'),
+        'application/vnd.trueapp' => array('tra'),
+        'application/vnd.ufdl' => array('ufd', 'ufdl'),
+        'application/vnd.uiq.theme' => array('utz'),
+        'application/vnd.umajin' => array('umj'),
+        'application/vnd.unity' => array('unityweb'),
+        'application/vnd.uoml+xml' => array('uoml'),
+        'application/vnd.vcx' => array('vcx'),
+        'application/vnd.visio' => array('vsd', 'vst', 'vss', 'vsw'),
+        'application/vnd.visionary' => array('vis'),
+        'application/vnd.vsf' => array('vsf'),
+        'application/vnd.wap.wbxml' => array('wbxml'),
+        'application/vnd.wap.wmlc' => array('wmlc'),
+        'application/vnd.wap.wmlscriptc' => array('wmlsc'),
+        'application/vnd.webturbo' => array('wtb'),
+        'application/vnd.wolfram.player' => array('nbp'),
+        'application/vnd.wordperfect' => array('wpd'),
+        'application/vnd.wqd' => array('wqd'),
+        'application/vnd.wt.stf' => array('stf'),
+        'application/vnd.xara' => array('xar'),
+        'application/vnd.xfdl' => array('xfdl'),
+        'application/vnd.yamaha.hv-dic' => array('hvd'),
+        'application/vnd.yamaha.hv-script' => array('hvs'),
+        'application/vnd.yamaha.hv-voice' => array('hvp'),
+        'application/vnd.yamaha.openscoreformat' => array('osf'),
+        'application/vnd.yamaha.openscoreformat.osfpvg+xml' => array('osfpvg'),
+        'application/vnd.yamaha.smaf-audio' => array('saf'),
+        'application/vnd.yamaha.smaf-phrase' => array('spf'),
+        'application/vnd.yellowriver-custom-menu' => array('cmp'),
+        'application/vnd.zul' => array('zir', 'zirz'),
+        'application/vnd.zzazz.deck+xml' => array('zaz'),
+        'application/voicexml+xml' => array('vxml'),
+        'application/widget' => array('wgt'),
+        'application/winhlp' => array('hlp'),
+        'application/wsdl+xml' => array('wsdl'),
+        'application/wspolicy+xml' => array('wspolicy'),
+        'application/x-7z-compressed' => array('7z'),
+        'application/x-abiword' => array('abw'),
+        'application/x-ace-compressed' => array('ace'),
+        'application/x-apple-diskimage' => array('dmg'),
+        'application/x-authorware-bin' => array('aab', 'x32', 'u32', 'vox'),
+        'application/x-authorware-map' => array('aam'),
+        'application/x-authorware-seg' => array('aas'),
+        'application/x-bcpio' => array('bcpio'),
+        'application/x-bittorrent' => array('torrent'),
+        'application/x-blorb' => array('blb', 'blorb'),
+        'application/x-bzip' => array('bz'),
+        'application/x-bzip2' => array('bz2', 'boz'),
+        'application/x-cbr' => array('cbr', 'cba', 'cbt', 'cbz', 'cb7'),
+        'application/x-cdlink' => array('vcd'),
+        'application/x-cfs-compressed' => array('cfs'),
+        'application/x-chat' => array('chat'),
+        'application/x-chess-pgn' => array('pgn'),
+        'application/x-conference' => array('nsc'),
+        'application/x-cpio' => array('cpio'),
+        'application/x-csh' => array('csh'),
+        'application/x-debian-package' => array('deb', 'udeb'),
+        'application/x-dgc-compressed' => array('dgc'),
+        'application/x-director' => array('dir', 'dcr', 'dxr', 'cst', 'cct', 'cxt', 'w3d', 'fgd', 'swa'),
+        'application/x-doom' => array('wad'),
+        'application/x-dtbncx+xml' => array('ncx'),
+        'application/x-dtbook+xml' => array('dtb'),
+        'application/x-dtbresource+xml' => array('res'),
+        'application/x-dvi' => array('dvi'),
+        'application/x-envoy' => array('evy'),
+        'application/x-eva' => array('eva'),
+        'application/x-font-bdf' => array('bdf'),
+        'application/x-font-ghostscript' => array('gsf'),
+        'application/x-font-linux-psf' => array('psf'),
+        'application/x-font-otf' => array('otf'),
+        'application/x-font-pcf' => array('pcf'),
+        'application/x-font-snf' => array('snf'),
+        'application/x-font-ttf' => array('ttf', 'ttc'),
+        'application/x-font-type1' => array('pfa', 'pfb', 'pfm', 'afm'),
+        'application/x-font-woff' => array('woff'),
+        'application/x-freearc' => array('arc'),
+        'application/x-futuresplash' => array('spl'),
+        'application/x-gca-compressed' => array('gca'),
+        'application/x-glulx' => array('ulx'),
+        'application/x-gnumeric' => array('gnumeric'),
+        'application/x-gramps-xml' => array('gramps'),
+        'application/x-gtar' => array('gtar'),
+        'application/x-hdf' => array('hdf'),
+        'application/x-install-instructions' => array('install'),
+        'application/x-iso9660-image' => array('iso'),
+        'application/x-java-jnlp-file' => array('jnlp'),
+        'application/x-latex' => array('latex'),
+        'application/x-lzh-compressed' => array('lzh', 'lha'),
+        'application/x-mie' => array('mie'),
+        'application/x-mobipocket-ebook' => array('prc', 'mobi'),
+        'application/x-ms-application' => array('application'),
+        'application/x-ms-shortcut' => array('lnk'),
+        'application/x-ms-wmd' => array('wmd'),
+        'application/x-ms-wmz' => array('wmz'),
+        'application/x-ms-xbap' => array('xbap'),
+        'application/x-msaccess' => array('mdb'),
+        'application/x-msbinder' => array('obd'),
+        'application/x-mscardfile' => array('crd'),
+        'application/x-msclip' => array('clp'),
+        'application/x-msdownload' => array('exe', 'dll', 'com', 'bat', 'msi'),
+        'application/x-msmediaview' => array('mvb', 'm13', 'm14'),
+        'application/x-msmetafile' => array('wmf', 'wmz', 'emf', 'emz'),
+        'application/x-msmoney' => array('mny'),
+        'application/x-mspublisher' => array('pub'),
+        'application/x-msschedule' => array('scd'),
+        'application/x-msterminal' => array('trm'),
+        'application/x-mswrite' => array('wri'),
+        'application/x-netcdf' => array('nc', 'cdf'),
+        'application/x-nzb' => array('nzb'),
+        'application/x-pkcs12' => array('p12', 'pfx'),
+        'application/x-pkcs7-certificates' => array('p7b', 'spc'),
+        'application/x-pkcs7-certreqresp' => array('p7r'),
+        'application/x-rar-compressed' => array('rar'),
+        'application/x-research-info-systems' => array('ris'),
+        'application/x-sh' => array('sh'),
+        'application/x-shar' => array('shar'),
+        'application/x-shockwave-flash' => array('swf'),
+        'application/x-silverlight-app' => array('xap'),
+        'application/x-sql' => array('sql'),
+        'application/x-stuffit' => array('sit'),
+        'application/x-stuffitx' => array('sitx'),
+        'application/x-subrip' => array('srt'),
+        'application/x-sv4cpio' => array('sv4cpio'),
+        'application/x-sv4crc' => array('sv4crc'),
+        'application/x-t3vm-image' => array('t3'),
+        'application/x-tads' => array('gam'),
+        'application/x-tar' => array('tar'),
+        'application/x-tcl' => array('tcl'),
+        'application/x-tex' => array('tex'),
+        'application/x-tex-tfm' => array('tfm'),
+        'application/x-texinfo' => array('texinfo', 'texi'),
+        'application/x-tgif' => array('obj'),
+        'application/x-ustar' => array('ustar'),
+        'application/x-wais-source' => array('src'),
+        'application/x-x509-ca-cert' => array('der', 'crt'),
+        'application/x-xfig' => array('fig'),
+        'application/x-xliff+xml' => array('xlf'),
+        'application/x-xpinstall' => array('xpi'),
+        'application/x-xz' => array('xz'),
+        'application/x-zmachine' => array('z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8'),
+        'application/xaml+xml' => array('xaml'),
+        'application/xcap-diff+xml' => array('xdf'),
+        'application/xenc+xml' => array('xenc'),
+        'application/xhtml+xml' => array('xhtml', 'xht'),
+        'application/xml' => array('xml', 'xsl'),
+        'application/xml-dtd' => array('dtd'),
+        'application/xop+xml' => array('xop'),
+        'application/xproc+xml' => array('xpl'),
+        'application/xslt+xml' => array('xslt'),
+        'application/xspf+xml' => array('xspf'),
+        'application/xv+xml' => array('mxml', 'xhvml', 'xvml', 'xvm'),
+        'application/yang' => array('yang'),
+        'application/yin+xml' => array('yin'),
+        'application/zip' => array('zip'),
+        'audio/adpcm' => array('adp'),
+        'audio/basic' => array('au', 'snd'),
+        'audio/midi' => array('mid', 'midi', 'kar', 'rmi'),
+        'audio/mp4' => array('mp4a'),
+        'audio/mpeg' => array('mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'),
+        'audio/ogg' => array('oga', 'ogg', 'spx'),
+        'audio/s3m' => array('s3m'),
+        'audio/silk' => array('sil'),
+        'audio/vnd.dece.audio' => array('uva', 'uvva'),
+        'audio/vnd.digital-winds' => array('eol'),
+        'audio/vnd.dra' => array('dra'),
+        'audio/vnd.dts' => array('dts'),
+        'audio/vnd.dts.hd' => array('dtshd'),
+        'audio/vnd.lucent.voice' => array('lvp'),
+        'audio/vnd.ms-playready.media.pya' => array('pya'),
+        'audio/vnd.nuera.ecelp4800' => array('ecelp4800'),
+        'audio/vnd.nuera.ecelp7470' => array('ecelp7470'),
+        'audio/vnd.nuera.ecelp9600' => array('ecelp9600'),
+        'audio/vnd.rip' => array('rip'),
+        'audio/webm' => array('weba'),
+        'audio/x-aac' => array('aac'),
+        'audio/x-aiff' => array('aif', 'aiff', 'aifc'),
+        'audio/x-caf' => array('caf'),
+        'audio/x-flac' => array('flac'),
+        'audio/x-matroska' => array('mka'),
+        'audio/x-mpegurl' => array('m3u'),
+        'audio/x-ms-wax' => array('wax'),
+        'audio/x-ms-wma' => array('wma'),
+        'audio/x-pn-realaudio' => array('ram', 'ra'),
+        'audio/x-pn-realaudio-plugin' => array('rmp'),
+        'audio/x-wav' => array('wav'),
+        'audio/xm' => array('xm'),
+        'chemical/x-cdx' => array('cdx'),
+        'chemical/x-cif' => array('cif'),
+        'chemical/x-cmdf' => array('cmdf'),
+        'chemical/x-cml' => array('cml'),
+        'chemical/x-csml' => array('csml'),
+        'chemical/x-xyz' => array('xyz'),
+        'image/bmp' => array('bmp'),
+        'image/cgm' => array('cgm'),
+        'image/g3fax' => array('g3'),
+        'image/gif' => array('gif'),
+        'image/ief' => array('ief'),
+        'image/jpeg' => array('jpeg', 'jpg', 'jpe'),
+        'image/ktx' => array('ktx'),
+        'image/png' => array('png'),
+        'image/prs.btif' => array('btif'),
+        'image/sgi' => array('sgi'),
+        'image/svg+xml' => array('svg', 'svgz'),
+        'image/tiff' => array('tiff', 'tif'),
+        'image/vnd.adobe.photoshop' => array('psd'),
+        'image/vnd.dece.graphic' => array('uvi', 'uvvi', 'uvg', 'uvvg'),
+        'image/vnd.dvb.subtitle' => array('sub'),
+        'image/vnd.djvu' => array('djvu', 'djv'),
+        'image/vnd.dwg' => array('dwg'),
+        'image/vnd.dxf' => array('dxf'),
+        'image/vnd.fastbidsheet' => array('fbs'),
+        'image/vnd.fpx' => array('fpx'),
+        'image/vnd.fst' => array('fst'),
+        'image/vnd.fujixerox.edmics-mmr' => array('mmr'),
+        'image/vnd.fujixerox.edmics-rlc' => array('rlc'),
+        'image/vnd.ms-modi' => array('mdi'),
+        'image/vnd.ms-photo' => array('wdp'),
+        'image/vnd.net-fpx' => array('npx'),
+        'image/vnd.wap.wbmp' => array('wbmp'),
+        'image/vnd.xiff' => array('xif'),
+        'image/webp' => array('webp'),
+        'image/x-3ds' => array('3ds'),
+        'image/x-cmu-raster' => array('ras'),
+        'image/x-cmx' => array('cmx'),
+        'image/x-freehand' => array('fh', 'fhc', 'fh4', 'fh5', 'fh7'),
+        'image/x-icon' => array('ico'),
+        'image/x-mrsid-image' => array('sid'),
+        'image/x-pcx' => array('pcx'),
+        'image/x-pict' => array('pic', 'pct'),
+        'image/x-portable-anymap' => array('pnm'),
+        'image/x-portable-bitmap' => array('pbm'),
+        'image/x-portable-graymap' => array('pgm'),
+        'image/x-portable-pixmap' => array('ppm'),
+        'image/x-rgb' => array('rgb'),
+        'image/x-tga' => array('tga'),
+        'image/x-xbitmap' => array('xbm'),
+        'image/x-xpixmap' => array('xpm'),
+        'image/x-xwindowdump' => array('xwd'),
+        'message/rfc822' => array('eml', 'mime'),
+        'model/iges' => array('igs', 'iges'),
+        'model/mesh' => array('msh', 'mesh', 'silo'),
+        'model/vnd.collada+xml' => array('dae'),
+        'model/vnd.dwf' => array('dwf'),
+        'model/vnd.gdl' => array('gdl'),
+        'model/vnd.gtw' => array('gtw'),
+        'model/vnd.mts' => array('mts'),
+        'model/vnd.vtu' => array('vtu'),
+        'model/vrml' => array('wrl', 'vrml'),
+        'model/x3d+binary' => array('x3db', 'x3dbz'),
+        'model/x3d+vrml' => array('x3dv', 'x3dvz'),
+        'model/x3d+xml' => array('x3d', 'x3dz'),
+        'text/cache-manifest' => array('appcache'),
+        'text/calendar' => array('ics', 'ifb'),
+        'text/css' => array('css'),
+        'text/csv' => array('csv'),
+        'text/html' => array('html', 'htm'),
+        'text/n3' => array('n3'),
+        'text/plain' => array('txt', 'text', 'conf', 'def', 'list', 'log', 'in'),
+        'text/prs.lines.tag' => array('dsc'),
+        'text/richtext' => array('rtx'),
+        'text/sgml' => array('sgml', 'sgm'),
+        'text/tab-separated-values' => array('tsv'),
+        'text/troff' => array('t', 'tr', 'roff', 'man', 'me', 'ms'),
+        'text/turtle' => array('ttl'),
+        'text/uri-list' => array('uri', 'uris', 'urls'),
+        'text/vcard' => array('vcard'),
+        'text/vnd.curl' => array('curl'),
+        'text/vnd.curl.dcurl' => array('dcurl'),
+        'text/vnd.curl.scurl' => array('scurl'),
+        'text/vnd.curl.mcurl' => array('mcurl'),
+        'text/vnd.dvb.subtitle' => array('sub'),
+        'text/vnd.fly' => array('fly'),
+        'text/vnd.fmi.flexstor' => array('flx'),
+        'text/vnd.graphviz' => array('gv'),
+        'text/vnd.in3d.3dml' => array('3dml'),
+        'text/vnd.in3d.spot' => array('spot'),
+        'text/vnd.sun.j2me.app-descriptor' => array('jad'),
+        'text/vnd.wap.wml' => array('wml'),
+        'text/vnd.wap.wmlscript' => array('wmls'),
+        'text/x-asm' => array('s', 'asm'),
+        'text/x-c' => array('c', 'cc', 'cxx', 'cpp', 'h', 'hh', 'dic'),
+        'text/x-fortran' => array('f', 'for', 'f77', 'f90'),
+        'text/x-java-source' => array('java'),
+        'text/x-opml' => array('opml'),
+        'text/x-pascal' => array('p', 'pas'),
+        'text/x-nfo' => array('nfo'),
+        'text/x-setext' => array('etx'),
+        'text/x-sfv' => array('sfv'),
+        'text/x-uuencode' => array('uu'),
+        'text/x-vcalendar' => array('vcs'),
+        'text/x-vcard' => array('vcf'),
+        'video/3gpp' => array('3gp'),
+        'video/3gpp2' => array('3g2'),
+        'video/h261' => array('h261'),
+        'video/h263' => array('h263'),
+        'video/h264' => array('h264'),
+        'video/jpeg' => array('jpgv'),
+        'video/jpm' => array('jpm', 'jpgm'),
+        'video/mj2' => array('mj2', 'mjp2'),
+        'video/mp4' => array('mp4', 'mp4v', 'mpg4'),
+        'video/mpeg' => array('mpeg', 'mpg', 'mpe', 'm1v', 'm2v'),
+        'video/ogg' => array('ogv'),
+        'video/quicktime' => array('qt', 'mov'),
+        'video/vnd.dece.hd' => array('uvh', 'uvvh'),
+        'video/vnd.dece.mobile' => array('uvm', 'uvvm'),
+        'video/vnd.dece.pd' => array('uvp', 'uvvp'),
+        'video/vnd.dece.sd' => array('uvs', 'uvvs'),
+        'video/vnd.dece.video' => array('uvv', 'uvvv'),
+        'video/vnd.dvb.file' => array('dvb'),
+        'video/vnd.fvt' => array('fvt'),
+        'video/vnd.mpegurl' => array('mxu', 'm4u'),
+        'video/vnd.ms-playready.media.pyv' => array('pyv'),
+        'video/vnd.uvvu.mp4' => array('uvu', 'uvvu'),
+        'video/vnd.vivo' => array('viv'),
+        'video/webm' => array('webm'),
+        'video/x-f4v' => array('f4v'),
+        'video/x-fli' => array('fli'),
+        'video/x-flv' => array('flv'),
+        'video/x-m4v' => array('m4v'),
+        'video/x-matroska' => array('mkv', 'mk3d', 'mks'),
+        'video/x-mng' => array('mng'),
+        'video/x-ms-asf' => array('asf', 'asx'),
+        'video/x-ms-vob' => array('vob'),
+        'video/x-ms-wm' => array('wm'),
+        'video/x-ms-wmv' => array('wmv'),
+        'video/x-ms-wmx' => array('wmx'),
+        'video/x-ms-wvx' => array('wvx'),
+        'video/x-msvideo' => array('avi'),
+        'video/x-sgi-movie' => array('movie'),
+        'video/x-smv' => array('smv'),
+        'x-conference/x-cooltalk' => array('ice'),
+    );
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpExtensionToType()
+    {
+        return $this->extensionToType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpTypeToExtensions()
+    {
+        return $this->typeToExtensions;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findExtensions($type)
+    {
+        if (isset($this->typeToExtensions[$type])) {
+            return $this->typeToExtensions[$type];
+        }
+
+        return array();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function findType($extension)
+    {
+        if (isset($this->extensionToType[$extension])) {
+            return $this->extensionToType[$extension];
+        }
+
+        return null;
+    }
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/RepositoryInterface.php b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/RepositoryInterface.php
new file mode 100644
index 0000000000..c26fff309e
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/RepositoryInterface.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is a part of dflydev/apache-mime-types.
+ *
+ * (c) Dragonfly Development Inc.
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Dflydev\ApacheMimeTypes;
+
+/**
+ * Repository
+ *
+ * @author Beau Simensen <beau@dflydev.com>
+ */
+interface RepositoryInterface
+{
+    /**
+     * Dump extension to type map
+     *
+     * @return array
+     */
+    public function dumpExtensionToType();
+
+    /**
+     * Dump type to extensions map
+     *
+     * @return array
+     */
+    public function dumpTypeToExtensions();
+
+    /**
+     * Find all extensions for a type
+     *
+     * @param string $type
+     *
+     * @return array
+     */
+    public function findExtensions($type);
+
+    /**
+     * Find a type for an extension
+     *
+     * @param string $extension
+     *
+     * @return string
+     */
+    public function findType($extension);
+}
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types
new file mode 100644
index 0000000000..b90b165876
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types
@@ -0,0 +1,1588 @@
+# This file maps Internet media types to unique file extension(s).
+# Although created for httpd, this file is used by many software systems
+# and has been placed in the public domain for unlimited redisribution.
+#
+# The table below contains both registered and (common) unregistered types.
+# A type that has no unique extension can be ignored -- they are listed
+# here to guide configurations toward known types and to make it easier to
+# identify "new" types.  File extensions are also commonly used to indicate
+# content languages and encodings, so choose them carefully.
+#
+# Internet media types should be registered as described in RFC 4288.
+# The registry is at <http://www.iana.org/assignments/media-types/>.
+#
+# MIME type (lowercased)			Extensions
+# ============================================	==========
+# application/1d-interleaved-parityfec
+# application/3gpp-ims+xml
+# application/activemessage
+application/andrew-inset			ez
+# application/applefile
+application/applixware				aw
+application/atom+xml				atom
+application/atomcat+xml				atomcat
+# application/atomicmail
+application/atomsvc+xml				atomsvc
+# application/auth-policy+xml
+# application/batch-smtp
+# application/beep+xml
+# application/calendar+xml
+# application/cals-1840
+# application/ccmp+xml
+application/ccxml+xml				ccxml
+application/cdmi-capability			cdmia
+application/cdmi-container			cdmic
+application/cdmi-domain				cdmid
+application/cdmi-object				cdmio
+application/cdmi-queue				cdmiq
+# application/cea-2018+xml
+# application/cellml+xml
+# application/cfw
+# application/cnrp+xml
+# application/commonground
+# application/conference-info+xml
+# application/cpl+xml
+# application/csta+xml
+# application/cstadata+xml
+application/cu-seeme				cu
+# application/cybercash
+application/davmount+xml			davmount
+# application/dca-rft
+# application/dec-dx
+# application/dialog-info+xml
+# application/dicom
+# application/dns
+application/docbook+xml				dbk
+# application/dskpp+xml
+application/dssc+der				dssc
+application/dssc+xml				xdssc
+# application/dvcs
+application/ecmascript				ecma
+# application/edi-consent
+# application/edi-x12
+# application/edifact
+application/emma+xml				emma
+# application/epp+xml
+application/epub+zip				epub
+# application/eshop
+# application/example
+application/exi					exi
+# application/fastinfoset
+# application/fastsoap
+# application/fits
+application/font-tdpfr				pfr
+# application/framework-attributes+xml
+application/gml+xml				gml
+application/gpx+xml				gpx
+application/gxf					gxf
+# application/h224
+# application/held+xml
+# application/http
+application/hyperstudio				stk
+# application/ibe-key-request+xml
+# application/ibe-pkg-reply+xml
+# application/ibe-pp-data
+# application/iges
+# application/im-iscomposing+xml
+# application/index
+# application/index.cmd
+# application/index.obj
+# application/index.response
+# application/index.vnd
+application/inkml+xml				ink inkml
+# application/iotp
+application/ipfix				ipfix
+# application/ipp
+# application/isup
+application/java-archive			jar
+application/java-serialized-object		ser
+application/java-vm				class
+application/javascript				js
+application/json				json
+application/jsonml+json				jsonml
+# application/kpml-request+xml
+# application/kpml-response+xml
+application/lost+xml				lostxml
+application/mac-binhex40			hqx
+application/mac-compactpro			cpt
+# application/macwriteii
+application/mads+xml				mads
+application/marc				mrc
+application/marcxml+xml				mrcx
+application/mathematica				ma nb mb
+# application/mathml-content+xml
+# application/mathml-presentation+xml
+application/mathml+xml				mathml
+# application/mbms-associated-procedure-description+xml
+# application/mbms-deregister+xml
+# application/mbms-envelope+xml
+# application/mbms-msk+xml
+# application/mbms-msk-response+xml
+# application/mbms-protection-description+xml
+# application/mbms-reception-report+xml
+# application/mbms-register+xml
+# application/mbms-register-response+xml
+# application/mbms-user-service-description+xml
+application/mbox				mbox
+# application/media_control+xml
+application/mediaservercontrol+xml		mscml
+application/metalink+xml			metalink
+application/metalink4+xml			meta4
+application/mets+xml				mets
+# application/mikey
+application/mods+xml				mods
+# application/moss-keys
+# application/moss-signature
+# application/mosskey-data
+# application/mosskey-request
+application/mp21				m21 mp21
+application/mp4					mp4s
+# application/mpeg4-generic
+# application/mpeg4-iod
+# application/mpeg4-iod-xmt
+# application/msc-ivr+xml
+# application/msc-mixer+xml
+application/msword				doc dot
+application/mxf					mxf
+# application/nasdata
+# application/news-checkgroups
+# application/news-groupinfo
+# application/news-transmission
+# application/nss
+# application/ocsp-request
+# application/ocsp-response
+application/octet-stream	bin dms lrf mar so dist distz pkg bpk dump elc deploy
+application/oda					oda
+application/oebps-package+xml			opf
+application/ogg					ogx
+application/omdoc+xml				omdoc
+application/onenote				onetoc onetoc2 onetmp onepkg
+application/oxps				oxps
+# application/parityfec
+application/patch-ops-error+xml			xer
+application/pdf					pdf
+application/pgp-encrypted			pgp
+# application/pgp-keys
+application/pgp-signature			asc sig
+application/pics-rules				prf
+# application/pidf+xml
+# application/pidf-diff+xml
+application/pkcs10				p10
+application/pkcs7-mime				p7m p7c
+application/pkcs7-signature			p7s
+application/pkcs8				p8
+application/pkix-attr-cert			ac
+application/pkix-cert				cer
+application/pkix-crl				crl
+application/pkix-pkipath			pkipath
+application/pkixcmp				pki
+application/pls+xml				pls
+# application/poc-settings+xml
+application/postscript				ai eps ps
+# application/prs.alvestrand.titrax-sheet
+application/prs.cww				cww
+# application/prs.nprend
+# application/prs.plucker
+# application/prs.rdf-xml-crypt
+# application/prs.xsf+xml
+application/pskc+xml				pskcxml
+# application/qsig
+application/rdf+xml				rdf
+application/reginfo+xml				rif
+application/relax-ng-compact-syntax		rnc
+# application/remote-printing
+application/resource-lists+xml			rl
+application/resource-lists-diff+xml		rld
+# application/riscos
+# application/rlmi+xml
+application/rls-services+xml			rs
+application/rpki-ghostbusters			gbr
+application/rpki-manifest			mft
+application/rpki-roa				roa
+# application/rpki-updown
+application/rsd+xml				rsd
+application/rss+xml				rss
+application/rtf					rtf
+# application/rtx
+# application/samlassertion+xml
+# application/samlmetadata+xml
+application/sbml+xml				sbml
+application/scvp-cv-request			scq
+application/scvp-cv-response			scs
+application/scvp-vp-request			spq
+application/scvp-vp-response			spp
+application/sdp					sdp
+# application/set-payment
+application/set-payment-initiation		setpay
+# application/set-registration
+application/set-registration-initiation		setreg
+# application/sgml
+# application/sgml-open-catalog
+application/shf+xml				shf
+# application/sieve
+# application/simple-filter+xml
+# application/simple-message-summary
+# application/simplesymbolcontainer
+# application/slate
+# application/smil
+application/smil+xml				smi smil
+# application/soap+fastinfoset
+# application/soap+xml
+application/sparql-query			rq
+application/sparql-results+xml			srx
+# application/spirits-event+xml
+application/srgs				gram
+application/srgs+xml				grxml
+application/sru+xml				sru
+application/ssdl+xml				ssdl
+application/ssml+xml				ssml
+# application/tamp-apex-update
+# application/tamp-apex-update-confirm
+# application/tamp-community-update
+# application/tamp-community-update-confirm
+# application/tamp-error
+# application/tamp-sequence-adjust
+# application/tamp-sequence-adjust-confirm
+# application/tamp-status-query
+# application/tamp-status-response
+# application/tamp-update
+# application/tamp-update-confirm
+application/tei+xml				tei teicorpus
+application/thraud+xml				tfi
+# application/timestamp-query
+# application/timestamp-reply
+application/timestamped-data			tsd
+# application/tve-trigger
+# application/ulpfec
+# application/vcard+xml
+# application/vemmi
+# application/vividence.scriptfile
+# application/vnd.3gpp.bsf+xml
+application/vnd.3gpp.pic-bw-large		plb
+application/vnd.3gpp.pic-bw-small		psb
+application/vnd.3gpp.pic-bw-var			pvb
+# application/vnd.3gpp.sms
+# application/vnd.3gpp2.bcmcsinfo+xml
+# application/vnd.3gpp2.sms
+application/vnd.3gpp2.tcap			tcap
+application/vnd.3m.post-it-notes		pwn
+application/vnd.accpac.simply.aso		aso
+application/vnd.accpac.simply.imp		imp
+application/vnd.acucobol			acu
+application/vnd.acucorp				atc acutc
+application/vnd.adobe.air-application-installer-package+zip	air
+application/vnd.adobe.formscentral.fcdt		fcdt
+application/vnd.adobe.fxp			fxp fxpl
+# application/vnd.adobe.partial-upload
+application/vnd.adobe.xdp+xml			xdp
+application/vnd.adobe.xfdf			xfdf
+# application/vnd.aether.imp
+# application/vnd.ah-barcode
+application/vnd.ahead.space			ahead
+application/vnd.airzip.filesecure.azf		azf
+application/vnd.airzip.filesecure.azs		azs
+application/vnd.amazon.ebook			azw
+application/vnd.americandynamics.acc		acc
+application/vnd.amiga.ami			ami
+# application/vnd.amundsen.maze+xml
+application/vnd.android.package-archive		apk
+application/vnd.anser-web-certificate-issue-initiation	cii
+application/vnd.anser-web-funds-transfer-initiation	fti
+application/vnd.antix.game-component		atx
+application/vnd.apple.installer+xml		mpkg
+application/vnd.apple.mpegurl			m3u8
+# application/vnd.arastra.swi
+application/vnd.aristanetworks.swi		swi
+application/vnd.astraea-software.iota		iota
+application/vnd.audiograph			aep
+# application/vnd.autopackage
+# application/vnd.avistar+xml
+application/vnd.blueice.multipass		mpm
+# application/vnd.bluetooth.ep.oob
+application/vnd.bmi				bmi
+application/vnd.businessobjects			rep
+# application/vnd.cab-jscript
+# application/vnd.canon-cpdl
+# application/vnd.canon-lips
+# application/vnd.cendio.thinlinc.clientconf
+application/vnd.chemdraw+xml			cdxml
+application/vnd.chipnuts.karaoke-mmd		mmd
+application/vnd.cinderella			cdy
+# application/vnd.cirpack.isdn-ext
+application/vnd.claymore			cla
+application/vnd.cloanto.rp9			rp9
+application/vnd.clonk.c4group			c4g c4d c4f c4p c4u
+application/vnd.cluetrust.cartomobile-config		c11amc
+application/vnd.cluetrust.cartomobile-config-pkg	c11amz
+# application/vnd.collection+json
+# application/vnd.commerce-battelle
+application/vnd.commonspace			csp
+application/vnd.contact.cmsg			cdbcmsg
+application/vnd.cosmocaller			cmc
+application/vnd.crick.clicker			clkx
+application/vnd.crick.clicker.keyboard		clkk
+application/vnd.crick.clicker.palette		clkp
+application/vnd.crick.clicker.template		clkt
+application/vnd.crick.clicker.wordbank		clkw
+application/vnd.criticaltools.wbs+xml		wbs
+application/vnd.ctc-posml			pml
+# application/vnd.ctct.ws+xml
+# application/vnd.cups-pdf
+# application/vnd.cups-postscript
+application/vnd.cups-ppd			ppd
+# application/vnd.cups-raster
+# application/vnd.cups-raw
+# application/vnd.curl
+application/vnd.curl.car			car
+application/vnd.curl.pcurl			pcurl
+# application/vnd.cybank
+application/vnd.dart				dart
+application/vnd.data-vision.rdz			rdz
+application/vnd.dece.data			uvf uvvf uvd uvvd
+application/vnd.dece.ttml+xml			uvt uvvt
+application/vnd.dece.unspecified		uvx uvvx
+application/vnd.dece.zip			uvz uvvz
+application/vnd.denovo.fcselayout-link		fe_launch
+# application/vnd.dir-bi.plate-dl-nosuffix
+application/vnd.dna				dna
+application/vnd.dolby.mlp			mlp
+# application/vnd.dolby.mobile.1
+# application/vnd.dolby.mobile.2
+application/vnd.dpgraph				dpg
+application/vnd.dreamfactory			dfac
+application/vnd.ds-keypoint			kpxx
+application/vnd.dvb.ait				ait
+# application/vnd.dvb.dvbj
+# application/vnd.dvb.esgcontainer
+# application/vnd.dvb.ipdcdftnotifaccess
+# application/vnd.dvb.ipdcesgaccess
+# application/vnd.dvb.ipdcesgaccess2
+# application/vnd.dvb.ipdcesgpdd
+# application/vnd.dvb.ipdcroaming
+# application/vnd.dvb.iptv.alfec-base
+# application/vnd.dvb.iptv.alfec-enhancement
+# application/vnd.dvb.notif-aggregate-root+xml
+# application/vnd.dvb.notif-container+xml
+# application/vnd.dvb.notif-generic+xml
+# application/vnd.dvb.notif-ia-msglist+xml
+# application/vnd.dvb.notif-ia-registration-request+xml
+# application/vnd.dvb.notif-ia-registration-response+xml
+# application/vnd.dvb.notif-init+xml
+# application/vnd.dvb.pfr
+application/vnd.dvb.service			svc
+# application/vnd.dxr
+application/vnd.dynageo				geo
+# application/vnd.easykaraoke.cdgdownload
+# application/vnd.ecdis-update
+application/vnd.ecowin.chart			mag
+# application/vnd.ecowin.filerequest
+# application/vnd.ecowin.fileupdate
+# application/vnd.ecowin.series
+# application/vnd.ecowin.seriesrequest
+# application/vnd.ecowin.seriesupdate
+# application/vnd.emclient.accessrequest+xml
+application/vnd.enliven				nml
+# application/vnd.eprints.data+xml
+application/vnd.epson.esf			esf
+application/vnd.epson.msf			msf
+application/vnd.epson.quickanime		qam
+application/vnd.epson.salt			slt
+application/vnd.epson.ssf			ssf
+# application/vnd.ericsson.quickcall
+application/vnd.eszigno3+xml			es3 et3
+# application/vnd.etsi.aoc+xml
+# application/vnd.etsi.cug+xml
+# application/vnd.etsi.iptvcommand+xml
+# application/vnd.etsi.iptvdiscovery+xml
+# application/vnd.etsi.iptvprofile+xml
+# application/vnd.etsi.iptvsad-bc+xml
+# application/vnd.etsi.iptvsad-cod+xml
+# application/vnd.etsi.iptvsad-npvr+xml
+# application/vnd.etsi.iptvservice+xml
+# application/vnd.etsi.iptvsync+xml
+# application/vnd.etsi.iptvueprofile+xml
+# application/vnd.etsi.mcid+xml
+# application/vnd.etsi.overload-control-policy-dataset+xml
+# application/vnd.etsi.sci+xml
+# application/vnd.etsi.simservs+xml
+# application/vnd.etsi.tsl+xml
+# application/vnd.etsi.tsl.der
+# application/vnd.eudora.data
+application/vnd.ezpix-album			ez2
+application/vnd.ezpix-package			ez3
+# application/vnd.f-secure.mobile
+application/vnd.fdf				fdf
+application/vnd.fdsn.mseed			mseed
+application/vnd.fdsn.seed			seed dataless
+# application/vnd.ffsns
+# application/vnd.fints
+application/vnd.flographit			gph
+application/vnd.fluxtime.clip			ftc
+# application/vnd.font-fontforge-sfd
+application/vnd.framemaker			fm frame maker book
+application/vnd.frogans.fnc			fnc
+application/vnd.frogans.ltf			ltf
+application/vnd.fsc.weblaunch			fsc
+application/vnd.fujitsu.oasys			oas
+application/vnd.fujitsu.oasys2			oa2
+application/vnd.fujitsu.oasys3			oa3
+application/vnd.fujitsu.oasysgp			fg5
+application/vnd.fujitsu.oasysprs		bh2
+# application/vnd.fujixerox.art-ex
+# application/vnd.fujixerox.art4
+# application/vnd.fujixerox.hbpl
+application/vnd.fujixerox.ddd			ddd
+application/vnd.fujixerox.docuworks		xdw
+application/vnd.fujixerox.docuworks.binder	xbd
+# application/vnd.fut-misnet
+application/vnd.fuzzysheet			fzs
+application/vnd.genomatix.tuxedo		txd
+# application/vnd.geocube+xml
+application/vnd.geogebra.file			ggb
+application/vnd.geogebra.tool			ggt
+application/vnd.geometry-explorer		gex gre
+application/vnd.geonext				gxt
+application/vnd.geoplan				g2w
+application/vnd.geospace			g3w
+# application/vnd.globalplatform.card-content-mgt
+# application/vnd.globalplatform.card-content-mgt-response
+application/vnd.gmx				gmx
+application/vnd.google-earth.kml+xml		kml
+application/vnd.google-earth.kmz		kmz
+application/vnd.grafeq				gqf gqs
+# application/vnd.gridmp
+application/vnd.groove-account			gac
+application/vnd.groove-help			ghf
+application/vnd.groove-identity-message		gim
+application/vnd.groove-injector			grv
+application/vnd.groove-tool-message		gtm
+application/vnd.groove-tool-template		tpl
+application/vnd.groove-vcard			vcg
+# application/vnd.hal+json
+application/vnd.hal+xml				hal
+application/vnd.handheld-entertainment+xml	zmm
+application/vnd.hbci				hbci
+# application/vnd.hcl-bireports
+application/vnd.hhe.lesson-player		les
+application/vnd.hp-hpgl				hpgl
+application/vnd.hp-hpid				hpid
+application/vnd.hp-hps				hps
+application/vnd.hp-jlyt				jlt
+application/vnd.hp-pcl				pcl
+application/vnd.hp-pclxl			pclxl
+# application/vnd.httphone
+application/vnd.hydrostatix.sof-data		sfd-hdstx
+# application/vnd.hzn-3d-crossword
+# application/vnd.ibm.afplinedata
+# application/vnd.ibm.electronic-media
+application/vnd.ibm.minipay			mpy
+application/vnd.ibm.modcap			afp listafp list3820
+application/vnd.ibm.rights-management		irm
+application/vnd.ibm.secure-container		sc
+application/vnd.iccprofile			icc icm
+application/vnd.igloader			igl
+application/vnd.immervision-ivp			ivp
+application/vnd.immervision-ivu			ivu
+# application/vnd.informedcontrol.rms+xml
+# application/vnd.informix-visionary
+# application/vnd.infotech.project
+# application/vnd.infotech.project+xml
+# application/vnd.innopath.wamp.notification
+application/vnd.insors.igm			igm
+application/vnd.intercon.formnet		xpw xpx
+application/vnd.intergeo			i2g
+# application/vnd.intertrust.digibox
+# application/vnd.intertrust.nncp
+application/vnd.intu.qbo			qbo
+application/vnd.intu.qfx			qfx
+# application/vnd.iptc.g2.conceptitem+xml
+# application/vnd.iptc.g2.knowledgeitem+xml
+# application/vnd.iptc.g2.newsitem+xml
+# application/vnd.iptc.g2.newsmessage+xml
+# application/vnd.iptc.g2.packageitem+xml
+# application/vnd.iptc.g2.planningitem+xml
+application/vnd.ipunplugged.rcprofile		rcprofile
+application/vnd.irepository.package+xml		irp
+application/vnd.is-xpr				xpr
+application/vnd.isac.fcs			fcs
+application/vnd.jam				jam
+# application/vnd.japannet-directory-service
+# application/vnd.japannet-jpnstore-wakeup
+# application/vnd.japannet-payment-wakeup
+# application/vnd.japannet-registration
+# application/vnd.japannet-registration-wakeup
+# application/vnd.japannet-setstore-wakeup
+# application/vnd.japannet-verification
+# application/vnd.japannet-verification-wakeup
+application/vnd.jcp.javame.midlet-rms		rms
+application/vnd.jisp				jisp
+application/vnd.joost.joda-archive		joda
+application/vnd.kahootz				ktz ktr
+application/vnd.kde.karbon			karbon
+application/vnd.kde.kchart			chrt
+application/vnd.kde.kformula			kfo
+application/vnd.kde.kivio			flw
+application/vnd.kde.kontour			kon
+application/vnd.kde.kpresenter			kpr kpt
+application/vnd.kde.kspread			ksp
+application/vnd.kde.kword			kwd kwt
+application/vnd.kenameaapp			htke
+application/vnd.kidspiration			kia
+application/vnd.kinar				kne knp
+application/vnd.koan				skp skd skt skm
+application/vnd.kodak-descriptor		sse
+application/vnd.las.las+xml			lasxml
+# application/vnd.liberty-request+xml
+application/vnd.llamagraphics.life-balance.desktop	lbd
+application/vnd.llamagraphics.life-balance.exchange+xml	lbe
+application/vnd.lotus-1-2-3			123
+application/vnd.lotus-approach			apr
+application/vnd.lotus-freelance			pre
+application/vnd.lotus-notes			nsf
+application/vnd.lotus-organizer			org
+application/vnd.lotus-screencam			scm
+application/vnd.lotus-wordpro			lwp
+application/vnd.macports.portpkg		portpkg
+# application/vnd.marlin.drm.actiontoken+xml
+# application/vnd.marlin.drm.conftoken+xml
+# application/vnd.marlin.drm.license+xml
+# application/vnd.marlin.drm.mdcf
+application/vnd.mcd				mcd
+application/vnd.medcalcdata			mc1
+application/vnd.mediastation.cdkey		cdkey
+# application/vnd.meridian-slingshot
+application/vnd.mfer				mwf
+application/vnd.mfmp				mfm
+application/vnd.micrografx.flo			flo
+application/vnd.micrografx.igx			igx
+application/vnd.mif				mif
+# application/vnd.minisoft-hp3000-save
+# application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf			daf
+application/vnd.mobius.dis			dis
+application/vnd.mobius.mbk			mbk
+application/vnd.mobius.mqy			mqy
+application/vnd.mobius.msl			msl
+application/vnd.mobius.plc			plc
+application/vnd.mobius.txf			txf
+application/vnd.mophun.application		mpn
+application/vnd.mophun.certificate		mpc
+# application/vnd.motorola.flexsuite
+# application/vnd.motorola.flexsuite.adsi
+# application/vnd.motorola.flexsuite.fis
+# application/vnd.motorola.flexsuite.gotap
+# application/vnd.motorola.flexsuite.kmr
+# application/vnd.motorola.flexsuite.ttc
+# application/vnd.motorola.flexsuite.wem
+# application/vnd.motorola.iprm
+application/vnd.mozilla.xul+xml			xul
+application/vnd.ms-artgalry			cil
+# application/vnd.ms-asf
+application/vnd.ms-cab-compressed		cab
+# application/vnd.ms-color.iccprofile
+application/vnd.ms-excel			xls xlm xla xlc xlt xlw
+application/vnd.ms-excel.addin.macroenabled.12		xlam
+application/vnd.ms-excel.sheet.binary.macroenabled.12	xlsb
+application/vnd.ms-excel.sheet.macroenabled.12		xlsm
+application/vnd.ms-excel.template.macroenabled.12	xltm
+application/vnd.ms-fontobject			eot
+application/vnd.ms-htmlhelp			chm
+application/vnd.ms-ims				ims
+application/vnd.ms-lrm				lrm
+# application/vnd.ms-office.activex+xml
+application/vnd.ms-officetheme			thmx
+# application/vnd.ms-opentype
+# application/vnd.ms-package.obfuscated-opentype
+application/vnd.ms-pki.seccat			cat
+application/vnd.ms-pki.stl			stl
+# application/vnd.ms-playready.initiator+xml
+application/vnd.ms-powerpoint			ppt pps pot
+application/vnd.ms-powerpoint.addin.macroenabled.12		ppam
+application/vnd.ms-powerpoint.presentation.macroenabled.12	pptm
+application/vnd.ms-powerpoint.slide.macroenabled.12		sldm
+application/vnd.ms-powerpoint.slideshow.macroenabled.12		ppsm
+application/vnd.ms-powerpoint.template.macroenabled.12		potm
+# application/vnd.ms-printing.printticket+xml
+application/vnd.ms-project			mpp mpt
+# application/vnd.ms-tnef
+# application/vnd.ms-wmdrm.lic-chlg-req
+# application/vnd.ms-wmdrm.lic-resp
+# application/vnd.ms-wmdrm.meter-chlg-req
+# application/vnd.ms-wmdrm.meter-resp
+application/vnd.ms-word.document.macroenabled.12	docm
+application/vnd.ms-word.template.macroenabled.12	dotm
+application/vnd.ms-works			wps wks wcm wdb
+application/vnd.ms-wpl				wpl
+application/vnd.ms-xpsdocument			xps
+application/vnd.mseq				mseq
+# application/vnd.msign
+# application/vnd.multiad.creator
+# application/vnd.multiad.creator.cif
+# application/vnd.music-niff
+application/vnd.musician			mus
+application/vnd.muvee.style			msty
+application/vnd.mynfc				taglet
+# application/vnd.ncd.control
+# application/vnd.ncd.reference
+# application/vnd.nervana
+# application/vnd.netfpx
+application/vnd.neurolanguage.nlu		nlu
+application/vnd.nitf				ntf nitf
+application/vnd.noblenet-directory		nnd
+application/vnd.noblenet-sealer			nns
+application/vnd.noblenet-web			nnw
+# application/vnd.nokia.catalogs
+# application/vnd.nokia.conml+wbxml
+# application/vnd.nokia.conml+xml
+# application/vnd.nokia.isds-radio-presets
+# application/vnd.nokia.iptv.config+xml
+# application/vnd.nokia.landmark+wbxml
+# application/vnd.nokia.landmark+xml
+# application/vnd.nokia.landmarkcollection+xml
+# application/vnd.nokia.n-gage.ac+xml
+application/vnd.nokia.n-gage.data		ngdat
+application/vnd.nokia.n-gage.symbian.install	n-gage
+# application/vnd.nokia.ncd
+# application/vnd.nokia.pcd+wbxml
+# application/vnd.nokia.pcd+xml
+application/vnd.nokia.radio-preset		rpst
+application/vnd.nokia.radio-presets		rpss
+application/vnd.novadigm.edm			edm
+application/vnd.novadigm.edx			edx
+application/vnd.novadigm.ext			ext
+# application/vnd.ntt-local.file-transfer
+# application/vnd.ntt-local.sip-ta_remote
+# application/vnd.ntt-local.sip-ta_tcp_stream
+application/vnd.oasis.opendocument.chart		odc
+application/vnd.oasis.opendocument.chart-template	otc
+application/vnd.oasis.opendocument.database		odb
+application/vnd.oasis.opendocument.formula		odf
+application/vnd.oasis.opendocument.formula-template	odft
+application/vnd.oasis.opendocument.graphics		odg
+application/vnd.oasis.opendocument.graphics-template	otg
+application/vnd.oasis.opendocument.image		odi
+application/vnd.oasis.opendocument.image-template	oti
+application/vnd.oasis.opendocument.presentation		odp
+application/vnd.oasis.opendocument.presentation-template	otp
+application/vnd.oasis.opendocument.spreadsheet		ods
+application/vnd.oasis.opendocument.spreadsheet-template	ots
+application/vnd.oasis.opendocument.text			odt
+application/vnd.oasis.opendocument.text-master		odm
+application/vnd.oasis.opendocument.text-template	ott
+application/vnd.oasis.opendocument.text-web		oth
+# application/vnd.obn
+# application/vnd.oftn.l10n+json
+# application/vnd.oipf.contentaccessdownload+xml
+# application/vnd.oipf.contentaccessstreaming+xml
+# application/vnd.oipf.cspg-hexbinary
+# application/vnd.oipf.dae.svg+xml
+# application/vnd.oipf.dae.xhtml+xml
+# application/vnd.oipf.mippvcontrolmessage+xml
+# application/vnd.oipf.pae.gem
+# application/vnd.oipf.spdiscovery+xml
+# application/vnd.oipf.spdlist+xml
+# application/vnd.oipf.ueprofile+xml
+# application/vnd.oipf.userprofile+xml
+application/vnd.olpc-sugar			xo
+# application/vnd.oma-scws-config
+# application/vnd.oma-scws-http-request
+# application/vnd.oma-scws-http-response
+# application/vnd.oma.bcast.associated-procedure-parameter+xml
+# application/vnd.oma.bcast.drm-trigger+xml
+# application/vnd.oma.bcast.imd+xml
+# application/vnd.oma.bcast.ltkm
+# application/vnd.oma.bcast.notification+xml
+# application/vnd.oma.bcast.provisioningtrigger
+# application/vnd.oma.bcast.sgboot
+# application/vnd.oma.bcast.sgdd+xml
+# application/vnd.oma.bcast.sgdu
+# application/vnd.oma.bcast.simple-symbol-container
+# application/vnd.oma.bcast.smartcard-trigger+xml
+# application/vnd.oma.bcast.sprov+xml
+# application/vnd.oma.bcast.stkm
+# application/vnd.oma.cab-address-book+xml
+# application/vnd.oma.cab-feature-handler+xml
+# application/vnd.oma.cab-pcc+xml
+# application/vnd.oma.cab-user-prefs+xml
+# application/vnd.oma.dcd
+# application/vnd.oma.dcdc
+application/vnd.oma.dd2+xml			dd2
+# application/vnd.oma.drm.risd+xml
+# application/vnd.oma.group-usage-list+xml
+# application/vnd.oma.pal+xml
+# application/vnd.oma.poc.detailed-progress-report+xml
+# application/vnd.oma.poc.final-report+xml
+# application/vnd.oma.poc.groups+xml
+# application/vnd.oma.poc.invocation-descriptor+xml
+# application/vnd.oma.poc.optimized-progress-report+xml
+# application/vnd.oma.push
+# application/vnd.oma.scidm.messages+xml
+# application/vnd.oma.xcap-directory+xml
+# application/vnd.omads-email+xml
+# application/vnd.omads-file+xml
+# application/vnd.omads-folder+xml
+# application/vnd.omaloc-supl-init
+application/vnd.openofficeorg.extension		oxt
+# application/vnd.openxmlformats-officedocument.custom-properties+xml
+# application/vnd.openxmlformats-officedocument.customxmlproperties+xml
+# application/vnd.openxmlformats-officedocument.drawing+xml
+# application/vnd.openxmlformats-officedocument.drawingml.chart+xml
+# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml
+# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml
+# application/vnd.openxmlformats-officedocument.extended-properties+xml
+# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml
+# application/vnd.openxmlformats-officedocument.presentationml.comments+xml
+# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml
+# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml
+# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml
+application/vnd.openxmlformats-officedocument.presentationml.presentation	pptx
+# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml
+application/vnd.openxmlformats-officedocument.presentationml.slide	sldx
+# application/vnd.openxmlformats-officedocument.presentationml.slide+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml
+application/vnd.openxmlformats-officedocument.presentationml.slideshow	ppsx
+# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml
+# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml
+# application/vnd.openxmlformats-officedocument.presentationml.tags+xml
+application/vnd.openxmlformats-officedocument.presentationml.template	potx
+# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml
+# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet	xlsx
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml
+application/vnd.openxmlformats-officedocument.spreadsheetml.template	xltx
+# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml
+# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml
+# application/vnd.openxmlformats-officedocument.theme+xml
+# application/vnd.openxmlformats-officedocument.themeoverride+xml
+# application/vnd.openxmlformats-officedocument.vmldrawing
+# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml
+application/vnd.openxmlformats-officedocument.wordprocessingml.document	docx
+# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml
+application/vnd.openxmlformats-officedocument.wordprocessingml.template	dotx
+# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml
+# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml
+# application/vnd.openxmlformats-package.core-properties+xml
+# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml
+# application/vnd.openxmlformats-package.relationships+xml
+# application/vnd.quobject-quoxdocument
+# application/vnd.osa.netdeploy
+application/vnd.osgeo.mapguide.package		mgp
+# application/vnd.osgi.bundle
+application/vnd.osgi.dp				dp
+application/vnd.osgi.subsystem			esa
+# application/vnd.otps.ct-kip+xml
+application/vnd.palm				pdb pqa oprc
+# application/vnd.paos.xml
+application/vnd.pawaafile			paw
+application/vnd.pg.format			str
+application/vnd.pg.osasli			ei6
+# application/vnd.piaccess.application-licence
+application/vnd.picsel				efif
+application/vnd.pmi.widget			wg
+# application/vnd.poc.group-advertisement+xml
+application/vnd.pocketlearn			plf
+application/vnd.powerbuilder6			pbd
+# application/vnd.powerbuilder6-s
+# application/vnd.powerbuilder7
+# application/vnd.powerbuilder7-s
+# application/vnd.powerbuilder75
+# application/vnd.powerbuilder75-s
+# application/vnd.preminet
+application/vnd.previewsystems.box		box
+application/vnd.proteus.magazine		mgz
+application/vnd.publishare-delta-tree		qps
+application/vnd.pvi.ptid1			ptid
+# application/vnd.pwg-multiplexed
+# application/vnd.pwg-xhtml-print+xml
+# application/vnd.qualcomm.brew-app-res
+application/vnd.quark.quarkxpress		qxd qxt qwd qwt qxl qxb
+# application/vnd.radisys.moml+xml
+# application/vnd.radisys.msml+xml
+# application/vnd.radisys.msml-audit+xml
+# application/vnd.radisys.msml-audit-conf+xml
+# application/vnd.radisys.msml-audit-conn+xml
+# application/vnd.radisys.msml-audit-dialog+xml
+# application/vnd.radisys.msml-audit-stream+xml
+# application/vnd.radisys.msml-conf+xml
+# application/vnd.radisys.msml-dialog+xml
+# application/vnd.radisys.msml-dialog-base+xml
+# application/vnd.radisys.msml-dialog-fax-detect+xml
+# application/vnd.radisys.msml-dialog-fax-sendrecv+xml
+# application/vnd.radisys.msml-dialog-group+xml
+# application/vnd.radisys.msml-dialog-speech+xml
+# application/vnd.radisys.msml-dialog-transform+xml
+# application/vnd.rainstor.data
+# application/vnd.rapid
+application/vnd.realvnc.bed			bed
+application/vnd.recordare.musicxml		mxl
+application/vnd.recordare.musicxml+xml		musicxml
+# application/vnd.renlearn.rlprint
+application/vnd.rig.cryptonote			cryptonote
+application/vnd.rim.cod				cod
+application/vnd.rn-realmedia			rm
+application/vnd.rn-realmedia-vbr		rmvb
+application/vnd.route66.link66+xml		link66
+# application/vnd.rs-274x
+# application/vnd.ruckus.download
+# application/vnd.s3sms
+application/vnd.sailingtracker.track		st
+# application/vnd.sbm.cid
+# application/vnd.sbm.mid2
+# application/vnd.scribus
+# application/vnd.sealed.3df
+# application/vnd.sealed.csf
+# application/vnd.sealed.doc
+# application/vnd.sealed.eml
+# application/vnd.sealed.mht
+# application/vnd.sealed.net
+# application/vnd.sealed.ppt
+# application/vnd.sealed.tiff
+# application/vnd.sealed.xls
+# application/vnd.sealedmedia.softseal.html
+# application/vnd.sealedmedia.softseal.pdf
+application/vnd.seemail				see
+application/vnd.sema				sema
+application/vnd.semd				semd
+application/vnd.semf				semf
+application/vnd.shana.informed.formdata		ifm
+application/vnd.shana.informed.formtemplate	itp
+application/vnd.shana.informed.interchange	iif
+application/vnd.shana.informed.package		ipk
+application/vnd.simtech-mindmapper		twd twds
+application/vnd.smaf				mmf
+# application/vnd.smart.notebook
+application/vnd.smart.teacher			teacher
+# application/vnd.software602.filler.form+xml
+# application/vnd.software602.filler.form-xml-zip
+application/vnd.solent.sdkm+xml			sdkm sdkd
+application/vnd.spotfire.dxp			dxp
+application/vnd.spotfire.sfs			sfs
+# application/vnd.sss-cod
+# application/vnd.sss-dtf
+# application/vnd.sss-ntf
+application/vnd.stardivision.calc		sdc
+application/vnd.stardivision.draw		sda
+application/vnd.stardivision.impress		sdd
+application/vnd.stardivision.math		smf
+application/vnd.stardivision.writer		sdw vor
+application/vnd.stardivision.writer-global	sgl
+application/vnd.stepmania.package		smzip
+application/vnd.stepmania.stepchart		sm
+# application/vnd.street-stream
+application/vnd.sun.xml.calc			sxc
+application/vnd.sun.xml.calc.template		stc
+application/vnd.sun.xml.draw			sxd
+application/vnd.sun.xml.draw.template		std
+application/vnd.sun.xml.impress			sxi
+application/vnd.sun.xml.impress.template	sti
+application/vnd.sun.xml.math			sxm
+application/vnd.sun.xml.writer			sxw
+application/vnd.sun.xml.writer.global		sxg
+application/vnd.sun.xml.writer.template		stw
+# application/vnd.sun.wadl+xml
+application/vnd.sus-calendar			sus susp
+application/vnd.svd				svd
+# application/vnd.swiftview-ics
+application/vnd.symbian.install			sis sisx
+application/vnd.syncml+xml			xsm
+application/vnd.syncml.dm+wbxml			bdm
+application/vnd.syncml.dm+xml			xdm
+# application/vnd.syncml.dm.notification
+# application/vnd.syncml.ds.notification
+application/vnd.tao.intent-module-archive	tao
+application/vnd.tcpdump.pcap			pcap cap dmp
+application/vnd.tmobile-livetv			tmo
+application/vnd.trid.tpt			tpt
+application/vnd.triscape.mxs			mxs
+application/vnd.trueapp				tra
+# application/vnd.truedoc
+# application/vnd.ubisoft.webplayer
+application/vnd.ufdl				ufd ufdl
+application/vnd.uiq.theme			utz
+application/vnd.umajin				umj
+application/vnd.unity				unityweb
+application/vnd.uoml+xml			uoml
+# application/vnd.uplanet.alert
+# application/vnd.uplanet.alert-wbxml
+# application/vnd.uplanet.bearer-choice
+# application/vnd.uplanet.bearer-choice-wbxml
+# application/vnd.uplanet.cacheop
+# application/vnd.uplanet.cacheop-wbxml
+# application/vnd.uplanet.channel
+# application/vnd.uplanet.channel-wbxml
+# application/vnd.uplanet.list
+# application/vnd.uplanet.list-wbxml
+# application/vnd.uplanet.listcmd
+# application/vnd.uplanet.listcmd-wbxml
+# application/vnd.uplanet.signal
+application/vnd.vcx				vcx
+# application/vnd.vd-study
+# application/vnd.vectorworks
+# application/vnd.verimatrix.vcas
+# application/vnd.vidsoft.vidconference
+application/vnd.visio				vsd vst vss vsw
+application/vnd.visionary			vis
+# application/vnd.vividence.scriptfile
+application/vnd.vsf				vsf
+# application/vnd.wap.sic
+# application/vnd.wap.slc
+application/vnd.wap.wbxml			wbxml
+application/vnd.wap.wmlc			wmlc
+application/vnd.wap.wmlscriptc			wmlsc
+application/vnd.webturbo			wtb
+# application/vnd.wfa.wsc
+# application/vnd.wmc
+# application/vnd.wmf.bootstrap
+# application/vnd.wolfram.mathematica
+# application/vnd.wolfram.mathematica.package
+application/vnd.wolfram.player			nbp
+application/vnd.wordperfect			wpd
+application/vnd.wqd				wqd
+# application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf				stf
+# application/vnd.wv.csp+wbxml
+# application/vnd.wv.csp+xml
+# application/vnd.wv.ssp+xml
+application/vnd.xara				xar
+application/vnd.xfdl				xfdl
+# application/vnd.xfdl.webform
+# application/vnd.xmi+xml
+# application/vnd.xmpie.cpkg
+# application/vnd.xmpie.dpkg
+# application/vnd.xmpie.plan
+# application/vnd.xmpie.ppkg
+# application/vnd.xmpie.xlim
+application/vnd.yamaha.hv-dic			hvd
+application/vnd.yamaha.hv-script		hvs
+application/vnd.yamaha.hv-voice			hvp
+application/vnd.yamaha.openscoreformat			osf
+application/vnd.yamaha.openscoreformat.osfpvg+xml	osfpvg
+# application/vnd.yamaha.remote-setup
+application/vnd.yamaha.smaf-audio		saf
+application/vnd.yamaha.smaf-phrase		spf
+# application/vnd.yamaha.through-ngn
+# application/vnd.yamaha.tunnel-udpencap
+application/vnd.yellowriver-custom-menu		cmp
+application/vnd.zul				zir zirz
+application/vnd.zzazz.deck+xml			zaz
+application/voicexml+xml			vxml
+# application/vq-rtcpxr
+# application/watcherinfo+xml
+# application/whoispp-query
+# application/whoispp-response
+application/widget				wgt
+application/winhlp				hlp
+# application/wita
+# application/wordperfect5.1
+application/wsdl+xml				wsdl
+application/wspolicy+xml			wspolicy
+application/x-7z-compressed			7z
+application/x-abiword				abw
+application/x-ace-compressed			ace
+# application/x-amf
+application/x-apple-diskimage			dmg
+application/x-authorware-bin			aab x32 u32 vox
+application/x-authorware-map			aam
+application/x-authorware-seg			aas
+application/x-bcpio				bcpio
+application/x-bittorrent			torrent
+application/x-blorb				blb blorb
+application/x-bzip				bz
+application/x-bzip2				bz2 boz
+application/x-cbr				cbr cba cbt cbz cb7
+application/x-cdlink				vcd
+application/x-cfs-compressed			cfs
+application/x-chat				chat
+application/x-chess-pgn				pgn
+application/x-conference			nsc
+# application/x-compress
+application/x-cpio				cpio
+application/x-csh				csh
+application/x-debian-package			deb udeb
+application/x-dgc-compressed			dgc
+application/x-director			dir dcr dxr cst cct cxt w3d fgd swa
+application/x-doom				wad
+application/x-dtbncx+xml			ncx
+application/x-dtbook+xml			dtb
+application/x-dtbresource+xml			res
+application/x-dvi				dvi
+application/x-envoy				evy
+application/x-eva				eva
+application/x-font-bdf				bdf
+# application/x-font-dos
+# application/x-font-framemaker
+application/x-font-ghostscript			gsf
+# application/x-font-libgrx
+application/x-font-linux-psf			psf
+application/x-font-otf				otf
+application/x-font-pcf				pcf
+application/x-font-snf				snf
+# application/x-font-speedo
+# application/x-font-sunos-news
+application/x-font-ttf				ttf ttc
+application/x-font-type1			pfa pfb pfm afm
+application/x-font-woff				woff
+# application/x-font-vfont
+application/x-freearc				arc
+application/x-futuresplash			spl
+application/x-gca-compressed			gca
+application/x-glulx				ulx
+application/x-gnumeric				gnumeric
+application/x-gramps-xml			gramps
+application/x-gtar				gtar
+# application/x-gzip
+application/x-hdf				hdf
+application/x-install-instructions		install
+application/x-iso9660-image			iso
+application/x-java-jnlp-file			jnlp
+application/x-latex				latex
+application/x-lzh-compressed			lzh lha
+application/x-mie				mie
+application/x-mobipocket-ebook			prc mobi
+application/x-ms-application			application
+application/x-ms-shortcut			lnk
+application/x-ms-wmd				wmd
+application/x-ms-wmz				wmz
+application/x-ms-xbap				xbap
+application/x-msaccess				mdb
+application/x-msbinder				obd
+application/x-mscardfile			crd
+application/x-msclip				clp
+application/x-msdownload			exe dll com bat msi
+application/x-msmediaview			mvb m13 m14
+application/x-msmetafile			wmf wmz emf emz
+application/x-msmoney				mny
+application/x-mspublisher			pub
+application/x-msschedule			scd
+application/x-msterminal			trm
+application/x-mswrite				wri
+application/x-netcdf				nc cdf
+application/x-nzb				nzb
+application/x-pkcs12				p12 pfx
+application/x-pkcs7-certificates		p7b spc
+application/x-pkcs7-certreqresp			p7r
+application/x-rar-compressed			rar
+application/x-research-info-systems		ris
+application/x-sh				sh
+application/x-shar				shar
+application/x-shockwave-flash			swf
+application/x-silverlight-app			xap
+application/x-sql				sql
+application/x-stuffit				sit
+application/x-stuffitx				sitx
+application/x-subrip				srt
+application/x-sv4cpio				sv4cpio
+application/x-sv4crc				sv4crc
+application/x-t3vm-image			t3
+application/x-tads				gam
+application/x-tar				tar
+application/x-tcl				tcl
+application/x-tex				tex
+application/x-tex-tfm				tfm
+application/x-texinfo				texinfo texi
+application/x-tgif				obj
+application/x-ustar				ustar
+application/x-wais-source			src
+application/x-x509-ca-cert			der crt
+application/x-xfig				fig
+application/x-xliff+xml				xlf
+application/x-xpinstall				xpi
+application/x-xz				xz
+application/x-zmachine				z1 z2 z3 z4 z5 z6 z7 z8
+# application/x400-bp
+application/xaml+xml				xaml
+# application/xcap-att+xml
+# application/xcap-caps+xml
+application/xcap-diff+xml			xdf
+# application/xcap-el+xml
+# application/xcap-error+xml
+# application/xcap-ns+xml
+# application/xcon-conference-info-diff+xml
+# application/xcon-conference-info+xml
+application/xenc+xml				xenc
+application/xhtml+xml				xhtml xht
+# application/xhtml-voice+xml
+application/xml					xml xsl
+application/xml-dtd				dtd
+# application/xml-external-parsed-entity
+# application/xmpp+xml
+application/xop+xml				xop
+application/xproc+xml				xpl
+application/xslt+xml				xslt
+application/xspf+xml				xspf
+application/xv+xml				mxml xhvml xvml xvm
+application/yang				yang
+application/yin+xml				yin
+application/zip					zip
+# audio/1d-interleaved-parityfec
+# audio/32kadpcm
+# audio/3gpp
+# audio/3gpp2
+# audio/ac3
+audio/adpcm					adp
+# audio/amr
+# audio/amr-wb
+# audio/amr-wb+
+# audio/asc
+# audio/atrac-advanced-lossless
+# audio/atrac-x
+# audio/atrac3
+audio/basic					au snd
+# audio/bv16
+# audio/bv32
+# audio/clearmode
+# audio/cn
+# audio/dat12
+# audio/dls
+# audio/dsr-es201108
+# audio/dsr-es202050
+# audio/dsr-es202211
+# audio/dsr-es202212
+# audio/dv
+# audio/dvi4
+# audio/eac3
+# audio/evrc
+# audio/evrc-qcp
+# audio/evrc0
+# audio/evrc1
+# audio/evrcb
+# audio/evrcb0
+# audio/evrcb1
+# audio/evrcwb
+# audio/evrcwb0
+# audio/evrcwb1
+# audio/example
+# audio/fwdred
+# audio/g719
+# audio/g722
+# audio/g7221
+# audio/g723
+# audio/g726-16
+# audio/g726-24
+# audio/g726-32
+# audio/g726-40
+# audio/g728
+# audio/g729
+# audio/g7291
+# audio/g729d
+# audio/g729e
+# audio/gsm
+# audio/gsm-efr
+# audio/gsm-hr-08
+# audio/ilbc
+# audio/ip-mr_v2.5
+# audio/isac
+# audio/l16
+# audio/l20
+# audio/l24
+# audio/l8
+# audio/lpc
+audio/midi					mid midi kar rmi
+# audio/mobile-xmf
+audio/mp4					mp4a
+# audio/mp4a-latm
+# audio/mpa
+# audio/mpa-robust
+audio/mpeg					mpga mp2 mp2a mp3 m2a m3a
+# audio/mpeg4-generic
+# audio/musepack
+audio/ogg					oga ogg spx
+# audio/opus
+# audio/parityfec
+# audio/pcma
+# audio/pcma-wb
+# audio/pcmu-wb
+# audio/pcmu
+# audio/prs.sid
+# audio/qcelp
+# audio/red
+# audio/rtp-enc-aescm128
+# audio/rtp-midi
+# audio/rtx
+audio/s3m					s3m
+audio/silk					sil
+# audio/smv
+# audio/smv0
+# audio/smv-qcp
+# audio/sp-midi
+# audio/speex
+# audio/t140c
+# audio/t38
+# audio/telephone-event
+# audio/tone
+# audio/uemclip
+# audio/ulpfec
+# audio/vdvi
+# audio/vmr-wb
+# audio/vnd.3gpp.iufp
+# audio/vnd.4sb
+# audio/vnd.audiokoz
+# audio/vnd.celp
+# audio/vnd.cisco.nse
+# audio/vnd.cmles.radio-events
+# audio/vnd.cns.anp1
+# audio/vnd.cns.inf1
+audio/vnd.dece.audio				uva uvva
+audio/vnd.digital-winds				eol
+# audio/vnd.dlna.adts
+# audio/vnd.dolby.heaac.1
+# audio/vnd.dolby.heaac.2
+# audio/vnd.dolby.mlp
+# audio/vnd.dolby.mps
+# audio/vnd.dolby.pl2
+# audio/vnd.dolby.pl2x
+# audio/vnd.dolby.pl2z
+# audio/vnd.dolby.pulse.1
+audio/vnd.dra					dra
+audio/vnd.dts					dts
+audio/vnd.dts.hd				dtshd
+# audio/vnd.dvb.file
+# audio/vnd.everad.plj
+# audio/vnd.hns.audio
+audio/vnd.lucent.voice				lvp
+audio/vnd.ms-playready.media.pya		pya
+# audio/vnd.nokia.mobile-xmf
+# audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800			ecelp4800
+audio/vnd.nuera.ecelp7470			ecelp7470
+audio/vnd.nuera.ecelp9600			ecelp9600
+# audio/vnd.octel.sbc
+# audio/vnd.qcelp
+# audio/vnd.rhetorex.32kadpcm
+audio/vnd.rip					rip
+# audio/vnd.sealedmedia.softseal.mpeg
+# audio/vnd.vmx.cvsd
+# audio/vorbis
+# audio/vorbis-config
+audio/webm					weba
+audio/x-aac					aac
+audio/x-aiff					aif aiff aifc
+audio/x-caf					caf
+audio/x-flac					flac
+audio/x-matroska				mka
+audio/x-mpegurl					m3u
+audio/x-ms-wax					wax
+audio/x-ms-wma					wma
+audio/x-pn-realaudio				ram ra
+audio/x-pn-realaudio-plugin			rmp
+# audio/x-tta
+audio/x-wav					wav
+audio/xm					xm
+chemical/x-cdx					cdx
+chemical/x-cif					cif
+chemical/x-cmdf					cmdf
+chemical/x-cml					cml
+chemical/x-csml					csml
+# chemical/x-pdb
+chemical/x-xyz					xyz
+image/bmp					bmp
+image/cgm					cgm
+# image/example
+# image/fits
+image/g3fax					g3
+image/gif					gif
+image/ief					ief
+# image/jp2
+image/jpeg					jpeg jpg jpe
+# image/jpm
+# image/jpx
+image/ktx					ktx
+# image/naplps
+image/png					png
+image/prs.btif					btif
+# image/prs.pti
+image/sgi					sgi
+image/svg+xml					svg svgz
+# image/t38
+image/tiff					tiff tif
+# image/tiff-fx
+image/vnd.adobe.photoshop			psd
+# image/vnd.cns.inf2
+image/vnd.dece.graphic				uvi uvvi uvg uvvg
+image/vnd.dvb.subtitle				sub
+image/vnd.djvu					djvu djv
+image/vnd.dwg					dwg
+image/vnd.dxf					dxf
+image/vnd.fastbidsheet				fbs
+image/vnd.fpx					fpx
+image/vnd.fst					fst
+image/vnd.fujixerox.edmics-mmr			mmr
+image/vnd.fujixerox.edmics-rlc			rlc
+# image/vnd.globalgraphics.pgb
+# image/vnd.microsoft.icon
+# image/vnd.mix
+image/vnd.ms-modi				mdi
+image/vnd.ms-photo				wdp
+image/vnd.net-fpx				npx
+# image/vnd.radiance
+# image/vnd.sealed.png
+# image/vnd.sealedmedia.softseal.gif
+# image/vnd.sealedmedia.softseal.jpg
+# image/vnd.svf
+image/vnd.wap.wbmp				wbmp
+image/vnd.xiff					xif
+image/webp					webp
+image/x-3ds					3ds
+image/x-cmu-raster				ras
+image/x-cmx					cmx
+image/x-freehand				fh fhc fh4 fh5 fh7
+image/x-icon					ico
+image/x-mrsid-image				sid
+image/x-pcx					pcx
+image/x-pict					pic pct
+image/x-portable-anymap				pnm
+image/x-portable-bitmap				pbm
+image/x-portable-graymap			pgm
+image/x-portable-pixmap				ppm
+image/x-rgb					rgb
+image/x-tga					tga
+image/x-xbitmap					xbm
+image/x-xpixmap					xpm
+image/x-xwindowdump				xwd
+# message/cpim
+# message/delivery-status
+# message/disposition-notification
+# message/example
+# message/external-body
+# message/feedback-report
+# message/global
+# message/global-delivery-status
+# message/global-disposition-notification
+# message/global-headers
+# message/http
+# message/imdn+xml
+# message/news
+# message/partial
+message/rfc822					eml mime
+# message/s-http
+# message/sip
+# message/sipfrag
+# message/tracking-status
+# message/vnd.si.simp
+# model/example
+model/iges					igs iges
+model/mesh					msh mesh silo
+model/vnd.collada+xml				dae
+model/vnd.dwf					dwf
+# model/vnd.flatland.3dml
+model/vnd.gdl					gdl
+# model/vnd.gs-gdl
+# model/vnd.gs.gdl
+model/vnd.gtw					gtw
+# model/vnd.moml+xml
+model/vnd.mts					mts
+# model/vnd.parasolid.transmit.binary
+# model/vnd.parasolid.transmit.text
+model/vnd.vtu					vtu
+model/vrml					wrl vrml
+model/x3d+binary				x3db x3dbz
+model/x3d+vrml					x3dv x3dvz
+model/x3d+xml					x3d x3dz
+# multipart/alternative
+# multipart/appledouble
+# multipart/byteranges
+# multipart/digest
+# multipart/encrypted
+# multipart/example
+# multipart/form-data
+# multipart/header-set
+# multipart/mixed
+# multipart/parallel
+# multipart/related
+# multipart/report
+# multipart/signed
+# multipart/voice-message
+# text/1d-interleaved-parityfec
+text/cache-manifest				appcache
+text/calendar					ics ifb
+text/css					css
+text/csv					csv
+# text/directory
+# text/dns
+# text/ecmascript
+# text/enriched
+# text/example
+# text/fwdred
+text/html					html htm
+# text/javascript
+text/n3						n3
+# text/parityfec
+text/plain					txt text conf def list log in
+# text/prs.fallenstein.rst
+text/prs.lines.tag				dsc
+# text/vnd.radisys.msml-basic-layout
+# text/red
+# text/rfc822-headers
+text/richtext					rtx
+# text/rtf
+# text/rtp-enc-aescm128
+# text/rtx
+text/sgml					sgml sgm
+# text/t140
+text/tab-separated-values			tsv
+text/troff					t tr roff man me ms
+text/turtle					ttl
+# text/ulpfec
+text/uri-list					uri uris urls
+text/vcard					vcard
+# text/vnd.abc
+text/vnd.curl					curl
+text/vnd.curl.dcurl				dcurl
+text/vnd.curl.scurl				scurl
+text/vnd.curl.mcurl				mcurl
+# text/vnd.dmclientscript
+text/vnd.dvb.subtitle				sub
+# text/vnd.esmertec.theme-descriptor
+text/vnd.fly					fly
+text/vnd.fmi.flexstor				flx
+text/vnd.graphviz				gv
+text/vnd.in3d.3dml				3dml
+text/vnd.in3d.spot				spot
+# text/vnd.iptc.newsml
+# text/vnd.iptc.nitf
+# text/vnd.latex-z
+# text/vnd.motorola.reflex
+# text/vnd.ms-mediapackage
+# text/vnd.net2phone.commcenter.command
+# text/vnd.si.uricatalogue
+text/vnd.sun.j2me.app-descriptor		jad
+# text/vnd.trolltech.linguist
+# text/vnd.wap.si
+# text/vnd.wap.sl
+text/vnd.wap.wml				wml
+text/vnd.wap.wmlscript				wmls
+text/x-asm					s asm
+text/x-c					c cc cxx cpp h hh dic
+text/x-fortran					f for f77 f90
+text/x-java-source				java
+text/x-opml					opml
+text/x-pascal					p pas
+text/x-nfo					nfo
+text/x-setext					etx
+text/x-sfv					sfv
+text/x-uuencode					uu
+text/x-vcalendar				vcs
+text/x-vcard					vcf
+# text/xml
+# text/xml-external-parsed-entity
+# video/1d-interleaved-parityfec
+video/3gpp					3gp
+# video/3gpp-tt
+video/3gpp2					3g2
+# video/bmpeg
+# video/bt656
+# video/celb
+# video/dv
+# video/example
+video/h261					h261
+video/h263					h263
+# video/h263-1998
+# video/h263-2000
+video/h264					h264
+# video/h264-rcdo
+# video/h264-svc
+video/jpeg					jpgv
+# video/jpeg2000
+video/jpm					jpm jpgm
+video/mj2					mj2 mjp2
+# video/mp1s
+# video/mp2p
+# video/mp2t
+video/mp4					mp4 mp4v mpg4
+# video/mp4v-es
+video/mpeg					mpeg mpg mpe m1v m2v
+# video/mpeg4-generic
+# video/mpv
+# video/nv
+video/ogg					ogv
+# video/parityfec
+# video/pointer
+video/quicktime					qt mov
+# video/raw
+# video/rtp-enc-aescm128
+# video/rtx
+# video/smpte292m
+# video/ulpfec
+# video/vc1
+# video/vnd.cctv
+video/vnd.dece.hd				uvh uvvh
+video/vnd.dece.mobile				uvm uvvm
+# video/vnd.dece.mp4
+video/vnd.dece.pd				uvp uvvp
+video/vnd.dece.sd				uvs uvvs
+video/vnd.dece.video				uvv uvvv
+# video/vnd.directv.mpeg
+# video/vnd.directv.mpeg-tts
+# video/vnd.dlna.mpeg-tts
+video/vnd.dvb.file				dvb
+video/vnd.fvt					fvt
+# video/vnd.hns.video
+# video/vnd.iptvforum.1dparityfec-1010
+# video/vnd.iptvforum.1dparityfec-2005
+# video/vnd.iptvforum.2dparityfec-1010
+# video/vnd.iptvforum.2dparityfec-2005
+# video/vnd.iptvforum.ttsavc
+# video/vnd.iptvforum.ttsmpeg2
+# video/vnd.motorola.video
+# video/vnd.motorola.videop
+video/vnd.mpegurl				mxu m4u
+video/vnd.ms-playready.media.pyv		pyv
+# video/vnd.nokia.interleaved-multimedia
+# video/vnd.nokia.videovoip
+# video/vnd.objectvideo
+# video/vnd.sealed.mpeg1
+# video/vnd.sealed.mpeg4
+# video/vnd.sealed.swf
+# video/vnd.sealedmedia.softseal.mov
+video/vnd.uvvu.mp4				uvu uvvu
+video/vnd.vivo					viv
+video/webm					webm
+video/x-f4v					f4v
+video/x-fli					fli
+video/x-flv					flv
+video/x-m4v					m4v
+video/x-matroska				mkv mk3d mks
+video/x-mng					mng
+video/x-ms-asf					asf asx
+video/x-ms-vob					vob
+video/x-ms-wm					wm
+video/x-ms-wmv					wmv
+video/x-ms-wmx					wmx
+video/x-ms-wvx					wvx
+video/x-msvideo					avi
+video/x-sgi-movie				movie
+video/x-smv					smv
+x-conference/x-cooltalk				ice
diff --git a/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types.json b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types.json
new file mode 100644
index 0000000000..30755b00ca
--- /dev/null
+++ b/civicrm/vendor/dflydev/apache-mime-types/src/Dflydev/ApacheMimeTypes/Resources/mime.types.json
@@ -0,0 +1 @@
+{"application\/andrew-inset":["ez"],"application\/applixware":["aw"],"application\/atom+xml":["atom"],"application\/atomcat+xml":["atomcat"],"application\/atomsvc+xml":["atomsvc"],"application\/ccxml+xml":["ccxml"],"application\/cdmi-capability":["cdmia"],"application\/cdmi-container":["cdmic"],"application\/cdmi-domain":["cdmid"],"application\/cdmi-object":["cdmio"],"application\/cdmi-queue":["cdmiq"],"application\/cu-seeme":["cu"],"application\/davmount+xml":["davmount"],"application\/docbook+xml":["dbk"],"application\/dssc+der":["dssc"],"application\/dssc+xml":["xdssc"],"application\/ecmascript":["ecma"],"application\/emma+xml":["emma"],"application\/epub+zip":["epub"],"application\/exi":["exi"],"application\/font-tdpfr":["pfr"],"application\/gml+xml":["gml"],"application\/gpx+xml":["gpx"],"application\/gxf":["gxf"],"application\/hyperstudio":["stk"],"application\/inkml+xml":["ink","inkml"],"application\/ipfix":["ipfix"],"application\/java-archive":["jar"],"application\/java-serialized-object":["ser"],"application\/java-vm":["class"],"application\/javascript":["js"],"application\/json":["json"],"application\/jsonml+json":["jsonml"],"application\/lost+xml":["lostxml"],"application\/mac-binhex40":["hqx"],"application\/mac-compactpro":["cpt"],"application\/mads+xml":["mads"],"application\/marc":["mrc"],"application\/marcxml+xml":["mrcx"],"application\/mathematica":["ma","nb","mb"],"application\/mathml+xml":["mathml"],"application\/mbox":["mbox"],"application\/mediaservercontrol+xml":["mscml"],"application\/metalink+xml":["metalink"],"application\/metalink4+xml":["meta4"],"application\/mets+xml":["mets"],"application\/mods+xml":["mods"],"application\/mp21":["m21","mp21"],"application\/mp4":["mp4s"],"application\/msword":["doc","dot"],"application\/mxf":["mxf"],"application\/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy"],"application\/oda":["oda"],"application\/oebps-package+xml":["opf"],"application\/ogg":["ogx"],"application\/omdoc+xml":["omdoc"],"application\/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application\/oxps":["oxps"],"application\/patch-ops-error+xml":["xer"],"application\/pdf":["pdf"],"application\/pgp-encrypted":["pgp"],"application\/pgp-signature":["asc","sig"],"application\/pics-rules":["prf"],"application\/pkcs10":["p10"],"application\/pkcs7-mime":["p7m","p7c"],"application\/pkcs7-signature":["p7s"],"application\/pkcs8":["p8"],"application\/pkix-attr-cert":["ac"],"application\/pkix-cert":["cer"],"application\/pkix-crl":["crl"],"application\/pkix-pkipath":["pkipath"],"application\/pkixcmp":["pki"],"application\/pls+xml":["pls"],"application\/postscript":["ai","eps","ps"],"application\/prs.cww":["cww"],"application\/pskc+xml":["pskcxml"],"application\/rdf+xml":["rdf"],"application\/reginfo+xml":["rif"],"application\/relax-ng-compact-syntax":["rnc"],"application\/resource-lists+xml":["rl"],"application\/resource-lists-diff+xml":["rld"],"application\/rls-services+xml":["rs"],"application\/rpki-ghostbusters":["gbr"],"application\/rpki-manifest":["mft"],"application\/rpki-roa":["roa"],"application\/rsd+xml":["rsd"],"application\/rss+xml":["rss"],"application\/rtf":["rtf"],"application\/sbml+xml":["sbml"],"application\/scvp-cv-request":["scq"],"application\/scvp-cv-response":["scs"],"application\/scvp-vp-request":["spq"],"application\/scvp-vp-response":["spp"],"application\/sdp":["sdp"],"application\/set-payment-initiation":["setpay"],"application\/set-registration-initiation":["setreg"],"application\/shf+xml":["shf"],"application\/smil+xml":["smi","smil"],"application\/sparql-query":["rq"],"application\/sparql-results+xml":["srx"],"application\/srgs":["gram"],"application\/srgs+xml":["grxml"],"application\/sru+xml":["sru"],"application\/ssdl+xml":["ssdl"],"application\/ssml+xml":["ssml"],"application\/tei+xml":["tei","teicorpus"],"application\/thraud+xml":["tfi"],"application\/timestamped-data":["tsd"],"application\/vnd.3gpp.pic-bw-large":["plb"],"application\/vnd.3gpp.pic-bw-small":["psb"],"application\/vnd.3gpp.pic-bw-var":["pvb"],"application\/vnd.3gpp2.tcap":["tcap"],"application\/vnd.3m.post-it-notes":["pwn"],"application\/vnd.accpac.simply.aso":["aso"],"application\/vnd.accpac.simply.imp":["imp"],"application\/vnd.acucobol":["acu"],"application\/vnd.acucorp":["atc","acutc"],"application\/vnd.adobe.air-application-installer-package+zip":["air"],"application\/vnd.adobe.formscentral.fcdt":["fcdt"],"application\/vnd.adobe.fxp":["fxp","fxpl"],"application\/vnd.adobe.xdp+xml":["xdp"],"application\/vnd.adobe.xfdf":["xfdf"],"application\/vnd.ahead.space":["ahead"],"application\/vnd.airzip.filesecure.azf":["azf"],"application\/vnd.airzip.filesecure.azs":["azs"],"application\/vnd.amazon.ebook":["azw"],"application\/vnd.americandynamics.acc":["acc"],"application\/vnd.amiga.ami":["ami"],"application\/vnd.android.package-archive":["apk"],"application\/vnd.anser-web-certificate-issue-initiation":["cii"],"application\/vnd.anser-web-funds-transfer-initiation":["fti"],"application\/vnd.antix.game-component":["atx"],"application\/vnd.apple.installer+xml":["mpkg"],"application\/vnd.apple.mpegurl":["m3u8"],"application\/vnd.aristanetworks.swi":["swi"],"application\/vnd.astraea-software.iota":["iota"],"application\/vnd.audiograph":["aep"],"application\/vnd.blueice.multipass":["mpm"],"application\/vnd.bmi":["bmi"],"application\/vnd.businessobjects":["rep"],"application\/vnd.chemdraw+xml":["cdxml"],"application\/vnd.chipnuts.karaoke-mmd":["mmd"],"application\/vnd.cinderella":["cdy"],"application\/vnd.claymore":["cla"],"application\/vnd.cloanto.rp9":["rp9"],"application\/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application\/vnd.cluetrust.cartomobile-config":["c11amc"],"application\/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application\/vnd.commonspace":["csp"],"application\/vnd.contact.cmsg":["cdbcmsg"],"application\/vnd.cosmocaller":["cmc"],"application\/vnd.crick.clicker":["clkx"],"application\/vnd.crick.clicker.keyboard":["clkk"],"application\/vnd.crick.clicker.palette":["clkp"],"application\/vnd.crick.clicker.template":["clkt"],"application\/vnd.crick.clicker.wordbank":["clkw"],"application\/vnd.criticaltools.wbs+xml":["wbs"],"application\/vnd.ctc-posml":["pml"],"application\/vnd.cups-ppd":["ppd"],"application\/vnd.curl.car":["car"],"application\/vnd.curl.pcurl":["pcurl"],"application\/vnd.dart":["dart"],"application\/vnd.data-vision.rdz":["rdz"],"application\/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application\/vnd.dece.ttml+xml":["uvt","uvvt"],"application\/vnd.dece.unspecified":["uvx","uvvx"],"application\/vnd.dece.zip":["uvz","uvvz"],"application\/vnd.denovo.fcselayout-link":["fe_launch"],"application\/vnd.dna":["dna"],"application\/vnd.dolby.mlp":["mlp"],"application\/vnd.dpgraph":["dpg"],"application\/vnd.dreamfactory":["dfac"],"application\/vnd.ds-keypoint":["kpxx"],"application\/vnd.dvb.ait":["ait"],"application\/vnd.dvb.service":["svc"],"application\/vnd.dynageo":["geo"],"application\/vnd.ecowin.chart":["mag"],"application\/vnd.enliven":["nml"],"application\/vnd.epson.esf":["esf"],"application\/vnd.epson.msf":["msf"],"application\/vnd.epson.quickanime":["qam"],"application\/vnd.epson.salt":["slt"],"application\/vnd.epson.ssf":["ssf"],"application\/vnd.eszigno3+xml":["es3","et3"],"application\/vnd.ezpix-album":["ez2"],"application\/vnd.ezpix-package":["ez3"],"application\/vnd.fdf":["fdf"],"application\/vnd.fdsn.mseed":["mseed"],"application\/vnd.fdsn.seed":["seed","dataless"],"application\/vnd.flographit":["gph"],"application\/vnd.fluxtime.clip":["ftc"],"application\/vnd.framemaker":["fm","frame","maker","book"],"application\/vnd.frogans.fnc":["fnc"],"application\/vnd.frogans.ltf":["ltf"],"application\/vnd.fsc.weblaunch":["fsc"],"application\/vnd.fujitsu.oasys":["oas"],"application\/vnd.fujitsu.oasys2":["oa2"],"application\/vnd.fujitsu.oasys3":["oa3"],"application\/vnd.fujitsu.oasysgp":["fg5"],"application\/vnd.fujitsu.oasysprs":["bh2"],"application\/vnd.fujixerox.ddd":["ddd"],"application\/vnd.fujixerox.docuworks":["xdw"],"application\/vnd.fujixerox.docuworks.binder":["xbd"],"application\/vnd.fuzzysheet":["fzs"],"application\/vnd.genomatix.tuxedo":["txd"],"application\/vnd.geogebra.file":["ggb"],"application\/vnd.geogebra.tool":["ggt"],"application\/vnd.geometry-explorer":["gex","gre"],"application\/vnd.geonext":["gxt"],"application\/vnd.geoplan":["g2w"],"application\/vnd.geospace":["g3w"],"application\/vnd.gmx":["gmx"],"application\/vnd.google-earth.kml+xml":["kml"],"application\/vnd.google-earth.kmz":["kmz"],"application\/vnd.grafeq":["gqf","gqs"],"application\/vnd.groove-account":["gac"],"application\/vnd.groove-help":["ghf"],"application\/vnd.groove-identity-message":["gim"],"application\/vnd.groove-injector":["grv"],"application\/vnd.groove-tool-message":["gtm"],"application\/vnd.groove-tool-template":["tpl"],"application\/vnd.groove-vcard":["vcg"],"application\/vnd.hal+xml":["hal"],"application\/vnd.handheld-entertainment+xml":["zmm"],"application\/vnd.hbci":["hbci"],"application\/vnd.hhe.lesson-player":["les"],"application\/vnd.hp-hpgl":["hpgl"],"application\/vnd.hp-hpid":["hpid"],"application\/vnd.hp-hps":["hps"],"application\/vnd.hp-jlyt":["jlt"],"application\/vnd.hp-pcl":["pcl"],"application\/vnd.hp-pclxl":["pclxl"],"application\/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application\/vnd.ibm.minipay":["mpy"],"application\/vnd.ibm.modcap":["afp","listafp","list3820"],"application\/vnd.ibm.rights-management":["irm"],"application\/vnd.ibm.secure-container":["sc"],"application\/vnd.iccprofile":["icc","icm"],"application\/vnd.igloader":["igl"],"application\/vnd.immervision-ivp":["ivp"],"application\/vnd.immervision-ivu":["ivu"],"application\/vnd.insors.igm":["igm"],"application\/vnd.intercon.formnet":["xpw","xpx"],"application\/vnd.intergeo":["i2g"],"application\/vnd.intu.qbo":["qbo"],"application\/vnd.intu.qfx":["qfx"],"application\/vnd.ipunplugged.rcprofile":["rcprofile"],"application\/vnd.irepository.package+xml":["irp"],"application\/vnd.is-xpr":["xpr"],"application\/vnd.isac.fcs":["fcs"],"application\/vnd.jam":["jam"],"application\/vnd.jcp.javame.midlet-rms":["rms"],"application\/vnd.jisp":["jisp"],"application\/vnd.joost.joda-archive":["joda"],"application\/vnd.kahootz":["ktz","ktr"],"application\/vnd.kde.karbon":["karbon"],"application\/vnd.kde.kchart":["chrt"],"application\/vnd.kde.kformula":["kfo"],"application\/vnd.kde.kivio":["flw"],"application\/vnd.kde.kontour":["kon"],"application\/vnd.kde.kpresenter":["kpr","kpt"],"application\/vnd.kde.kspread":["ksp"],"application\/vnd.kde.kword":["kwd","kwt"],"application\/vnd.kenameaapp":["htke"],"application\/vnd.kidspiration":["kia"],"application\/vnd.kinar":["kne","knp"],"application\/vnd.koan":["skp","skd","skt","skm"],"application\/vnd.kodak-descriptor":["sse"],"application\/vnd.las.las+xml":["lasxml"],"application\/vnd.llamagraphics.life-balance.desktop":["lbd"],"application\/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application\/vnd.lotus-1-2-3":["123"],"application\/vnd.lotus-approach":["apr"],"application\/vnd.lotus-freelance":["pre"],"application\/vnd.lotus-notes":["nsf"],"application\/vnd.lotus-organizer":["org"],"application\/vnd.lotus-screencam":["scm"],"application\/vnd.lotus-wordpro":["lwp"],"application\/vnd.macports.portpkg":["portpkg"],"application\/vnd.mcd":["mcd"],"application\/vnd.medcalcdata":["mc1"],"application\/vnd.mediastation.cdkey":["cdkey"],"application\/vnd.mfer":["mwf"],"application\/vnd.mfmp":["mfm"],"application\/vnd.micrografx.flo":["flo"],"application\/vnd.micrografx.igx":["igx"],"application\/vnd.mif":["mif"],"application\/vnd.mobius.daf":["daf"],"application\/vnd.mobius.dis":["dis"],"application\/vnd.mobius.mbk":["mbk"],"application\/vnd.mobius.mqy":["mqy"],"application\/vnd.mobius.msl":["msl"],"application\/vnd.mobius.plc":["plc"],"application\/vnd.mobius.txf":["txf"],"application\/vnd.mophun.application":["mpn"],"application\/vnd.mophun.certificate":["mpc"],"application\/vnd.mozilla.xul+xml":["xul"],"application\/vnd.ms-artgalry":["cil"],"application\/vnd.ms-cab-compressed":["cab"],"application\/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application\/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application\/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application\/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application\/vnd.ms-excel.template.macroenabled.12":["xltm"],"application\/vnd.ms-fontobject":["eot"],"application\/vnd.ms-htmlhelp":["chm"],"application\/vnd.ms-ims":["ims"],"application\/vnd.ms-lrm":["lrm"],"application\/vnd.ms-officetheme":["thmx"],"application\/vnd.ms-pki.seccat":["cat"],"application\/vnd.ms-pki.stl":["stl"],"application\/vnd.ms-powerpoint":["ppt","pps","pot"],"application\/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application\/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application\/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application\/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application\/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application\/vnd.ms-project":["mpp","mpt"],"application\/vnd.ms-word.document.macroenabled.12":["docm"],"application\/vnd.ms-word.template.macroenabled.12":["dotm"],"application\/vnd.ms-works":["wps","wks","wcm","wdb"],"application\/vnd.ms-wpl":["wpl"],"application\/vnd.ms-xpsdocument":["xps"],"application\/vnd.mseq":["mseq"],"application\/vnd.musician":["mus"],"application\/vnd.muvee.style":["msty"],"application\/vnd.mynfc":["taglet"],"application\/vnd.neurolanguage.nlu":["nlu"],"application\/vnd.nitf":["ntf","nitf"],"application\/vnd.noblenet-directory":["nnd"],"application\/vnd.noblenet-sealer":["nns"],"application\/vnd.noblenet-web":["nnw"],"application\/vnd.nokia.n-gage.data":["ngdat"],"application\/vnd.nokia.n-gage.symbian.install":["n-gage"],"application\/vnd.nokia.radio-preset":["rpst"],"application\/vnd.nokia.radio-presets":["rpss"],"application\/vnd.novadigm.edm":["edm"],"application\/vnd.novadigm.edx":["edx"],"application\/vnd.novadigm.ext":["ext"],"application\/vnd.oasis.opendocument.chart":["odc"],"application\/vnd.oasis.opendocument.chart-template":["otc"],"application\/vnd.oasis.opendocument.database":["odb"],"application\/vnd.oasis.opendocument.formula":["odf"],"application\/vnd.oasis.opendocument.formula-template":["odft"],"application\/vnd.oasis.opendocument.graphics":["odg"],"application\/vnd.oasis.opendocument.graphics-template":["otg"],"application\/vnd.oasis.opendocument.image":["odi"],"application\/vnd.oasis.opendocument.image-template":["oti"],"application\/vnd.oasis.opendocument.presentation":["odp"],"application\/vnd.oasis.opendocument.presentation-template":["otp"],"application\/vnd.oasis.opendocument.spreadsheet":["ods"],"application\/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application\/vnd.oasis.opendocument.text":["odt"],"application\/vnd.oasis.opendocument.text-master":["odm"],"application\/vnd.oasis.opendocument.text-template":["ott"],"application\/vnd.oasis.opendocument.text-web":["oth"],"application\/vnd.olpc-sugar":["xo"],"application\/vnd.oma.dd2+xml":["dd2"],"application\/vnd.openofficeorg.extension":["oxt"],"application\/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application\/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application\/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application\/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application\/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application\/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application\/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application\/vnd.osgeo.mapguide.package":["mgp"],"application\/vnd.osgi.dp":["dp"],"application\/vnd.osgi.subsystem":["esa"],"application\/vnd.palm":["pdb","pqa","oprc"],"application\/vnd.pawaafile":["paw"],"application\/vnd.pg.format":["str"],"application\/vnd.pg.osasli":["ei6"],"application\/vnd.picsel":["efif"],"application\/vnd.pmi.widget":["wg"],"application\/vnd.pocketlearn":["plf"],"application\/vnd.powerbuilder6":["pbd"],"application\/vnd.previewsystems.box":["box"],"application\/vnd.proteus.magazine":["mgz"],"application\/vnd.publishare-delta-tree":["qps"],"application\/vnd.pvi.ptid1":["ptid"],"application\/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application\/vnd.realvnc.bed":["bed"],"application\/vnd.recordare.musicxml":["mxl"],"application\/vnd.recordare.musicxml+xml":["musicxml"],"application\/vnd.rig.cryptonote":["cryptonote"],"application\/vnd.rim.cod":["cod"],"application\/vnd.rn-realmedia":["rm"],"application\/vnd.rn-realmedia-vbr":["rmvb"],"application\/vnd.route66.link66+xml":["link66"],"application\/vnd.sailingtracker.track":["st"],"application\/vnd.seemail":["see"],"application\/vnd.sema":["sema"],"application\/vnd.semd":["semd"],"application\/vnd.semf":["semf"],"application\/vnd.shana.informed.formdata":["ifm"],"application\/vnd.shana.informed.formtemplate":["itp"],"application\/vnd.shana.informed.interchange":["iif"],"application\/vnd.shana.informed.package":["ipk"],"application\/vnd.simtech-mindmapper":["twd","twds"],"application\/vnd.smaf":["mmf"],"application\/vnd.smart.teacher":["teacher"],"application\/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application\/vnd.spotfire.dxp":["dxp"],"application\/vnd.spotfire.sfs":["sfs"],"application\/vnd.stardivision.calc":["sdc"],"application\/vnd.stardivision.draw":["sda"],"application\/vnd.stardivision.impress":["sdd"],"application\/vnd.stardivision.math":["smf"],"application\/vnd.stardivision.writer":["sdw","vor"],"application\/vnd.stardivision.writer-global":["sgl"],"application\/vnd.stepmania.package":["smzip"],"application\/vnd.stepmania.stepchart":["sm"],"application\/vnd.sun.xml.calc":["sxc"],"application\/vnd.sun.xml.calc.template":["stc"],"application\/vnd.sun.xml.draw":["sxd"],"application\/vnd.sun.xml.draw.template":["std"],"application\/vnd.sun.xml.impress":["sxi"],"application\/vnd.sun.xml.impress.template":["sti"],"application\/vnd.sun.xml.math":["sxm"],"application\/vnd.sun.xml.writer":["sxw"],"application\/vnd.sun.xml.writer.global":["sxg"],"application\/vnd.sun.xml.writer.template":["stw"],"application\/vnd.sus-calendar":["sus","susp"],"application\/vnd.svd":["svd"],"application\/vnd.symbian.install":["sis","sisx"],"application\/vnd.syncml+xml":["xsm"],"application\/vnd.syncml.dm+wbxml":["bdm"],"application\/vnd.syncml.dm+xml":["xdm"],"application\/vnd.tao.intent-module-archive":["tao"],"application\/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application\/vnd.tmobile-livetv":["tmo"],"application\/vnd.trid.tpt":["tpt"],"application\/vnd.triscape.mxs":["mxs"],"application\/vnd.trueapp":["tra"],"application\/vnd.ufdl":["ufd","ufdl"],"application\/vnd.uiq.theme":["utz"],"application\/vnd.umajin":["umj"],"application\/vnd.unity":["unityweb"],"application\/vnd.uoml+xml":["uoml"],"application\/vnd.vcx":["vcx"],"application\/vnd.visio":["vsd","vst","vss","vsw"],"application\/vnd.visionary":["vis"],"application\/vnd.vsf":["vsf"],"application\/vnd.wap.wbxml":["wbxml"],"application\/vnd.wap.wmlc":["wmlc"],"application\/vnd.wap.wmlscriptc":["wmlsc"],"application\/vnd.webturbo":["wtb"],"application\/vnd.wolfram.player":["nbp"],"application\/vnd.wordperfect":["wpd"],"application\/vnd.wqd":["wqd"],"application\/vnd.wt.stf":["stf"],"application\/vnd.xara":["xar"],"application\/vnd.xfdl":["xfdl"],"application\/vnd.yamaha.hv-dic":["hvd"],"application\/vnd.yamaha.hv-script":["hvs"],"application\/vnd.yamaha.hv-voice":["hvp"],"application\/vnd.yamaha.openscoreformat":["osf"],"application\/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application\/vnd.yamaha.smaf-audio":["saf"],"application\/vnd.yamaha.smaf-phrase":["spf"],"application\/vnd.yellowriver-custom-menu":["cmp"],"application\/vnd.zul":["zir","zirz"],"application\/vnd.zzazz.deck+xml":["zaz"],"application\/voicexml+xml":["vxml"],"application\/widget":["wgt"],"application\/winhlp":["hlp"],"application\/wsdl+xml":["wsdl"],"application\/wspolicy+xml":["wspolicy"],"application\/x-7z-compressed":["7z"],"application\/x-abiword":["abw"],"application\/x-ace-compressed":["ace"],"application\/x-apple-diskimage":["dmg"],"application\/x-authorware-bin":["aab","x32","u32","vox"],"application\/x-authorware-map":["aam"],"application\/x-authorware-seg":["aas"],"application\/x-bcpio":["bcpio"],"application\/x-bittorrent":["torrent"],"application\/x-blorb":["blb","blorb"],"application\/x-bzip":["bz"],"application\/x-bzip2":["bz2","boz"],"application\/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application\/x-cdlink":["vcd"],"application\/x-cfs-compressed":["cfs"],"application\/x-chat":["chat"],"application\/x-chess-pgn":["pgn"],"application\/x-conference":["nsc"],"application\/x-cpio":["cpio"],"application\/x-csh":["csh"],"application\/x-debian-package":["deb","udeb"],"application\/x-dgc-compressed":["dgc"],"application\/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application\/x-doom":["wad"],"application\/x-dtbncx+xml":["ncx"],"application\/x-dtbook+xml":["dtb"],"application\/x-dtbresource+xml":["res"],"application\/x-dvi":["dvi"],"application\/x-envoy":["evy"],"application\/x-eva":["eva"],"application\/x-font-bdf":["bdf"],"application\/x-font-ghostscript":["gsf"],"application\/x-font-linux-psf":["psf"],"application\/x-font-otf":["otf"],"application\/x-font-pcf":["pcf"],"application\/x-font-snf":["snf"],"application\/x-font-ttf":["ttf","ttc"],"application\/x-font-type1":["pfa","pfb","pfm","afm"],"application\/x-font-woff":["woff"],"application\/x-freearc":["arc"],"application\/x-futuresplash":["spl"],"application\/x-gca-compressed":["gca"],"application\/x-glulx":["ulx"],"application\/x-gnumeric":["gnumeric"],"application\/x-gramps-xml":["gramps"],"application\/x-gtar":["gtar"],"application\/x-hdf":["hdf"],"application\/x-install-instructions":["install"],"application\/x-iso9660-image":["iso"],"application\/x-java-jnlp-file":["jnlp"],"application\/x-latex":["latex"],"application\/x-lzh-compressed":["lzh","lha"],"application\/x-mie":["mie"],"application\/x-mobipocket-ebook":["prc","mobi"],"application\/x-ms-application":["application"],"application\/x-ms-shortcut":["lnk"],"application\/x-ms-wmd":["wmd"],"application\/x-ms-wmz":["wmz"],"application\/x-ms-xbap":["xbap"],"application\/x-msaccess":["mdb"],"application\/x-msbinder":["obd"],"application\/x-mscardfile":["crd"],"application\/x-msclip":["clp"],"application\/x-msdownload":["exe","dll","com","bat","msi"],"application\/x-msmediaview":["mvb","m13","m14"],"application\/x-msmetafile":["wmf","wmz","emf","emz"],"application\/x-msmoney":["mny"],"application\/x-mspublisher":["pub"],"application\/x-msschedule":["scd"],"application\/x-msterminal":["trm"],"application\/x-mswrite":["wri"],"application\/x-netcdf":["nc","cdf"],"application\/x-nzb":["nzb"],"application\/x-pkcs12":["p12","pfx"],"application\/x-pkcs7-certificates":["p7b","spc"],"application\/x-pkcs7-certreqresp":["p7r"],"application\/x-rar-compressed":["rar"],"application\/x-research-info-systems":["ris"],"application\/x-sh":["sh"],"application\/x-shar":["shar"],"application\/x-shockwave-flash":["swf"],"application\/x-silverlight-app":["xap"],"application\/x-sql":["sql"],"application\/x-stuffit":["sit"],"application\/x-stuffitx":["sitx"],"application\/x-subrip":["srt"],"application\/x-sv4cpio":["sv4cpio"],"application\/x-sv4crc":["sv4crc"],"application\/x-t3vm-image":["t3"],"application\/x-tads":["gam"],"application\/x-tar":["tar"],"application\/x-tcl":["tcl"],"application\/x-tex":["tex"],"application\/x-tex-tfm":["tfm"],"application\/x-texinfo":["texinfo","texi"],"application\/x-tgif":["obj"],"application\/x-ustar":["ustar"],"application\/x-wais-source":["src"],"application\/x-x509-ca-cert":["der","crt"],"application\/x-xfig":["fig"],"application\/x-xliff+xml":["xlf"],"application\/x-xpinstall":["xpi"],"application\/x-xz":["xz"],"application\/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application\/xaml+xml":["xaml"],"application\/xcap-diff+xml":["xdf"],"application\/xenc+xml":["xenc"],"application\/xhtml+xml":["xhtml","xht"],"application\/xml":["xml","xsl"],"application\/xml-dtd":["dtd"],"application\/xop+xml":["xop"],"application\/xproc+xml":["xpl"],"application\/xslt+xml":["xslt"],"application\/xspf+xml":["xspf"],"application\/xv+xml":["mxml","xhvml","xvml","xvm"],"application\/yang":["yang"],"application\/yin+xml":["yin"],"application\/zip":["zip"],"audio\/adpcm":["adp"],"audio\/basic":["au","snd"],"audio\/midi":["mid","midi","kar","rmi"],"audio\/mp4":["mp4a"],"audio\/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio\/ogg":["oga","ogg","spx"],"audio\/s3m":["s3m"],"audio\/silk":["sil"],"audio\/vnd.dece.audio":["uva","uvva"],"audio\/vnd.digital-winds":["eol"],"audio\/vnd.dra":["dra"],"audio\/vnd.dts":["dts"],"audio\/vnd.dts.hd":["dtshd"],"audio\/vnd.lucent.voice":["lvp"],"audio\/vnd.ms-playready.media.pya":["pya"],"audio\/vnd.nuera.ecelp4800":["ecelp4800"],"audio\/vnd.nuera.ecelp7470":["ecelp7470"],"audio\/vnd.nuera.ecelp9600":["ecelp9600"],"audio\/vnd.rip":["rip"],"audio\/webm":["weba"],"audio\/x-aac":["aac"],"audio\/x-aiff":["aif","aiff","aifc"],"audio\/x-caf":["caf"],"audio\/x-flac":["flac"],"audio\/x-matroska":["mka"],"audio\/x-mpegurl":["m3u"],"audio\/x-ms-wax":["wax"],"audio\/x-ms-wma":["wma"],"audio\/x-pn-realaudio":["ram","ra"],"audio\/x-pn-realaudio-plugin":["rmp"],"audio\/x-wav":["wav"],"audio\/xm":["xm"],"chemical\/x-cdx":["cdx"],"chemical\/x-cif":["cif"],"chemical\/x-cmdf":["cmdf"],"chemical\/x-cml":["cml"],"chemical\/x-csml":["csml"],"chemical\/x-xyz":["xyz"],"image\/bmp":["bmp"],"image\/cgm":["cgm"],"image\/g3fax":["g3"],"image\/gif":["gif"],"image\/ief":["ief"],"image\/jpeg":["jpeg","jpg","jpe"],"image\/ktx":["ktx"],"image\/png":["png"],"image\/prs.btif":["btif"],"image\/sgi":["sgi"],"image\/svg+xml":["svg","svgz"],"image\/tiff":["tiff","tif"],"image\/vnd.adobe.photoshop":["psd"],"image\/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image\/vnd.dvb.subtitle":["sub"],"image\/vnd.djvu":["djvu","djv"],"image\/vnd.dwg":["dwg"],"image\/vnd.dxf":["dxf"],"image\/vnd.fastbidsheet":["fbs"],"image\/vnd.fpx":["fpx"],"image\/vnd.fst":["fst"],"image\/vnd.fujixerox.edmics-mmr":["mmr"],"image\/vnd.fujixerox.edmics-rlc":["rlc"],"image\/vnd.ms-modi":["mdi"],"image\/vnd.ms-photo":["wdp"],"image\/vnd.net-fpx":["npx"],"image\/vnd.wap.wbmp":["wbmp"],"image\/vnd.xiff":["xif"],"image\/webp":["webp"],"image\/x-3ds":["3ds"],"image\/x-cmu-raster":["ras"],"image\/x-cmx":["cmx"],"image\/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image\/x-icon":["ico"],"image\/x-mrsid-image":["sid"],"image\/x-pcx":["pcx"],"image\/x-pict":["pic","pct"],"image\/x-portable-anymap":["pnm"],"image\/x-portable-bitmap":["pbm"],"image\/x-portable-graymap":["pgm"],"image\/x-portable-pixmap":["ppm"],"image\/x-rgb":["rgb"],"image\/x-tga":["tga"],"image\/x-xbitmap":["xbm"],"image\/x-xpixmap":["xpm"],"image\/x-xwindowdump":["xwd"],"message\/rfc822":["eml","mime"],"model\/iges":["igs","iges"],"model\/mesh":["msh","mesh","silo"],"model\/vnd.collada+xml":["dae"],"model\/vnd.dwf":["dwf"],"model\/vnd.gdl":["gdl"],"model\/vnd.gtw":["gtw"],"model\/vnd.mts":["mts"],"model\/vnd.vtu":["vtu"],"model\/vrml":["wrl","vrml"],"model\/x3d+binary":["x3db","x3dbz"],"model\/x3d+vrml":["x3dv","x3dvz"],"model\/x3d+xml":["x3d","x3dz"],"text\/cache-manifest":["appcache"],"text\/calendar":["ics","ifb"],"text\/css":["css"],"text\/csv":["csv"],"text\/html":["html","htm"],"text\/n3":["n3"],"text\/plain":["txt","text","conf","def","list","log","in"],"text\/prs.lines.tag":["dsc"],"text\/richtext":["rtx"],"text\/sgml":["sgml","sgm"],"text\/tab-separated-values":["tsv"],"text\/troff":["t","tr","roff","man","me","ms"],"text\/turtle":["ttl"],"text\/uri-list":["uri","uris","urls"],"text\/vcard":["vcard"],"text\/vnd.curl":["curl"],"text\/vnd.curl.dcurl":["dcurl"],"text\/vnd.curl.scurl":["scurl"],"text\/vnd.curl.mcurl":["mcurl"],"text\/vnd.dvb.subtitle":["sub"],"text\/vnd.fly":["fly"],"text\/vnd.fmi.flexstor":["flx"],"text\/vnd.graphviz":["gv"],"text\/vnd.in3d.3dml":["3dml"],"text\/vnd.in3d.spot":["spot"],"text\/vnd.sun.j2me.app-descriptor":["jad"],"text\/vnd.wap.wml":["wml"],"text\/vnd.wap.wmlscript":["wmls"],"text\/x-asm":["s","asm"],"text\/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text\/x-fortran":["f","for","f77","f90"],"text\/x-java-source":["java"],"text\/x-opml":["opml"],"text\/x-pascal":["p","pas"],"text\/x-nfo":["nfo"],"text\/x-setext":["etx"],"text\/x-sfv":["sfv"],"text\/x-uuencode":["uu"],"text\/x-vcalendar":["vcs"],"text\/x-vcard":["vcf"],"video\/3gpp":["3gp"],"video\/3gpp2":["3g2"],"video\/h261":["h261"],"video\/h263":["h263"],"video\/h264":["h264"],"video\/jpeg":["jpgv"],"video\/jpm":["jpm","jpgm"],"video\/mj2":["mj2","mjp2"],"video\/mp4":["mp4","mp4v","mpg4"],"video\/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video\/ogg":["ogv"],"video\/quicktime":["qt","mov"],"video\/vnd.dece.hd":["uvh","uvvh"],"video\/vnd.dece.mobile":["uvm","uvvm"],"video\/vnd.dece.pd":["uvp","uvvp"],"video\/vnd.dece.sd":["uvs","uvvs"],"video\/vnd.dece.video":["uvv","uvvv"],"video\/vnd.dvb.file":["dvb"],"video\/vnd.fvt":["fvt"],"video\/vnd.mpegurl":["mxu","m4u"],"video\/vnd.ms-playready.media.pyv":["pyv"],"video\/vnd.uvvu.mp4":["uvu","uvvu"],"video\/vnd.vivo":["viv"],"video\/webm":["webm"],"video\/x-f4v":["f4v"],"video\/x-fli":["fli"],"video\/x-flv":["flv"],"video\/x-m4v":["m4v"],"video\/x-matroska":["mkv","mk3d","mks"],"video\/x-mng":["mng"],"video\/x-ms-asf":["asf","asx"],"video\/x-ms-vob":["vob"],"video\/x-ms-wm":["wm"],"video\/x-ms-wmv":["wmv"],"video\/x-ms-wmx":["wmx"],"video\/x-ms-wvx":["wvx"],"video\/x-msvideo":["avi"],"video\/x-sgi-movie":["movie"],"video\/x-smv":["smv"],"x-conference\/x-cooltalk":["ice"]}
\ No newline at end of file
diff --git a/civicrm/vendor/katzien/php-mime-type/.gitignore b/civicrm/vendor/katzien/php-mime-type/.gitignore
deleted file mode 100644
index 99d88f1536..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.idea
-vendor
-test/coverage
-composer.lock
\ No newline at end of file
diff --git a/civicrm/vendor/katzien/php-mime-type/.travis.yml b/civicrm/vendor/katzien/php-mime-type/.travis.yml
deleted file mode 100644
index 48301ffa4a..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-language: php
-
-php:
-  - '5.6'
-  - '7.0'
-  - '7.1'
-  - hhvm
-
-before_script:
-   - wget http://getcomposer.org/composer.phar
-   - php composer.phar install --dev --no-interaction
-
-script:
-  - mkdir -p build/logs
-  - vendor/bin/phpunit -c phpunit.xml --coverage-clover build/logs/clover.xml
-
-after_script:
-  - php vendor/bin/coveralls -v
diff --git a/civicrm/vendor/katzien/php-mime-type/README.md b/civicrm/vendor/katzien/php-mime-type/README.md
deleted file mode 100644
index 18cf1d86da..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# PhpMimeType
-A PHP library to detect the mime type of a file.
-
-[![Build Status](https://travis-ci.org/katzien/PhpMimeType.svg?branch=master)](https://travis-ci.org/katzien/PhpMimeType)
-[![Coverage Status](https://coveralls.io/repos/katzien/PhpMimeType/badge.svg)](https://coveralls.io/r/katzien/PhpMimeType)
-
-[![Latest Stable Version](https://poser.pugx.org/katzien/php-mime-type/v/stable.svg)](https://packagist.org/packages/katzien/php-mime-type)
-[![Total Downloads](https://poser.pugx.org/katzien/php-mime-type/downloads.svg)](https://packagist.org/packages/katzien/php-mime-type)
-
-[![License](https://poser.pugx.org/katzien/php-mime-type/license.svg)](https://packagist.org/packages/katzien/php-mime-type)
-
-## Not invented here
-
-This is a modernised version of [Jason Sheets's mimetype class](http://www.phpclasses.org/browse/file/2743.html).
-
-## Installation
-
-To add the PhpMimeType library to your project run
-
-```sh
-composer require katzien/php-mime-type
-```
-
-from the directory where your composer.json file is.
-
-See [Packagist](https://packagist.org/packages/katzien/php-mime-type) for more details.
-
-## Version Guidance
-
-| Version | Status               | PHP version required |
-|---------|----------------------|----------------------|
-| 1.x     | Maintained           | min. 5.3             |
-| 2.x     | Latest (recommended) | min. 5.6             |
-
-If you're using PHP 5.6 or higher, you should use the latest 2.x version. There is no difference in usage between 1.x and 2.x, so the upgrade should not require any code changes.
-
-Differences between 1.x and 2.x:
-- syntax
-- versions of composer dependencies
-
-## Usage
-
-```php
-$type = \MimeType\MimeType::getType('my-file.pdf'); // returns "application/pdf"
-```
diff --git a/civicrm/vendor/katzien/php-mime-type/composer.json b/civicrm/vendor/katzien/php-mime-type/composer.json
deleted file mode 100644
index 58b11364ef..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/composer.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-    "name": "katzien/php-mime-type",
-    "type": "library",
-    "description": "A PHP library to detect the mime type of files.",
-    "keywords": [
-        "php",
-        "mimetype"
-    ],
-    "homepage": "https://github.com/katzien/PhpMimeType",
-    "license": "MIT",
-    "authors": [
-        {
-            "name": "Kat Zien"
-        }
-    ],
-    "require": {
-        "php": ">=5.6"
-    },
-    "require-dev": {
-        "phpunit/phpunit": "5.*",
-        "satooshi/php-coveralls": "1.*"
-    },
-    "autoload": {
-        "psr-4": {
-            "MimeType\\": "src/"
-        }
-    }
-}
diff --git a/civicrm/vendor/katzien/php-mime-type/phpunit.sh b/civicrm/vendor/katzien/php-mime-type/phpunit.sh
deleted file mode 100755
index ac80e5b7c0..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/phpunit.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-vendor/phpunit/phpunit/phpunit -c phpunit.xml --coverage-clover build/logs/clover.xml
\ No newline at end of file
diff --git a/civicrm/vendor/katzien/php-mime-type/phpunit.xml b/civicrm/vendor/katzien/php-mime-type/phpunit.xml
deleted file mode 100644
index 5336eda17c..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/phpunit.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit backupGlobals="false"
-         backupStaticAttributes="false"
-         bootstrap="vendor/autoload.php"
-         colors="true"
-         convertErrorsToExceptions="true"
-         convertNoticesToExceptions="true"
-         convertWarningsToExceptions="true"
-         processIsolation="false"
-         stopOnFailure="true"
-         syntaxCheck="true"
-        >
-    <testsuites>
-        <testsuite name="PhpMimeType Test Suite">
-            <directory>./test/</directory>
-        </testsuite>
-    </testsuites>
-</phpunit>
\ No newline at end of file
diff --git a/civicrm/vendor/katzien/php-mime-type/src/Mapping.php b/civicrm/vendor/katzien/php-mime-type/src/Mapping.php
deleted file mode 100644
index 034bbd12f8..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/src/Mapping.php
+++ /dev/null
@@ -1,985 +0,0 @@
-<?php
-
-namespace MimeType;
-
-class Mapping
-{
-    /**
-     * source: https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
-     */
-    public static $types = [
-        'ez'          => 'application/andrew-inset',
-        'aw'          => 'application/applixware',
-        'atom'        => 'application/atom+xml',
-        'atomcat'     => 'application/atomcat+xml',
-        'atomsvc'     => 'application/atomsvc+xml',
-        'ccxml'       => 'application/ccxml+xml',
-        'cdmia'       => 'application/cdmi-capability',
-        'cdmic'       => 'application/cdmi-container',
-        'cdmid'       => 'application/cdmi-domain',
-        'cdmio'       => 'application/cdmi-object',
-        'cdmiq'       => 'application/cdmi-queue',
-        'cu'          => 'application/cu-seeme',
-        'davmount'    => 'application/davmount+xml',
-        'dbk'         => 'application/docbook+xml',
-        'dssc'        => 'application/dssc+der',
-        'xdssc'       => 'application/dssc+xml',
-        'ecma'        => 'application/ecmascript',
-        'emma'        => 'application/emma+xml',
-        'epub'        => 'application/epub+zip',
-        'exi'         => 'application/exi',
-        'pfr'         => 'application/font-tdpfr',
-        'woff'        => 'application/font-woff',
-        'gml'         => 'application/gml+xml',
-        'gpx'         => 'application/gpx+xml',
-        'gxf'         => 'application/gxf',
-        'stk'         => 'application/hyperstudio',
-        'ink'         => 'application/inkml+xml',
-        'inkml'       => 'application/inkml+xml',
-        'ipfix'       => 'application/ipfix',
-        'jar'         => 'application/java-archive',
-        'ser'         => 'application/java-serialized-object',
-        'class'       => 'application/java-vm',
-        'js'          => 'application/javascript',
-        'json'        => 'application/json',
-        'jsonml'      => 'application/jsonml+json',
-        'lostxml'     => 'application/lost+xml',
-        'hqx'         => 'application/mac-binhex40',
-        'cpt'         => 'application/mac-compactpro',
-        'mads'        => 'application/mads+xml',
-        'mrc'         => 'application/marc',
-        'mrcx'        => 'application/marcxml+xml',
-        'ma'          => 'application/mathematica',
-        'nb'          => 'application/mathematica',
-        'mb'          => 'application/mathematica',
-        'mathml'      => 'application/mathml+xml',
-        'mbox'        => 'application/mbox',
-        'mscml'       => 'application/mediaservercontrol+xml',
-        'metalink'    => 'application/metalink+xml',
-        'meta4'       => 'application/metalink4+xml',
-        'mets'        => 'application/mets+xml',
-        'mods'        => 'application/mods+xml',
-        'm21'         => 'application/mp21',
-        'mp21'        => 'application/mp21',
-        'mp4s'        => 'application/mp4',
-        'doc'         => 'application/msword',
-        'dot'         => 'application/msword',
-        'mxf'         => 'application/mxf',
-        'bin'         => 'application/octet-stream',
-        'dms'         => 'application/octet-stream',
-        'lrf'         => 'application/octet-stream',
-        'mar'         => 'application/octet-stream',
-        'so'          => 'application/octet-stream',
-        'dist'        => 'application/octet-stream',
-        'distz'       => 'application/octet-stream',
-        'pkg'         => 'application/octet-stream',
-        'bpk'         => 'application/octet-stream',
-        'dump'        => 'application/octet-stream',
-        'elc'         => 'application/octet-stream',
-        'deploy'      => 'application/octet-stream',
-        'oda'         => 'application/oda',
-        'opf'         => 'application/oebps-package+xml',
-        'ogx'         => 'application/ogg',
-        'omdoc'       => 'application/omdoc+xml',
-        'onetoc'      => 'application/onenote',
-        'onetoc2'     => 'application/onenote',
-        'onetmp '     => 'application/onenote',
-        'onepkg'      => 'application/onenote',
-        'oxps'        => 'application/oxps',
-        'xer'         => 'application/patch-ops-error+xml',
-        'pdf'         => 'application/pdf',
-        'pgp'         => 'application/pgp-encrypted',
-        'asc'         => 'application/pgp-signature',
-        'sig'         => 'application/pgp-signature',
-        'prf'         => 'application/pics-rules',
-        'p10'         => 'application/pkcs10',
-        'p7m'         => 'application/pkcs7-mime',
-        'p7c'         => 'application/pkcs7-mime',
-        'p7s'         => 'application/pkcs7-signature',
-        'p8'          => 'application/pkcs8',
-        'ac'          => 'application/pkix-attr-cert',
-        'cer'         => 'application/pkix-cert',
-        'crl'         => 'application/pkix-crl',
-        'pkipath'     => 'application/pkix-pkipath',
-        'pki'         => 'application/pkixcmp',
-        'pls'         => 'application/pls+xml',
-        'ai'          => 'application/postscript',
-        'eps'         => 'application/postscript',
-        'ps'          => 'application/postscript',
-        'cww'         => 'application/prs.cww',
-        'pskcxml'     => 'application/pskc+xml',
-        'rdf'         => 'application/rdf+xml',
-        'rif'         => 'application/reginfo+xml',
-        'rnc'         => 'application/relax-ng-compact-syntax',
-        'rl'          => 'application/resource-lists+xml',
-        'rld'         => 'application/resource-lists-diff+xml',
-        'rs'          => 'application/rls-services+xml',
-        'gbr'         => 'application/rpki-ghostbusters',
-        'mft'         => 'application/rpki-manifest',
-        'roa'         => 'application/rpki-roa',
-        'rsd'         => 'application/rsd+xml',
-        'rss'         => 'application/rss+xml',
-        'rtf'         => 'application/rtf',
-        'sbml'        => 'application/sbml+xml',
-        'scq'         => 'application/scvp-cv-request',
-        'scs'         => 'application/scvp-cv-response',
-        'spq'         => 'application/scvp-vp-request',
-        'spp'         => 'application/scvp-vp-response',
-        'sdp'         => 'application/sdp',
-        'setpay'      => 'application/set-payment-initiation',
-        'setreg'      => 'application/set-registration-initiation',
-        'shf'         => 'application/shf+xml',
-        'smi'         => 'application/smil+xml',
-        'smil'        => 'application/smil+xml',
-        'rq'          => 'application/sparql-query',
-        'srx'         => 'application/sparql-results+xml',
-        'gram'        => 'application/srgs',
-        'grxml'       => 'application/srgs+xml',
-        'sru'         => 'application/sru+xml',
-        'ssdl'        => 'application/ssdl+xml',
-        'ssml'        => 'application/ssml+xml',
-        'tei'         => 'application/tei+xml',
-        'teicorpus'   => 'application/tei+xml',
-        'tfi'         => 'application/thraud+xml',
-        'tsd'         => 'application/timestamped-data',
-        'plb'         => 'application/vnd.3gpp.pic-bw-large',
-        'psb'         => 'application/vnd.3gpp.pic-bw-small',
-        'pvb'         => 'application/vnd.3gpp.pic-bw-var',
-        'tcap'        => 'application/vnd.3gpp2.tcap',
-        'pwn'         => 'application/vnd.3m.post-it-notes',
-        'aso'         => 'application/vnd.accpac.simply.aso',
-        'imp'         => 'application/vnd.accpac.simply.imp',
-        'acu'         => 'application/vnd.acucobol',
-        'atc'         => 'application/vnd.acucorp',
-        'acutc'       => 'application/vnd.acucorp',
-        'air'         => 'application/vnd.adobe.air-application-installer-package+zip',
-        'fcdt'        => 'application/vnd.adobe.formscentral.fcdt',
-        'fxp'         => 'application/vnd.adobe.fxp',
-        'fxpl'        => 'application/vnd.adobe.fxp',
-        'xdp'         => 'application/vnd.adobe.xdp+xml',
-        'xfdf'        => 'application/vnd.adobe.xfdf',
-        'ahead'       => 'application/vnd.ahead.space',
-        'azf'         => 'application/vnd.airzip.filesecure.azf',
-        'azs'         => 'application/vnd.airzip.filesecure.azs',
-        'azw'         => 'application/vnd.amazon.ebook',
-        'acc'         => 'application/vnd.americandynamics.acc',
-        'ami'         => 'application/vnd.amiga.ami',
-        'apk'         => 'application/vnd.android.package-archive',
-        'cii'         => 'application/vnd.anser-web-certificate-issue-initiation',
-        'fti'         => 'application/vnd.anser-web-funds-transfer-initiation',
-        'atx'         => 'application/vnd.antix.game-component',
-        'mpkg'        => 'application/vnd.apple.installer+xml',
-        'm3u8'        => 'application/vnd.apple.mpegurl',
-        'swi'         => 'application/vnd.aristanetworks.swi',
-        'iota'        => 'application/vnd.astraea-software.iota',
-        'aep'         => 'application/vnd.audiograph',
-        'mpm'         => 'application/vnd.blueice.multipass',
-        'bmi'         => 'application/vnd.bmi',
-        'rep'         => 'application/vnd.businessobjects',
-        'cdxml'       => 'application/vnd.chemdraw+xml',
-        'mmd'         => 'application/vnd.chipnuts.karaoke-mmd',
-        'cdy'         => 'application/vnd.cinderella',
-        'cla'         => 'application/vnd.claymore',
-        'rp9'         => 'application/vnd.cloanto.rp9',
-        'c4g'         => 'application/vnd.clonk.c4group',
-        'c4d'         => 'application/vnd.clonk.c4group',
-        'c4f'         => 'application/vnd.clonk.c4group',
-        'c4p'         => 'application/vnd.clonk.c4group',
-        'c4u'         => 'application/vnd.clonk.c4group',
-        'c11amc'      => 'application/vnd.cluetrust.cartomobile-config',
-        'c11amz'      => 'application/vnd.cluetrust.cartomobile-config-pkg',
-        'csp'         => 'application/vnd.commonspace',
-        'cdbcmsg'     => 'application/vnd.contact.cmsg',
-        'cmc'         => 'application/vnd.cosmocaller',
-        'clkx'        => 'application/vnd.crick.clicker',
-        'clkk'        => 'application/vnd.crick.clicker.keyboard',
-        'clkp'        => 'application/vnd.crick.clicker.palette',
-        'clkt'        => 'application/vnd.crick.clicker.template',
-        'clkw'        => 'application/vnd.crick.clicker.wordbank',
-        'wbs'         => 'application/vnd.criticaltools.wbs+xml',
-        'pml'         => 'application/vnd.ctc-posml',
-        'ppd'         => 'application/vnd.cups-ppd',
-        'car'         => 'application/vnd.curl.car',
-        'pcurl'       => 'application/vnd.curl.pcurl',
-        'dart'        => 'application/vnd.dart',
-        'rdz'         => 'application/vnd.data-vision.rdz',
-        'uvf'         => 'application/vnd.dece.data',
-        'uvvf'        => 'application/vnd.dece.data',
-        'uvd'         => 'application/vnd.dece.data',
-        'uvvd'        => 'application/vnd.dece.data',
-        'uvt'         => 'application/vnd.dece.ttml+xml',
-        'uvvt'        => 'application/vnd.dece.ttml+xml',
-        'uvx'         => 'application/vnd.dece.unspecified',
-        'uvvx'        => 'application/vnd.dece.unspecified',
-        'uvz'         => 'application/vnd.dece.zip',
-        'uvvz'        => 'application/vnd.dece.zip',
-        'fe_launch'   => 'application/vnd.denovo.fcselayout-link',
-        'dna'         => 'application/vnd.dna',
-        'mlp'         => 'application/vnd.dolby.mlp',
-        'dpg'         => 'application/vnd.dpgraph',
-        'dfac'        => 'application/vnd.dreamfactory',
-        'kpxx'        => 'application/vnd.ds-keypoint',
-        'ait'         => 'application/vnd.dvb.ait',
-        'svc'         => 'application/vnd.dvb.service',
-        'geo'         => 'application/vnd.dynageo',
-        'mag'         => 'application/vnd.ecowin.chart',
-        'nml'         => 'application/vnd.enliven',
-        'esf'         => 'application/vnd.epson.esf',
-        'msf'         => 'application/vnd.epson.msf',
-        'qam'         => 'application/vnd.epson.quickanime',
-        'slt'         => 'application/vnd.epson.salt',
-        'ssf'         => 'application/vnd.epson.ssf',
-        'es3'         => 'application/vnd.eszigno3+xml',
-        'et3'         => 'application/vnd.eszigno3+xml',
-        'ez2'         => 'application/vnd.ezpix-album',
-        'ez3'         => 'application/vnd.ezpix-package',
-        'fdf'         => 'application/vnd.fdf',
-        'mseed'       => 'application/vnd.fdsn.mseed',
-        'seed'        => 'application/vnd.fdsn.seed',
-        'dataless'    => 'application/vnd.fdsn.seed',
-        'gph'         => 'application/vnd.flographit',
-        'ftc'         => 'application/vnd.fluxtime.clip',
-        'fm'          => 'application/vnd.framemaker',
-        'frame'       => 'application/vnd.framemaker',
-        'maker'       => 'application/vnd.framemaker',
-        'book'        => 'application/vnd.framemaker',
-        'fnc'         => 'application/vnd.frogans.fnc',
-        'ltf'         => 'application/vnd.frogans.ltf',
-        'fsc'         => 'application/vnd.fsc.weblaunch',
-        'oas'         => 'application/vnd.fujitsu.oasys',
-        'oa2'         => 'application/vnd.fujitsu.oasys2',
-        'oa3'         => 'application/vnd.fujitsu.oasys3',
-        'fg5'         => 'application/vnd.fujitsu.oasysgp',
-        'bh2'         => 'application/vnd.fujitsu.oasysprs',
-        'ddd'         => 'application/vnd.fujixerox.ddd',
-        'xdw'         => 'application/vnd.fujixerox.docuworks',
-        'xbd'         => 'application/vnd.fujixerox.docuworks.binder',
-        'fzs'         => 'application/vnd.fuzzysheet',
-        'txd'         => 'application/vnd.genomatix.tuxedo',
-        'ggb'         => 'application/vnd.geogebra.file',
-        'ggt'         => 'application/vnd.geogebra.tool',
-        'gex'         => 'application/vnd.geometry-explorer',
-        'gre'         => 'application/vnd.geometry-explorer',
-        'gxt'         => 'application/vnd.geonext',
-        'g2w'         => 'application/vnd.geoplan',
-        'g3w'         => 'application/vnd.geospace',
-        'gmx'         => 'application/vnd.gmx',
-        'kml'         => 'application/vnd.google-earth.kml+xml',
-        'kmz'         => 'application/vnd.google-earth.kmz',
-        'gqf'         => 'application/vnd.grafeq',
-        'gqs'         => 'application/vnd.grafeq',
-        'gac'         => 'application/vnd.groove-account',
-        'ghf'         => 'application/vnd.groove-help',
-        'gim'         => 'application/vnd.groove-identity-message',
-        'grv'         => 'application/vnd.groove-injector',
-        'gtm'         => 'application/vnd.groove-tool-message',
-        'tpl'         => 'application/vnd.groove-tool-template',
-        'vcg'         => 'application/vnd.groove-vcard',
-        'hal'         => 'application/vnd.hal+xml',
-        'zmm'         => 'application/vnd.handheld-entertainment+xml',
-        'hbci'        => 'application/vnd.hbci',
-        'les'         => 'application/vnd.hhe.lesson-player',
-        'hpgl'        => 'application/vnd.hp-hpgl',
-        'hpid'        => 'application/vnd.hp-hpid',
-        'hps'         => 'application/vnd.hp-hps',
-        'jlt'         => 'application/vnd.hp-jlyt',
-        'pcl'         => 'application/vnd.hp-pcl',
-        'pclxl'       => 'application/vnd.hp-pclxl',
-        'sfd-hdstx'   => 'application/vnd.hydrostatix.sof-data',
-        'mpy'         => 'application/vnd.ibm.minipay',
-        'afp'         => 'application/vnd.ibm.modcap',
-        'listafp'     => 'application/vnd.ibm.modcap',
-        'list3820'    => 'application/vnd.ibm.modcap',
-        'irm'         => 'application/vnd.ibm.rights-management',
-        'sc'          => 'application/vnd.ibm.secure-container',
-        'icc'         => 'application/vnd.iccprofile',
-        'icm'         => 'application/vnd.iccprofile',
-        'igl'         => 'application/vnd.igloader',
-        'ivp'         => 'application/vnd.immervision-ivp',
-        'ivu'         => 'application/vnd.immervision-ivu',
-        'igm'         => 'application/vnd.insors.igm',
-        'xpw'         => 'application/vnd.intercon.formnet',
-        'xpx'         => 'application/vnd.intercon.formnet',
-        'i2g'         => 'application/vnd.intergeo',
-        'qbo'         => 'application/vnd.intu.qbo',
-        'qfx'         => 'application/vnd.intu.qfx',
-        'rcprofile'   => 'application/vnd.ipunplugged.rcprofile',
-        'irp'         => 'application/vnd.irepository.package+xml',
-        'xpr'         => 'application/vnd.is-xpr',
-        'fcs'         => 'application/vnd.isac.fcs',
-        'jam'         => 'application/vnd.jam',
-        'rms'         => 'application/vnd.jcp.javame.midlet-rms',
-        'jisp'        => 'application/vnd.jisp',
-        'joda'        => 'application/vnd.joost.joda-archive',
-        'ktz'         => 'application/vnd.kahootz',
-        'ktr'         => 'application/vnd.kahootz',
-        'karbon'      => 'application/vnd.kde.karbon',
-        'chrt'        => 'application/vnd.kde.kchart',
-        'kfo'         => 'application/vnd.kde.kformula',
-        'flw'         => 'application/vnd.kde.kivio',
-        'kon'         => 'application/vnd.kde.kontour',
-        'kpr'         => 'application/vnd.kde.kpresenter',
-        'kpt'         => 'application/vnd.kde.kpresenter',
-        'ksp'         => 'application/vnd.kde.kspread',
-        'kwd'         => 'application/vnd.kde.kword',
-        'kwt'         => 'application/vnd.kde.kword',
-        'htke'        => 'application/vnd.kenameaapp',
-        'kia'         => 'application/vnd.kidspiration',
-        'kne'         => 'application/vnd.kinar',
-        'knp'         => 'application/vnd.kinar',
-        'skp'         => 'application/vnd.koan',
-        'skd'         => 'application/vnd.koan',
-        'skt'         => 'application/vnd.koan',
-        'skm'         => 'application/vnd.koan',
-        'sse'         => 'application/vnd.kodak-descriptor',
-        'lasxml'      => 'application/vnd.las.las+xml',
-        'lbd'         => 'application/vnd.llamagraphics.life-balance.desktop',
-        'lbe'         => 'application/vnd.llamagraphics.life-balance.exchange+xml',
-        '123'         => 'application/vnd.lotus-1-2-3',
-        'apr'         => 'application/vnd.lotus-approach',
-        'pre'         => 'application/vnd.lotus-freelance',
-        'nsf'         => 'application/vnd.lotus-notes',
-        'org'         => 'application/vnd.lotus-organizer',
-        'scm'         => 'application/vnd.lotus-screencam',
-        'lwp'         => 'application/vnd.lotus-wordpro',
-        'portpkg'     => 'application/vnd.macports.portpkg',
-        'mcd'         => 'application/vnd.mcd',
-        'mc1'         => 'application/vnd.medcalcdata',
-        'cdkey'       => 'application/vnd.mediastation.cdkey',
-        'mwf'         => 'application/vnd.mfer',
-        'mfm'         => 'application/vnd.mfmp',
-        'flo'         => 'application/vnd.micrografx.flo',
-        'igx'         => 'application/vnd.micrografx.igx',
-        'mif'         => 'application/vnd.mif',
-        'daf'         => 'application/vnd.mobius.daf',
-        'dis'         => 'application/vnd.mobius.dis',
-        'mbk'         => 'application/vnd.mobius.mbk',
-        'mqy'         => 'application/vnd.mobius.mqy',
-        'msl'         => 'application/vnd.mobius.msl',
-        'plc'         => 'application/vnd.mobius.plc',
-        'txf'         => 'application/vnd.mobius.txf',
-        'mpn'         => 'application/vnd.mophun.application',
-        'mpc'         => 'application/vnd.mophun.certificate',
-        'xul'         => 'application/vnd.mozilla.xul+xml',
-        'cil'         => 'application/vnd.ms-artgalry',
-        'cab'         => 'application/vnd.ms-cab-compressed',
-        'xls'         => 'application/vnd.ms-excel',
-        'xlm'         => 'application/vnd.ms-excel',
-        'xla'         => 'application/vnd.ms-excel',
-        'xlc'         => 'application/vnd.ms-excel',
-        'xlt'         => 'application/vnd.ms-excel',
-        'xlw'         => 'application/vnd.ms-excel',
-        'xlam'        => 'application/vnd.ms-excel.addin.macroenabled.12',
-        'xlsb'        => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
-        'xlsm'        => 'application/vnd.ms-excel.sheet.macroenabled.12',
-        'xltm'        => 'application/vnd.ms-excel.template.macroenabled.12',
-        'eot'         => 'application/vnd.ms-fontobject',
-        'chm'         => 'application/vnd.ms-htmlhelp',
-        'ims'         => 'application/vnd.ms-ims',
-        'lrm'         => 'application/vnd.ms-lrm',
-        'thmx'        => 'application/vnd.ms-officetheme',
-        'cat'         => 'application/vnd.ms-pki.seccat',
-        'stl'         => 'application/vnd.ms-pki.stl',
-        'ppt'         => 'application/vnd.ms-powerpoint',
-        'pps'         => 'application/vnd.ms-powerpoint',
-        'pot'         => 'application/vnd.ms-powerpoint',
-        'ppam'        => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
-        'pptm'        => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
-        'sldm'        => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
-        'ppsm'        => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
-        'potm'        => 'application/vnd.ms-powerpoint.template.macroenabled.12',
-        'mpp'         => 'application/vnd.ms-project',
-        'mpt'         => 'application/vnd.ms-project',
-        'docm'        => 'application/vnd.ms-word.document.macroenabled.12',
-        'dotm'        => 'application/vnd.ms-word.template.macroenabled.12',
-        'wps'         => 'application/vnd.ms-works',
-        'wks'         => 'application/vnd.ms-works',
-        'wcm'         => 'application/vnd.ms-works',
-        'wdb'         => 'application/vnd.ms-works',
-        'wpl'         => 'application/vnd.ms-wpl',
-        'xps'         => 'application/vnd.ms-xpsdocument',
-        'mseq'        => 'application/vnd.mseq',
-        'mus'         => 'application/vnd.musician',
-        'msty'        => 'application/vnd.muvee.style',
-        'taglet'      => 'application/vnd.mynfc',
-        'nlu'         => 'application/vnd.neurolanguage.nlu',
-        'ntf'         => 'application/vnd.nitf',
-        'nitf'        => 'application/vnd.nitf',
-        'nnd'         => 'application/vnd.noblenet-directory',
-        'nns'         => 'application/vnd.noblenet-sealer',
-        'nnw'         => 'application/vnd.noblenet-web',
-        'ngdat'       => 'application/vnd.nokia.n-gage.data',
-        'n-gage'      => 'application/vnd.nokia.n-gage.symbian.install',
-        'rpst'        => 'application/vnd.nokia.radio-preset',
-        'rpss'        => 'application/vnd.nokia.radio-presets',
-        'edm'         => 'application/vnd.novadigm.edm',
-        'edx'         => 'application/vnd.novadigm.edx',
-        'ext'         => 'application/vnd.novadigm.ext',
-        'odc'         => 'application/vnd.oasis.opendocument.chart',
-        'otc'         => 'application/vnd.oasis.opendocument.chart-template',
-        'odb'         => 'application/vnd.oasis.opendocument.database',
-        'odf'         => 'application/vnd.oasis.opendocument.formula',
-        'odft'        => 'application/vnd.oasis.opendocument.formula-template',
-        'odg'         => 'application/vnd.oasis.opendocument.graphics',
-        'otg'         => 'application/vnd.oasis.opendocument.graphics-template',
-        'odi'         => 'application/vnd.oasis.opendocument.image',
-        'oti'         => 'application/vnd.oasis.opendocument.image-template',
-        'odp'         => 'application/vnd.oasis.opendocument.presentation',
-        'otp'         => 'application/vnd.oasis.opendocument.presentation-template',
-        'ods'         => 'application/vnd.oasis.opendocument.spreadsheet',
-        'ots'         => 'application/vnd.oasis.opendocument.spreadsheet-template',
-        'odt'         => 'application/vnd.oasis.opendocument.text',
-        'odm'         => 'application/vnd.oasis.opendocument.text-master',
-        'ott'         => 'application/vnd.oasis.opendocument.text-template',
-        'oth'         => 'application/vnd.oasis.opendocument.text-web',
-        'xo'          => 'application/vnd.olpc-sugar',
-        'dd2'         => 'application/vnd.oma.dd2+xml',
-        'oxt'         => 'application/vnd.openofficeorg.extension',
-        'pptx'        => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
-        'sldx'        => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
-        'ppsx'        => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
-        'potx'        => 'application/vnd.openxmlformats-officedocument.presentationml.template',
-        'xlsx'        => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
-        'xltx'        => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
-        'docx'        => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
-        'dotx'        => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
-        'mgp'         => 'application/vnd.osgeo.mapguide.package',
-        'dp'          => 'application/vnd.osgi.dp',
-        'esa'         => 'application/vnd.osgi.subsystem',
-        'pdb'         => 'application/vnd.palm',
-        'pqa'         => 'application/vnd.palm',
-        'oprc'        => 'application/vnd.palm',
-        'paw'         => 'application/vnd.pawaafile',
-        'str'         => 'application/vnd.pg.format',
-        'ei6'         => 'application/vnd.pg.osasli',
-        'efif'        => 'application/vnd.picsel',
-        'wg'          => 'application/vnd.pmi.widget',
-        'plf'         => 'application/vnd.pocketlearn',
-        'pbd'         => 'application/vnd.powerbuilder6',
-        'box'         => 'application/vnd.previewsystems.box',
-        'mgz'         => 'application/vnd.proteus.magazine',
-        'qps'         => 'application/vnd.publishare-delta-tree',
-        'ptid'        => 'application/vnd.pvi.ptid1',
-        'qxd'         => 'application/vnd.quark.quarkxpress',
-        'qxt'         => 'application/vnd.quark.quarkxpress',
-        'qwd'         => 'application/vnd.quark.quarkxpress',
-        'qwt'         => 'application/vnd.quark.quarkxpress',
-        'qxl'         => 'application/vnd.quark.quarkxpress',
-        'qxb'         => 'application/vnd.quark.quarkxpress',
-        'bed'         => 'application/vnd.realvnc.bed',
-        'mxl'         => 'application/vnd.recordare.musicxml',
-        'musicxml'    => 'application/vnd.recordare.musicxml+xml',
-        'cryptonote'  => 'application/vnd.rig.cryptonote',
-        'cod'         => 'application/vnd.rim.cod',
-        'rm'          => 'application/vnd.rn-realmedia',
-        'rmvb'        => 'application/vnd.rn-realmedia-vbr',
-        'link66'      => 'application/vnd.route66.link66+xml',
-        'st'          => 'application/vnd.sailingtracker.track',
-        'see'         => 'application/vnd.seemail',
-        'sema'        => 'application/vnd.sema',
-        'semd'        => 'application/vnd.semd',
-        'semf'        => 'application/vnd.semf',
-        'ifm'         => 'application/vnd.shana.informed.formdata',
-        'itp'         => 'application/vnd.shana.informed.formtemplate',
-        'iif'         => 'application/vnd.shana.informed.interchange',
-        'ipk'         => 'application/vnd.shana.informed.package',
-        'twd'         => 'application/vnd.simtech-mindmapper',
-        'twds'        => 'application/vnd.simtech-mindmapper',
-        'mmf'         => 'application/vnd.smaf',
-        'teacher'     => 'application/vnd.smart.teacher',
-        'sdkm'        => 'application/vnd.solent.sdkm+xml',
-        'sdkd'        => 'application/vnd.solent.sdkm+xml',
-        'dxp'         => 'application/vnd.spotfire.dxp',
-        'sfs'         => 'application/vnd.spotfire.sfs',
-        'sdc'         => 'application/vnd.stardivision.calc',
-        'sda'         => 'application/vnd.stardivision.draw',
-        'sdd'         => 'application/vnd.stardivision.impress',
-        'smf'         => 'application/vnd.stardivision.math',
-        'sdw'         => 'application/vnd.stardivision.writer',
-        'vor'         => 'application/vnd.stardivision.writer',
-        'sgl'         => 'application/vnd.stardivision.writer-global',
-        'smzip'       => 'application/vnd.stepmania.package',
-        'sm'          => 'application/vnd.stepmania.stepchart',
-        'sxc'         => 'application/vnd.sun.xml.calc',
-        'stc'         => 'application/vnd.sun.xml.calc.template',
-        'sxd'         => 'application/vnd.sun.xml.draw',
-        'std'         => 'application/vnd.sun.xml.draw.template',
-        'sxi'         => 'application/vnd.sun.xml.impress',
-        'sti'         => 'application/vnd.sun.xml.impress.template',
-        'sxm'         => 'application/vnd.sun.xml.math',
-        'sxw'         => 'application/vnd.sun.xml.writer',
-        'sxg'         => 'application/vnd.sun.xml.writer.global',
-        'stw'         => 'application/vnd.sun.xml.writer.template',
-        'sus'         => 'application/vnd.sus-calendar',
-        'susp'        => 'application/vnd.sus-calendar',
-        'svd'         => 'application/vnd.svd',
-        'sis'         => 'application/vnd.symbian.install',
-        'sisx'        => 'application/vnd.symbian.install',
-        'xsm'         => 'application/vnd.syncml+xml',
-        'bdm'         => 'application/vnd.syncml.dm+wbxml',
-        'xdm'         => 'application/vnd.syncml.dm+xml',
-        'tao'         => 'application/vnd.tao.intent-module-archive',
-        'pcap'        => 'application/vnd.tcpdump.pcap',
-        'cap'         => 'application/vnd.tcpdump.pcap',
-        'dmp'         => 'application/vnd.tcpdump.pcap',
-        'tmo'         => 'application/vnd.tmobile-livetv',
-        'tpt'         => 'application/vnd.trid.tpt',
-        'mxs'         => 'application/vnd.triscape.mxs',
-        'tra'         => 'application/vnd.trueapp',
-        'ufd'         => 'application/vnd.ufdl',
-        'ufdl'        => 'application/vnd.ufdl',
-        'utz'         => 'application/vnd.uiq.theme',
-        'umj'         => 'application/vnd.umajin',
-        'unityweb'    => 'application/vnd.unity',
-        'uoml'        => 'application/vnd.uoml+xml',
-        'vcx'         => 'application/vnd.vcx',
-        'vsd'         => 'application/vnd.visio',
-        'vst'         => 'application/vnd.visio',
-        'vss'         => 'application/vnd.visio',
-        'vsw'         => 'application/vnd.visio',
-        'vis'         => 'application/vnd.visionary',
-        'vsf'         => 'application/vnd.vsf',
-        'wbxml'       => 'application/vnd.wap.wbxml',
-        'wmlc'        => 'application/vnd.wap.wmlc',
-        'wmlsc'       => 'application/vnd.wap.wmlscriptc',
-        'wtb'         => 'application/vnd.webturbo',
-        'nbp'         => 'application/vnd.wolfram.player',
-        'wpd'         => 'application/vnd.wordperfect',
-        'wqd'         => 'application/vnd.wqd',
-        'stf'         => 'application/vnd.wt.stf',
-        'xar'         => 'application/vnd.xara',
-        'xfdl'        => 'application/vnd.xfdl',
-        'hvd'         => 'application/vnd.yamaha.hv-dic',
-        'hvs'         => 'application/vnd.yamaha.hv-script',
-        'hvp'         => 'application/vnd.yamaha.hv-voice',
-        'osf'         => 'application/vnd.yamaha.openscoreformat',
-        'osfpvg'      => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
-        'saf'         => 'application/vnd.yamaha.smaf-audio',
-        'spf'         => 'application/vnd.yamaha.smaf-phrase',
-        'cmp'         => 'application/vnd.yellowriver-custom-menu',
-        'zir'         => 'application/vnd.zul',
-        'zirz'        => 'application/vnd.zul',
-        'zaz'         => 'application/vnd.zzazz.deck+xml',
-        'vxml'        => 'application/voicexml+xml',
-        'wgt'         => 'application/widget',
-        'hlp'         => 'application/winhlp',
-        'wsdl'        => 'application/wsdl+xml',
-        'wspolicy'    => 'application/wspolicy+xml',
-        '7z'          => 'application/x-7z-compressed',
-        'abw'         => 'application/x-abiword',
-        'ace'         => 'application/x-ace-compressed',
-        'dmg'         => 'application/x-apple-diskimage',
-        'aab'         => 'application/x-authorware-bin',
-        'x32'         => 'application/x-authorware-bin',
-        'u32'         => 'application/x-authorware-bin',
-        'vox'         => 'application/x-authorware-bin',
-        'aam'         => 'application/x-authorware-map',
-        'aas'         => 'application/x-authorware-seg',
-        'bcpio'       => 'application/x-bcpio',
-        'torrent'     => 'application/x-bittorrent',
-        'blb'         => 'application/x-blorb',
-        'blorb'       => 'application/x-blorb',
-        'bz'          => 'application/x-bzip',
-        'bz2'         => 'application/x-bzip2',
-        'boz'         => 'application/x-bzip2',
-        'cbr'         => 'application/x-cbr',
-        'cba'         => 'application/x-cbr',
-        'cbt'         => 'application/x-cbr',
-        'cbz'         => 'application/x-cbr',
-        'cb7'         => 'application/x-cbr',
-        'vcd'         => 'application/x-cdlink',
-        'cfs'         => 'application/x-cfs-compressed',
-        'chat'        => 'application/x-chat',
-        'pgn'         => 'application/x-chess-pgn',
-        'nsc'         => 'application/x-conference',
-        'cpio'        => 'application/x-cpio',
-        'csh'         => 'application/x-csh',
-        'deb'         => 'application/x-debian-package',
-        'udeb'        => 'application/x-debian-package',
-        'dgc'         => 'application/x-dgc-compressed',
-        'dir'         => 'application/x-director',
-        'dcr'         => 'application/x-director',
-        'dxr'         => 'application/x-director',
-        'cst'         => 'application/x-director',
-        'cct'         => 'application/x-director',
-        'cxt'         => 'application/x-director',
-        'w3d'         => 'application/x-director',
-        'fgd'         => 'application/x-director',
-        'swa'         => 'application/x-director',
-        'wad'         => 'application/x-doom',
-        'ncx'         => 'application/x-dtbncx+xml',
-        'dtb'         => 'application/x-dtbook+xml',
-        'res'         => 'application/x-dtbresource+xml',
-        'dvi'         => 'application/x-dvi',
-        'evy'         => 'application/x-envoy',
-        'eva'         => 'application/x-eva',
-        'bdf'         => 'application/x-font-bdf',
-        'gsf'         => 'application/x-font-ghostscript',
-        'psf'         => 'application/x-font-linux-psf',
-        'otf'         => 'application/x-font-otf',
-        'pcf'         => 'application/x-font-pcf',
-        'snf'         => 'application/x-font-snf',
-        'ttf'         => 'application/x-font-ttf',
-        'ttc'         => 'application/x-font-ttf',
-        'pfa'         => 'application/x-font-type1',
-        'pfb'         => 'application/x-font-type1',
-        'pfm'         => 'application/x-font-type1',
-        'afm'         => 'application/x-font-type1',
-        'arc'         => 'application/x-freearc',
-        'spl'         => 'application/x-futuresplash',
-        'gca'         => 'application/x-gca-compressed',
-        'ulx'         => 'application/x-glulx',
-        'gnumeric'    => 'application/x-gnumeric',
-        'gramps'      => 'application/x-gramps-xml',
-        'gtar'        => 'application/x-gtar',
-        'hdf'         => 'application/x-hdf',
-        'install'     => 'application/x-install-instructions',
-        'iso'         => 'application/x-iso9660-image',
-        'jnlp'        => 'application/x-java-jnlp-file',
-        'latex'       => 'application/x-latex',
-        'lzh'         => 'application/x-lzh-compressed',
-        'lha'         => 'application/x-lzh-compressed',
-        'mie'         => 'application/x-mie',
-        'prc'         => 'application/x-mobipocket-ebook',
-        'mobi'        => 'application/x-mobipocket-ebook',
-        'application' => 'application/x-ms-application',
-        'lnk'         => 'application/x-ms-shortcut',
-        'wmd'         => 'application/x-ms-wmd',
-        'wmz'         => 'application/x-ms-wmz',
-        'xbap'        => 'application/x-ms-xbap',
-        'mdb'         => 'application/x-msaccess',
-        'obd'         => 'application/x-msbinder',
-        'crd'         => 'application/x-mscardfile',
-        'clp'         => 'application/x-msclip',
-        'exe'         => 'application/x-msdownload',
-        'dll'         => 'application/x-msdownload',
-        'com'         => 'application/x-msdownload',
-        'bat'         => 'application/x-msdownload',
-        'msi'         => 'application/x-msdownload',
-        'mvb'         => 'application/x-msmediaview',
-        'm13'         => 'application/x-msmediaview',
-        'm14'         => 'application/x-msmediaview',
-        'wmf'         => 'application/x-msmetafile',
-        'emf'         => 'application/x-msmetafile',
-        'emz'         => 'application/x-msmetafile',
-        'mny'         => 'application/x-msmoney',
-        'pub'         => 'application/x-mspublisher',
-        'scd'         => 'application/x-msschedule',
-        'trm'         => 'application/x-msterminal',
-        'wri'         => 'application/x-mswrite',
-        'nc'          => 'application/x-netcdf',
-        'cdf'         => 'application/x-netcdf',
-        'nzb'         => 'application/x-nzb',
-        'p12'         => 'application/x-pkcs12',
-        'pfx'         => 'application/x-pkcs12',
-        'p7b'         => 'application/x-pkcs7-certificates',
-        'spc'         => 'application/x-pkcs7-certificates',
-        'p7r'         => 'application/x-pkcs7-certreqresp',
-        'rar'         => 'application/x-rar-compressed',
-        'ris'         => 'application/x-research-info-systems',
-        'sh'          => 'application/x-sh',
-        'shar'        => 'application/x-shar',
-        'swf'         => 'application/x-shockwave-flash',
-        'xap'         => 'application/x-silverlight-app',
-        'sql'         => 'application/x-sql',
-        'sit'         => 'application/x-stuffit',
-        'sitx'        => 'application/x-stuffitx',
-        'srt'         => 'application/x-subrip',
-        'sv4cpio'     => 'application/x-sv4cpio',
-        'sv4crc'      => 'application/x-sv4crc',
-        't3'          => 'application/x-t3vm-image',
-        'gam'         => 'application/x-tads',
-        'tar'         => 'application/x-tar',
-        'tcl'         => 'application/x-tcl',
-        'tex'         => 'application/x-tex',
-        'tfm'         => 'application/x-tex-tfm',
-        'texinfo'     => 'application/x-texinfo',
-        'texi'        => 'application/x-texinfo',
-        'obj'         => 'application/x-tgif',
-        'ustar'       => 'application/x-ustar',
-        'src'         => 'application/x-wais-source',
-        'der'         => 'application/x-x509-ca-cert',
-        'crt'         => 'application/x-x509-ca-cert',
-        'fig'         => 'application/x-xfig',
-        'xlf'         => 'application/x-xliff+xml',
-        'xpi'         => 'application/x-xpinstall',
-        'xz'          => 'application/x-xz',
-        'z1'          => 'application/x-zmachine',
-        'z2'          => 'application/x-zmachine',
-        'z3'          => 'application/x-zmachine',
-        'z4'          => 'application/x-zmachine',
-        'z5'          => 'application/x-zmachine',
-        'z6'          => 'application/x-zmachine',
-        'z7'          => 'application/x-zmachine',
-        'z8'          => 'application/x-zmachine',
-        'xaml'        => 'application/xaml+xml',
-        'xdf'         => 'application/xcap-diff+xml',
-        'xenc'        => 'application/xenc+xml',
-        'xhtml'       => 'application/xhtml+xml',
-        'xht'         => 'application/xhtml+xml',
-        'xml'         => 'application/xml',
-        'xsl'         => 'application/xml',
-        'dtd'         => 'application/xml-dtd',
-        'xop'         => 'application/xop+xml',
-        'xpl'         => 'application/xproc+xml',
-        'xslt'        => 'application/xslt+xml',
-        'xspf'        => 'application/xspf+xml',
-        'mxml'        => 'application/xv+xml',
-        'xhvml'       => 'application/xv+xml',
-        'xvml'        => 'application/xv+xml',
-        'xvm'         => 'application/xv+xml',
-        'yang'        => 'application/yang',
-        'yin'         => 'application/yin+xml',
-        'zip'         => 'application/zip',
-        'adp'         => 'audio/adpcm',
-        'au'          => 'audio/basic',
-        'snd'         => 'audio/basic',
-        'mid'         => 'audio/midi',
-        'midi'        => 'audio/midi',
-        'kar'         => 'audio/midi',
-        'rmi'         => 'audio/midi',
-        'm4a'         => 'audio/mp4',
-        'mp4a'        => 'audio/mp4',
-        'mpga'        => 'audio/mpeg',
-        'mp2'         => 'audio/mpeg',
-        'mp2a'        => 'audio/mpeg',
-        'mp3'         => 'audio/mpeg',
-        'm2a'         => 'audio/mpeg',
-        'm3a'         => 'audio/mpeg',
-        'oga'         => 'audio/ogg',
-        'ogg'         => 'audio/ogg',
-        'spx'         => 'audio/ogg',
-        's3m'         => 'audio/s3m',
-        'sil'         => 'audio/silk',
-        'eol'         => 'audio/vnd.digital-winds',
-        'dra'         => 'audio/vnd.dra',
-        'dts'         => 'audio/vnd.dts',
-        'dtshd'       => 'audio/vnd.dts.hd',
-        'lvp'         => 'audio/vnd.lucent.voice',
-        'pya'         => 'audio/vnd.ms-playready.media.pya',
-        'ecelp4800'   => 'audio/vnd.nuera.ecelp4800',
-        'ecelp7470'   => 'audio/vnd.nuera.ecelp7470',
-        'ecelp9600'   => 'audio/vnd.nuera.ecelp9600',
-        'rip'         => 'audio/vnd.rip',
-        'weba'        => 'audio/webm',
-        'aac'         => 'audio/x-aac',
-        'aif'         => 'audio/x-aiff',
-        'aiff'        => 'audio/x-aiff',
-        'aifc'        => 'audio/x-aiff',
-        'caf'         => 'audio/x-caf',
-        'flac'        => 'audio/x-flac',
-        'mka'         => 'audio/x-matroska',
-        'm3u'         => 'audio/x-mpegurl',
-        'wax'         => 'audio/x-ms-wax',
-        'wma'         => 'audio/x-ms-wma',
-        'ram'         => 'audio/x-pn-realaudio',
-        'ra'          => 'audio/x-pn-realaudio',
-        'rmp'         => 'audio/x-pn-realaudio-plugin',
-        'wav'         => 'audio/x-wav',
-        'xm'          => 'audio/xm',
-        'cdx'         => 'chemical/x-cdx',
-        'cif'         => 'chemical/x-cif',
-        'cmdf'        => 'chemical/x-cmdf',
-        'cml'         => 'chemical/x-cml',
-        'csml'        => 'chemical/x-csml',
-        'xyz'         => 'chemical/x-xyz',
-        'bmp'         => 'image/bmp',
-        'cgm'         => 'image/cgm',
-        'g3'          => 'image/g3fax',
-        'gif'         => 'image/gif',
-        'ief'         => 'image/ief',
-        'jpeg'        => 'image/jpeg',
-        'jpg'         => 'image/jpeg',
-        'jpe'         => 'image/jpeg',
-        'ktx'         => 'image/ktx',
-        'png'         => 'image/png',
-        'btif'        => 'image/prs.btif',
-        'sgi'         => 'image/sgi',
-        'svg'         => 'image/svg+xml',
-        'svgz'        => 'image/svg+xml',
-        'tiff'        => 'image/tiff',
-        'tif'         => 'image/tiff',
-        'psd'         => 'image/vnd.adobe.photoshop',
-        'uvi'         => 'image/vnd.dece.graphic',
-        'uvvi'        => 'image/vnd.dece.graphic',
-        'uvg'         => 'image/vnd.dece.graphic',
-        'uvvg'        => 'image/vnd.dece.graphic',
-        'djvu'        => 'image/vnd.djvu',
-        'djv'         => 'image/vnd.djvu',
-        'sub'         => 'image/vnd.dvb.subtitle',
-        'dwg'         => 'image/vnd.dwg',
-        'dxf'         => 'image/vnd.dxf',
-        'fbs'         => 'image/vnd.fastbidsheet',
-        'fpx'         => 'image/vnd.fpx',
-        'fst'         => 'image/vnd.fst',
-        'mmr'         => 'image/vnd.fujixerox.edmics-mmr',
-        'rlc'         => 'image/vnd.fujixerox.edmics-rlc',
-        'mdi'         => 'image/vnd.ms-modi',
-        'wdp'         => 'image/vnd.ms-photo',
-        'npx'         => 'image/vnd.net-fpx',
-        'wbmp'        => 'image/vnd.wap.wbmp',
-        'xif'         => 'image/vnd.xiff',
-        'webp'        => 'image/webp',
-        '3ds'         => 'image/x-3ds',
-        'ras'         => 'image/x-cmu-raster',
-        'cmx'         => 'image/x-cmx',
-        'fh'          => 'image/x-freehand',
-        'fhc'         => 'image/x-freehand',
-        'fh4'         => 'image/x-freehand',
-        'fh5'         => 'image/x-freehand',
-        'fh7'         => 'image/x-freehand',
-        'ico'         => 'image/x-icon',
-        'sid'         => 'image/x-mrsid-image',
-        'pcx'         => 'image/x-pcx',
-        'pic'         => 'image/x-pict',
-        'pct'         => 'image/x-pict',
-        'pnm'         => 'image/x-portable-anymap',
-        'pbm'         => 'image/x-portable-bitmap',
-        'pgm'         => 'image/x-portable-graymap',
-        'ppm'         => 'image/x-portable-pixmap',
-        'rgb'         => 'image/x-rgb',
-        'tga'         => 'image/x-tga',
-        'xbm'         => 'image/x-xbitmap',
-        'xpm'         => 'image/x-xpixmap',
-        'xwd'         => 'image/x-xwindowdump',
-        'eml'         => 'message/rfc822',
-        'mime'        => 'message/rfc822',
-        'igs'         => 'model/iges',
-        'iges'        => 'model/iges',
-        'msh'         => 'model/mesh',
-        'mesh'        => 'model/mesh',
-        'silo'        => 'model/mesh',
-        'dae'         => 'model/vnd.collada+xml',
-        'dwf'         => 'model/vnd.dwf',
-        'gdl'         => 'model/vnd.gdl',
-        'gtw'         => 'model/vnd.gtw',
-        'mts'         => 'model/vnd.mts',
-        'vtu'         => 'model/vnd.vtu',
-        'wrl'         => 'model/vrml',
-        'vrml'        => 'model/vrml',
-        'x3db'        => 'model/x3d+binary',
-        'x3dbz'       => 'model/x3d+binary',
-        'x3dv'        => 'model/x3d+vrml',
-        'x3dvz'       => 'model/x3d+vrml',
-        'x3d'         => 'model/x3d+xml',
-        'x3dz'        => 'model/x3d+xml',
-        'appcache'    => 'text/cache-manifest',
-        'ics'         => 'text/calendar',
-        'ifb'         => 'text/calendar',
-        'css'         => 'text/css',
-        'csv'         => 'text/csv',
-        'html'        => 'text/html',
-        'htm'         => 'text/html',
-        'n3'          => 'text/n3',
-        'txt'         => 'text/plain',
-        'text'        => 'text/plain',
-        'conf'        => 'text/plain',
-        'def'         => 'text/plain',
-        'list'        => 'text/plain',
-        'log'         => 'text/plain',
-        'in'          => 'text/plain',
-        'dsc'         => 'text/prs.lines.tag',
-        'rtx'         => 'text/richtext',
-        'sgml'        => 'text/sgml',
-        'sgm'         => 'text/sgml',
-        'tsv'         => 'text/tab-separated-values',
-        't'           => 'text/troff',
-        'tr'          => 'text/troff',
-        'roff'        => 'text/troff',
-        'man'         => 'text/troff',
-        'me'          => 'text/troff',
-        'ms'          => 'text/troff',
-        'ttl'         => 'text/turtle',
-        'uri'         => 'text/uri-list',
-        'uris'        => 'text/uri-list',
-        'urls'        => 'text/uri-list',
-        'vcard'       => 'text/vcard',
-        'curl'        => 'text/vnd.curl',
-        'dcurl'       => 'text/vnd.curl.dcurl',
-        'mcurl'       => 'text/vnd.curl.mcurl',
-        'scurl'       => 'text/vnd.curl.scurl',
-        'fly'         => 'text/vnd.fly',
-        'flx'         => 'text/vnd.fmi.flexstor',
-        'gv'          => 'text/vnd.graphviz',
-        '3dml'        => 'text/vnd.in3d.3dml',
-        'spot'        => 'text/vnd.in3d.spot',
-        'jad'         => 'text/vnd.sun.j2me.app-descriptor',
-        'wml'         => 'text/vnd.wap.wml',
-        'wmls'        => 'text/vnd.wap.wmlscript',
-        's'           => 'text/x-asm',
-        'asm'         => 'text/x-asm',
-        'c'           => 'text/x-c',
-        'ccxx'        => 'text/x-c',
-        'cpp'         => 'text/x-c',
-        'h'           => 'text/x-c',
-        'hh'          => 'text/x-c',
-        'dic'         => 'text/x-c',
-        'f'           => 'text/x-fortran',
-        'for'         => 'text/x-fortran',
-        'f77'         => 'text/x-fortran',
-        'f90'         => 'text/x-fortran',
-        'java'        => 'text/x-java-source',
-        'nfo'         => 'text/x-nfo',
-        'opml'        => 'text/x-opml',
-        'p'           => 'text/x-pascal',
-        'pas'         => 'text/x-pascal',
-        'etx'         => 'text/x-setext',
-        'sfv'         => 'text/x-sfv',
-        'uu'          => 'text/x-uuencode',
-        'vcs'         => 'text/x-vcalendar',
-        'vcf'         => 'text/x-vcard',
-        '3gp'         => 'video/3gpp',
-        '3g2'         => 'video/3gpp2',
-        'h261'        => 'video/h261',
-        'h263'        => 'video/h263',
-        'h264'        => 'video/h264',
-        'jpgv'        => 'video/jpeg',
-        'jpm'         => 'video/jpm',
-        'jpgm'        => 'video/jpm',
-        'mj2'         => 'video/mj2',
-        'mjp2'        => 'video/mj2',
-        'mp4'         => 'video/mp4',
-        'mp4v'        => 'video/mp4',
-        'mpg4'        => 'video/mp4',
-        'mpeg'        => 'video/mpeg',
-        'mpg'         => 'video/mpeg',
-        'mpe'         => 'video/mpeg',
-        'm1v'         => 'video/mpeg',
-        'm2v'         => 'video/mpeg',
-        'ogv'         => 'video/ogg',
-        'uvh'         => 'video/vnd.dece.hd',
-        'uvvh'        => 'video/vnd.dece.hd',
-        'uvm'         => 'video/vnd.dece.mobile',
-        'uvvm'        => 'video/vnd.dece.mobile',
-        'uvp'         => 'video/vnd.dece.pd',
-        'uvvp'        => 'video/vnd.dece.pd',
-        'uvs'         => 'video/vnd.dece.sd',
-        'uvvs'        => 'video/vnd.dece.sd',
-        'dvb'         => 'video/vnd.dvb.file',
-        'mxu'         => 'video/vnd.mpegurl',
-        'm4u'         => 'video/vnd.mpegurl',
-        'uvu'         => 'video/vnd.uvvu.mp4',
-        'uvvu'        => 'video/vnd.uvvu.mp4',
-        'viv'         => 'video/vnd.vivo',
-        'webm'        => 'video/webm',
-        'f4v'         => 'video/x-f4v',
-        'fli'         => 'video/x-fli',
-        'flv'         => 'video/x-flv',
-        'm4v'         => 'video/x-m4v',
-        'mkv'         => 'video/x-matroska',
-        'mk3d'        => 'video/x-matroska',
-        'mks'         => 'video/x-matroska',
-        'mng'         => 'video/x-mng',
-        'asf'         => 'video/x-ms-asf',
-        'asx'         => 'video/x-ms-asf',
-        'vob'         => 'video/x-ms-vob',
-        'wm'          => 'video/x-ms-wm',
-        'wmv'         => 'video/x-ms-wmv',
-        'wmx'         => 'video/x-ms-wmx',
-        'wvx'         => 'video/x-ms-wvx',
-        'avi'         => 'video/x-msvideo',
-        'movie'       => 'video/x-sgi-movie',
-        'smv'         => 'video/x-smv',
-        'ice'         => 'x-conference/x-cooltalk',
-    ];
-}
\ No newline at end of file
diff --git a/civicrm/vendor/katzien/php-mime-type/src/MimeType.php b/civicrm/vendor/katzien/php-mime-type/src/MimeType.php
deleted file mode 100644
index 67be540f63..0000000000
--- a/civicrm/vendor/katzien/php-mime-type/src/MimeType.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace MimeType;
-
-class MimeType
-{
-    const DEFAULT_MIME_TYPE = 'application/octet-stream';
-
-    /**
-     * @param $filename
-     * @return string
-     * @throws \Exception
-     */
-    public static function getType($filename)
-    {
-        self::validateFilename($filename);
-
-        $pathInfo = pathinfo($filename);
-
-        $extension = isset($pathInfo['extension']) ? strtolower($pathInfo['extension']) : '';
-
-        return self::findType($extension);
-    }
-
-    /**
-     * @param $filename
-     * @throws \Exception
-     */
-    private static function validateFilename($filename)
-    {
-        if (!is_string($filename)) {
-            throw new \Exception('Filename not a string');
-        }
-
-        if ($filename == '') {
-            throw new \Exception('No filename given');
-        }
-    }
-
-    /**
-     * @param $extension
-     * @return string
-     */
-    private static function findType($extension)
-    {
-        return isset(Mapping::$types[$extension]) ? Mapping::$types[$extension] : self::DEFAULT_MIME_TYPE;
-    }
-
-
-}
-
diff --git a/civicrm/vendor/pear/mail/PATCHES.txt b/civicrm/vendor/pear/mail/PATCHES.txt
new file mode 100644
index 0000000000..636571a4f1
--- /dev/null
+++ b/civicrm/vendor/pear/mail/PATCHES.txt
@@ -0,0 +1,7 @@
+This file was automatically generated by Composer Patches (https://github.com/cweagans/composer-patches)
+Patches applied to this directory:
+
+Apply CiviCRM Customisations for CRM-1367 and CRM-5946
+Source: https://raw.githubusercontent.com/civicrm/civicrm-core/36319938a5bf26c1e7e2110a26a65db6a5979268/tools/scripts/composer/patches/pear-mail.patch
+
+
diff --git a/civicrm/xml/schema/ACL/Cache.xml b/civicrm/xml/schema/ACL/Cache.xml
index 36e9123dc3..869eadb961 100644
--- a/civicrm/xml/schema/ACL/Cache.xml
+++ b/civicrm/xml/schema/ACL/Cache.xml
@@ -23,6 +23,9 @@
     <title>Cache Contact</title>
     <type>int unsigned</type>
     <comment>Foreign Key to Contact</comment>
+    <html>
+      <type>EntityRef</type>
+    </html>
     <add>1.6</add>
   </field>
   <foreignKey>
@@ -38,6 +41,11 @@
     <type>int unsigned</type>
     <required>true</required>
     <comment>Foreign Key to ACL</comment>
+    <pseudoconstant>
+      <table>civicrm_acl</table>
+      <keyColumn>id</keyColumn>
+      <labelColumn>name</labelColumn>
+    </pseudoconstant>
     <add>1.6</add>
   </field>
   <foreignKey>
diff --git a/civicrm/xml/schema/Contact/DashboardContact.xml b/civicrm/xml/schema/Contact/DashboardContact.xml
index 6e3f0599b9..9ec01e202e 100644
--- a/civicrm/xml/schema/Contact/DashboardContact.xml
+++ b/civicrm/xml/schema/Contact/DashboardContact.xml
@@ -56,7 +56,7 @@
   </index>
   <field>
     <name>column_no</name>
-    <type>boolean</type>
+    <type>int</type>
     <comment>column no for this widget</comment>
     <default>0</default>
     <add>3.1</add>
diff --git a/civicrm/xml/schema/Contribute/Widget.xml b/civicrm/xml/schema/Contribute/Widget.xml
index 22ffb11709..f6dd5b3178 100644
--- a/civicrm/xml/schema/Contribute/Widget.xml
+++ b/civicrm/xml/schema/Contribute/Widget.xml
@@ -87,7 +87,7 @@
   </field>
   <field>
     <name>color_button</name>
-    <title>Button Colour</title>
+    <title>Button Color</title>
     <type>varchar</type>
     <length>10</length>
     <add>2.0</add>
@@ -108,35 +108,35 @@
   </field>
   <field>
     <name>color_main</name>
-    <title>Main Colour</title>
+    <title>Main Color</title>
     <type>varchar</type>
     <length>10</length>
     <add>2.0</add>
   </field>
   <field>
     <name>color_main_bg</name>
-    <title>Backgroup Color</title>
+    <title>Background Color</title>
     <type>varchar</type>
     <length>10</length>
     <add>2.0</add>
   </field>
   <field>
     <name>color_bg</name>
-    <title>Other Backgroun Colour</title>
+    <title>Other Background Color</title>
     <type>varchar</type>
     <length>10</length>
     <add>2.0</add>
   </field>
   <field>
     <name>color_about_link</name>
-    <title>About Link Colour</title>
+    <title>About Link Color</title>
     <type>varchar</type>
     <length>10</length>
     <add>2.0</add>
   </field>
   <field>
     <name>color_homepage_link</name>
-    <title>Homepage Link Colour</title>
+    <title>Homepage Link Color</title>
     <type>varchar</type>
     <length>10</length>
     <add>2.0</add>
diff --git a/civicrm/xml/schema/Core/County.xml b/civicrm/xml/schema/Core/County.xml
index edd4513ff8..0d25df4511 100644
--- a/civicrm/xml/schema/Core/County.xml
+++ b/civicrm/xml/schema/Core/County.xml
@@ -43,6 +43,11 @@
     <required>true</required>
     <comment>ID of State/Province that County belongs</comment>
     <add>1.1</add>
+    <pseudoconstant>
+      <table>civicrm_state_province</table>
+      <keyColumn>id</keyColumn>
+      <labelColumn>name</labelColumn>
+    </pseudoconstant>
   </field>
   <foreignKey>
     <name>state_province_id</name>
diff --git a/civicrm/xml/schema/Core/Dashboard.xml b/civicrm/xml/schema/Core/Dashboard.xml
index 96da590e28..00500943a8 100644
--- a/civicrm/xml/schema/Core/Dashboard.xml
+++ b/civicrm/xml/schema/Core/Dashboard.xml
@@ -76,6 +76,7 @@
     <length>255</length>
     <comment>Permission for the dashlet</comment>
     <add>3.1</add>
+    <serialize>COMMA</serialize>
   </field>
   <field>
     <name>permission_operator</name>
diff --git a/civicrm/xml/schema/Core/Discount.xml b/civicrm/xml/schema/Core/Discount.xml
index 16cde71afd..4dabdfcf85 100644
--- a/civicrm/xml/schema/Core/Discount.xml
+++ b/civicrm/xml/schema/Core/Discount.xml
@@ -70,6 +70,11 @@
     <title>Discount Name</title>
     <type>int unsigned</type>
     <required>true</required>
+    <pseudoconstant>
+      <table>civicrm_price_set</table>
+      <keyColumn>id</keyColumn>
+      <labelColumn>title</labelColumn>
+    </pseudoconstant>
     <export>true</export>
     <comment>FK to civicrm_price_set</comment>
     <add>4.3</add>
diff --git a/civicrm/xml/schema/Core/OpenID.xml b/civicrm/xml/schema/Core/OpenID.xml
index 1aa5c579f6..876aeca4b0 100644
--- a/civicrm/xml/schema/Core/OpenID.xml
+++ b/civicrm/xml/schema/Core/OpenID.xml
@@ -35,6 +35,11 @@
     <name>location_type_id</name>
     <title>OpenID Location Type</title>
     <type>int unsigned</type>
+    <pseudoconstant>
+      <table>civicrm_location_type</table>
+      <keyColumn>id</keyColumn>
+      <labelColumn>display_name</labelColumn>
+    </pseudoconstant>
     <comment>Which Location does this email belong to.</comment>
     <add>2.0</add>
   </field>
diff --git a/civicrm/xml/schema/Core/PrintLabel.xml b/civicrm/xml/schema/Core/PrintLabel.xml
index 06b1684163..546020cd1e 100644
--- a/civicrm/xml/schema/Core/PrintLabel.xml
+++ b/civicrm/xml/schema/Core/PrintLabel.xml
@@ -22,7 +22,7 @@
     <title>Title</title>
     <type>varchar</type>
     <length>255</length>
-    <comment>User title for for this label layout</comment>
+    <comment>User title for this label layout</comment>
     <add>4.4</add>
   </field>
   <field>
diff --git a/civicrm/xml/schema/Core/Tag.xml b/civicrm/xml/schema/Core/Tag.xml
index 3788458451..db74bb8e01 100644
--- a/civicrm/xml/schema/Core/Tag.xml
+++ b/civicrm/xml/schema/Core/Tag.xml
@@ -42,6 +42,11 @@
     <type>int unsigned</type>
     <default>NULL</default>
     <comment>Optional parent id for this tag.</comment>
+    <pseudoconstant>
+      <table>civicrm_tag</table>
+      <keyColumn>id</keyColumn>
+      <labelColumn>name</labelColumn>
+    </pseudoconstant>
     <add>1.1</add>
   </field>
   <field>
diff --git a/civicrm/xml/schema/Mailing/BouncePattern.xml b/civicrm/xml/schema/Mailing/BouncePattern.xml
index 3715febd2d..357572c272 100644
--- a/civicrm/xml/schema/Mailing/BouncePattern.xml
+++ b/civicrm/xml/schema/Mailing/BouncePattern.xml
@@ -21,6 +21,11 @@
     <type>int unsigned</type>
     <required>true</required>
     <comment>Type of bounce</comment>
+    <pseudoconstant>
+      <table>civicrm_mailing_bounce_type</table>
+      <keyColumn>id</keyColumn>
+      <labelColumn>name</labelColumn>
+    </pseudoconstant>
   </field>
   <foreignKey>
     <name>bounce_type_id</name>
diff --git a/civicrm/xml/schema/Mailing/Mailing.xml b/civicrm/xml/schema/Mailing/Mailing.xml
index 816e244694..975e67d15e 100644
--- a/civicrm/xml/schema/Mailing/Mailing.xml
+++ b/civicrm/xml/schema/Mailing/Mailing.xml
@@ -265,7 +265,7 @@
     <type>boolean</type>
     <default>0</default>
     <add>2.2</add>
-    <comment>Should we overrite VERP address in Reply-To</comment>
+    <comment>Overwrite the VERP address in Reply-To</comment>
     <html>
       <type>CheckBox</type>
     </html>
diff --git a/civicrm/xml/schema/Mailing/Spool.xml b/civicrm/xml/schema/Mailing/Spool.xml
index a3f26cf950..de95f7b9e5 100644
--- a/civicrm/xml/schema/Mailing/Spool.xml
+++ b/civicrm/xml/schema/Mailing/Spool.xml
@@ -32,7 +32,7 @@
     <name>recipient_email</name>
     <title>Recipient Email</title>
     <type>text</type>
-    <comment>The email of the receipients this mail is to be sent.</comment>
+    <comment>The email of the recipients this mail is to be sent.</comment>
   </field>
   <field>
     <name>headers</name>
diff --git a/civicrm/xml/schema/Report/ReportInstance.xml b/civicrm/xml/schema/Report/ReportInstance.xml
index 9961b9028e..8811719e4a 100644
--- a/civicrm/xml/schema/Report/ReportInstance.xml
+++ b/civicrm/xml/schema/Report/ReportInstance.xml
@@ -118,7 +118,7 @@
   <field>
     <name>form_values</name>
     <title>Submitted Form Values</title>
-    <type>text</type>
+    <type>longtext</type>
     <import>true</import>
     <comment>Submitted form values for this report</comment>
     <serialize>PHP</serialize>
diff --git a/civicrm/xml/version.xml b/civicrm/xml/version.xml
index afa513cc7d..a78ec41868 100644
--- a/civicrm/xml/version.xml
+++ b/civicrm/xml/version.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="iso-8859-1" ?>
 <version>
-  <version_no>5.24.6</version_no>
+  <version_no>5.25.0</version_no>
 </version>
diff --git a/includes/civicrm.compat.php b/includes/civicrm.compat.php
deleted file mode 100644
index 151761de7c..0000000000
--- a/includes/civicrm.compat.php
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
-*/
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- *
- */
-
-
-// This file must not accessed directly
-if ( ! defined( 'ABSPATH' ) ) exit;
-
-
-/**
- * Define CiviCRM_For_WordPress_Compat Class.
- *
- * @since 5.24
- */
-class CiviCRM_For_WordPress_Compat {
-
-  /**
-   * Plugin object reference.
-   *
-   * @since 5.24
-   * @access public
-   * @var object $civi The plugin object reference.
-   */
-  public $civi;
-
-
-  /**
-   * Instance constructor.
-   *
-   * @since 5.24
-   */
-  public function __construct() {
-
-    // Store reference to CiviCRM plugin object.
-    $this->civi = civi_wp();
-
-    // Register plugin compatibility hooks.
-    $this->register_hooks();
-
-  }
-
-
-  /**
-   * Register plugin compatibility hooks.
-   *
-   * This is called via the constructor during the "plugins_loaded" action which
-   * is much earlier that CiviCRM's own internal hooks. The reason for this is
-   * that compability may need callbacks for events that fire well before "init"
-   * which is when CiviCRM begins to load.
-   *
-   * @since 5.24
-   */
-  public function register_hooks() {
-
-    // Bail if CiviCRM not installed yet.
-    if ( ! CIVICRM_INSTALLED ) {
-      return;
-    }
-
-    // Support Clean URLs when Polylang is active.
-    add_action( 'civicrm_after_rewrite_rules', array( $this, 'rewrite_rules_polylang' ), 10, 2 );
-
-  }
-
-
-  /**
-   * Support Polylang.
-   *
-   * @since 5.24
-   *
-   * @param bool $flush_rewrite_rules True if rules flushed, false otherwise.
-   * @param WP_Post $basepage The Basepage post object.
-   */
-  public function rewrite_rules_polylang( $flush_rewrite_rules, $basepage ) {
-
-    // Bail if Polylang is not present.
-    if (!function_exists('pll_languages_list')) {
-      return;
-    }
-
-    /*
-     * Collect all rewrite rules into an array.
-     *
-     * Because the array of specific Post IDs is added *after* the array of
-     * paths for the Basepage ID, those specific rewrite rules will "win" over
-     * the more general Basepage rules.
-     */
-    $collected_rewrites = [];
-
-    // Support prefixes for a single Basepage.
-    $basepage_url = get_permalink( $basepage->ID );
-    $basepage_raw_url = PLL()->links_model->remove_language_from_link( $basepage_url );
-    $language_slugs = pll_languages_list();
-    foreach ($language_slugs as $slug) {
-      $language = PLL()->model->get_language( $slug );
-      $language_url = PLL()->links_model->add_language_to_link( $basepage_raw_url, $language );
-      $parsed_url = wp_parse_url( $language_url, PHP_URL_PATH );
-      $regex_path = substr( $parsed_url, 1 );
-      $collected_rewrites[$basepage->ID][] = $regex_path;
-      $post_id = pll_get_post( $basepage->ID, $slug );
-      if (!empty($post_id)) {
-        $collected_rewrites[$post_id][] = $regex_path;
-      }
-    };
-
-    // Support prefixes for Basepages in multiple languages.
-    foreach ($language_slugs as $slug) {
-      $post_id = pll_get_post( $basepage->ID, $slug );
-      if (empty($post_id)) {
-        continue;
-      }
-      $url = get_permalink( $post_id );
-      $parsed_url = wp_parse_url( $url, PHP_URL_PATH );
-      $regex_path = substr( $parsed_url, 1 );
-      $collected_rewrites[$basepage->ID][] = $regex_path;
-      $collected_rewrites[$post_id][] = $regex_path;
-    };
-
-    // Make collection unique and add remaining rewrite rules.
-    $rewrites = array_map('array_unique', $collected_rewrites);
-    if (!empty($rewrites)) {
-      foreach ($rewrites as $post_id => $rewrite) {
-        foreach ($rewrite as $path) {
-          add_rewrite_rule(
-            '^' . $path . '([^?]*)?',
-            'index.php?page_id=' . $post_id . '&page=CiviCRM&q=civicrm%2F$matches[1]',
-            'top'
-          );
-        }
-      }
-    }
-
-    // Maybe force flush
-    if ($flush_rewrite_rules) {
-      flush_rewrite_rules();
-    }
-
-  }
-
-} // Class CiviCRM_For_WordPress_Compat ends
diff --git a/includes/civicrm.shortcodes.php b/includes/civicrm.shortcodes.php
index 4675ac8fb1..e09eac99c3 100644
--- a/includes/civicrm.shortcodes.php
+++ b/includes/civicrm.shortcodes.php
@@ -698,6 +698,14 @@ class CiviCRM_For_WordPress_Shortcodes {
         $args['q'] = 'civicrm/contribute/transact';
         break;
 
+      case 'pcp':
+
+        if ( $mode == 'preview' || $mode == 'test' ) {
+          $args['action'] = 'preview';
+        }
+        $args['q'] = 'civicrm/pcp/info';
+        break;
+
       case 'event':
 
         switch ( $action ) {
@@ -740,7 +748,6 @@ class CiviCRM_For_WordPress_Shortcodes {
         $args['gid'] = $gid;
         break;
 
-
       case 'petition':
 
         $args['q'] = 'civicrm/petition/sign';
diff --git a/tests/phpunit/CiviWP/PhpVersionTest.php b/tests/phpunit/CiviWP/PhpVersionTest.php
index f4800daf5c..dd5289ba2b 100644
--- a/tests/phpunit/CiviWP/PhpVersionTest.php
+++ b/tests/phpunit/CiviWP/PhpVersionTest.php
@@ -7,7 +7,8 @@ use Civi\Test\EndToEndInterface;
 class PhpVersionTest extends \PHPUnit\Framework\TestCase implements EndToEndInterface {
 
   /**
-   * CIVICRM_WP_PHP_MINIMUM (civicrm.module) should match MINIMUM_PHP_VERSION (CRM/Upgrade/Form.php).
+   * CIVICRM_WP_PHP_MINIMUM (civicrm.module) should match
+   * CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER.
    *
    * The literal value should be duplicated in the define() to prevent dependency issues.
    */
@@ -16,7 +17,9 @@ class PhpVersionTest extends \PHPUnit\Framework\TestCase implements EndToEndInte
     $this->assertFileExists($constantFile);
     $content = file_get_contents($constantFile);
     if (preg_match(";define\\(\\s*'CIVICRM_WP_PHP_MINIMUM'\\s*,\\s*'(.*)'\\s*\\);", $content, $m)) {
-      $this->assertEquals(\CRM_Upgrade_Form::MINIMUM_PHP_VERSION, $m[1]);
+      $a = preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', \CRM_Upgrade_Incremental_General::MIN_INSTALL_PHP_VER);
+      $b = preg_replace(';^(\d+\.\d+(?:\.[1-9]\d*)?).*$;', '\1', $m[1]);
+      $this->assertEquals($a, $b);
     }
     else {
       $this->fail('Failed to find CIVICRM_WP_PHP_MINIMUM in ' . $constantFile);
diff --git a/wp-cli/civicrm.php b/wp-cli/civicrm.php
index e7defcf4dd..1b4c2561e4 100644
--- a/wp-cli/civicrm.php
+++ b/wp-cli/civicrm.php
@@ -1311,13 +1311,18 @@ if ( ! defined( 'CIVICRM_WPCLI_LOADED' ) ) {
   # Set path early.
   WP_CLI::add_hook( 'before_wp_load', function() {
 
-    # if --path is set, save for later use by Civi
+    # If --path is set, save for later use by CiviCRM.
     global $civicrm_paths;
     $wp_cli_config = WP_CLI::get_config();
     if (!empty($wp_cli_config['path'])) {
       $civicrm_paths['cms.root']['path'] = $wp_cli_config['path'];
     }
 
+    # If --url is set, save for later use by CiviCRM.
+    if (!empty($wp_cli_config['url'])) {
+      $civicrm_paths['cms.root']['url'] = $wp_cli_config['url'];
+    }
+
   } );
 
 }
-- 
GitLab