Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release v4.0.0 #2480

Merged
merged 3 commits into from
Dec 15, 2021
Merged

Release v4.0.0 #2480

merged 3 commits into from
Dec 15, 2021

Conversation

vanitabarrett
Copy link
Contributor

4.0.0 (Breaking release)

Breaking changes

This release contains a lot of breaking changes, but we expect many of them will only affect a small number of users. However, to make sure your service still works after you upgrade, you should read the release notes and make any required changes.

Check your accordions still display as expected

We've changed the design of the accordion. You can see its new look and read the revised guidance, particularly about when and when not to use accordions.

You should check your accordions still display as expected if you have any:

  • accordions with custom styles
  • section headings that contain unusual formatting (for example, wrappers)

You do not need to make changes to the content that accordions hide or show, as this release's changes do not affect it.

These changes were introduced in pull request #2257: Update accordion design. Thanks to Mia Allers, Owen Jones, Nikin Nagewadia and Chris Yoong for their contributions.

Only use the accordion’s summary line for ‘phrasing content’

The summary line is now inside the HTML button element, so you can only add 'phrasing content' to it. Do not use any non-phrasing content, as the resulting HTML will not be valid.

This change was introduced in pull request #2257: Update accordion design.

Review and revise the accordion's summary line content

Only add a summary line if you need to, as it's likely to make the button text too long.

If you're already using the summary line, review your use of the summary line to make sure you actually need it.

If you need to keep the summary line, review the accordion guidance and make the summary line as short as possible.

Update the HTML for summary lists

We've updated the HTML for the summary list component to avoid nesting <span> elements within <dd> elements, which is invalid HTML. This update only affects you if you have summary lists that include a mix of rows with and without actions. You can read more about adding actions to rows.

If you're not using Nunjucks macros, do not include an empty <span class="govuk-summary-list__actions"></span> in rows without actions. Instead, add the govuk-summary-list__row--no-actions modifier class to the row.

This change was introduced in pull request #2323: Avoid invalid nesting of <span> within a <dd> in summary list. Thanks to Malcolm Hire for reporting this issue.

Update the HTML for navigation in the header

We've updated the HTML for the header. This update only affects you if your header includes navigation.

Any additional classes passed using the navigationClasses Nunjucks option are now applied to the <nav> rather than the <ul>. Check the additional classes are still doing what you expect.

If you're not using Nunjucks macros, then you should:

  • move the <button> inside the <nav>, immediately before the <ul>
  • move the aria-label attribute from the <ul> to the <nav>
  • move the govuk-header__navigation class from the <ul> to the <nav>
  • add the govuk-header__navigation-list class to the <ul>

Check your changes against the header example in the Design System to make sure you have correctly implemented them.

This change was introduced in pull request #2427: Improve the screen reader experience for the header menu.

Style any custom HTML in your cookie banner

We've removed the default font styles from the cookie banner Sass. This change makes it more obvious when you have not added classes and styles to any custom HTML.

If you're passing custom HTML into the cookie banner component (for example, using the html Nunjucks parameter), you must make sure you're applying the appropriate classes and styles to that HTML. This could look like, for example, adding the govuk-body class to any paragraph tags. You must do this to prevent your cookie banner displaying with unstyled text.

This change was introduced in pull request #2432: Remove default font styles from cookie banner Sass.

Update the HTML for hints

In GOV.UK Frontend v3.8.0, we updated the HTML for hints to use a <div> rather than a <span> element, to allow the use of block elements. We've now removed the styles which made the hint <span> display as block.

If you’re not using Nunjucks macros, update your hint HTML to use a <div> rather than a <span>. For example: <div id="input-hint" class="govuk-hint"></div> instead of <span id="input-hint" class="govuk-hint"></span>.

This change was introduced in pull request #2437: Remove display:block on hint component.

Include JavaScript for skip link to improve screen reader announcements

We've added JavaScript for the skip link component to set focus to the linked element, for example, the main content on the page. This helps screen readers read the linked content when users use the skip link component.

If you're importing JavaScript for individual components, import the skip link JavaScript.

If you're not using Nunjucks macros, add a data-module="govuk-skip-link" attribute to the component HTML. For example:

<div class="govuk-skip-link" data-module="govuk-skip-link">
...
</div>

Once you've made the changes, check the skip link JavaScript works. To do this, select the skip link and check the linked element (usually the <main> element) in the browser has a tabindex attribute.

This change was introduced in pull request #2450: Set focus to skip link target to improve screen reader announcements.

Update the HTML for error messages

We’ve updated the HTML for the error message component to use a <paragraph> element instead of a <span> element, as this is more semantically correct.

If you’re not using Nunjucks macros, swap the <span class="govuk-error-message"> for a <p class="govuk-error-message">.

This change was introduced in pull request #2452: Update error messages to use paragraph tags instead of spans.

Check components that conditionally reveal content still work

On radios and checkboxes, the JavaScript now looks within the whole page for conditionally-revealed content. Before, it only looked within the same set of radios or checkboxes.

If you see unexpected behaviour, make sure the revealed content's id is unique within the page the content is on. Reusing the same id within a page could cause a radio or checkbox to reveal or hide the wrong element, and also means your HTML is invalid.

This change was introduced in pull request #2370: Prevent issues with conditionally revealed content when content id includes CSS syntax characters.

Check the character count component still works as expected

On character counts, the JavaScript now looks within the whole page for the count message, which will be something similar to “You have 200 characters remaining”. Before, it only looked within the character count component.

If you see unexpected behaviour, make sure the id for the textarea component is unique within the page the content is on. Reusing the same id within a page could cause the wrong count message to update, and also means your HTML is invalid.

This change was introduced in pull request #2408: Prevent issues with character count when textarea id includes CSS syntax characters.

Check individually-imported JavaScript modules work as expected

You do not need to do anything if you have done at least one of the following:

  • followed our Getting Started guide and are importing all of the GOV.UK Frontend JavaScript in one go via all.js
  • installed GOV.UK Frontend using precompiled files

We've changed the naming of our components' JavaScript modules so individual imports are now attached to
window.GOVUKFrontend.[ComponentName] instead of window.GOVUKFrontend.

You can now import multiple modules without overwriting the previous one, for example:

//= require govuk/components/accordion/accordion.js
//= require govuk/components/button/button.js

# These modules are available under window.GOVUKFrontend.Accordion and window.GOVUKFrontend.Button respectively

If you're importing JavaScript modules individually, you should check any references to window.GOVUKFrontend in your code and update them to point to the correct component, window.GOVUKFrontend.[ComponentName]. You can now remove any workarounds you may have implemented.

This change was introduced in pull request #2426: Rename exported JavaScript modules to include component name. Thanks to Alex Jurubita for reporting this issue.

Import 'base' before importing Sass files from core or overrides layers

If you import individual files from the core or overrides layers, you might see the error Undefined mixin 'govuk-exports' or no mixin named govuk-exports when compiling your Sass.

To fix the error, import node_modules/govuk-frontend/govuk/base first. For example:

@import "node_modules/govuk-frontend/govuk/base";
@import "node_modules/govuk-frontend/core/typography";

This change was introduced in pull request #2455: Remove 'base' import from files in core and overrides layers.

Import 'template' Sass file from the objects layer instead of the core layer

If you import the 'template' Sass file from the core layer, you might see the error File to import not found or unreadable: template when compiling your Sass.

To fix this error, replace any imports of node_modules/govuk-frontend/govuk/core/template with node_modules/govuk-frontend/govuk/objects/template.

This change was introduced in pull request #2463: Move template styles from core to objects layer.

Check your footer displays as expected

We’ve made some fixes to the alignment of columns within the footer component, so they now align with our grid. We've also removed the logic that assumes a 2-section layout displays as a 'two-thirds and one-third' layout. Footer sections now display as full-width by default.

If you're using the Nunjucks macros, check your footer displays as expected and use the width macro option to set the width you want for each section.

If you're not using the Nunjucks macros, check your footer displays as expected and use the standard Design System grid classes on the govuk-footer__section element to set the width. For example:

<div class="govuk-footer__section govuk-grid-column-two-thirds">...</div>

This change was introduced in pull request #2462: Fix footer alignment with grid classes and add width macro option.

Remove deprecated $govuk-border-width-form-element-error variable

In GOV.UK Frontend v3.8.0, we made the border width of form elements in their error state the same as for form elements in their normal state and deprecated the $govuk-border-width-form-element-error variable.

Before, an element's border got thicker to show the element was in an error state. However, elements in their focused state also have a thicker border. As a result, when users focused an element in an error state, the only visible border-change was from red to black. Not all users could perceive this change. So, we reduced the element border's width, to make sure its thickness changes when users focus.

We've now removed $govuk-border-width-form-element-error completely.

If you’re referencing $govuk-border-width-form-element-error in your own Sass, you must remove it. If you're also defining your own error state, you only need to change the border colour.

You should avoid overriding the border width. For example, replace border: $govuk-border-width-form-element-error solid $govuk-error-colour; with border-color: $govuk-error-colour;.

You should also remove any override of $govuk-border-width-form-element-error from your Sass. This override no longer does anything.

This change was introduced in pull request #1963: Remove deprecated $govuk-border-width-form-element-error variable.

Remove deprecated govuk-main-wrapper and govuk-main-wrapper--l mixins

We've removed the govuk-main-wrapper and govuk-main-wrapper--l mixins we deprecated in GOV.UK Frontend v3.0.0.

Remove any use of these mixins in your own Sass. You can replace these mixins with direct references to the spacing mixins.

This change was introduced in pull request #2385: Remove deprecated govuk-main-wrapper and govuk-main-wrapper--l mixins.

Remove calls to deprecated iff Sass function

We've removed the iff function we deprecated in GOV.UK Frontend version 3.6.0.

If you’re calling iff from your own Sass, you should use Sass's native if function instead.

This change was introduced in pull request #2409: Remove deprecated iff Sass function.

Remove deprecated govuk-tag--inactive class

We've removed the govuk-tag--inactive class we deprecated in GOV.UK Frontend v3.6.0.

Replace any use of this class with the govuk-tag--grey class.

This change was introduced in pull request #2417: Remove deprecated govuk-tag--inactive class.

Recommended changes

We've recently made some other changes to GOV.UK Frontend. While these are not breaking changes, implementing them will make your service work better.

You do not need to do anything if you're using Nunjucks macros.

Change date input from type="number" to inputmode="numeric"

There are some known issues with inputs of type="number". Read our research into the issues with type="number".

If you’re not using Nunjucks macros, remove the type="number" attribute from the date input component.

Replace it with type="text" and inputmode="numeric". For example:

<input class="govuk-input govuk-date-input__input" id="passport-issued-month" name="passport-issued-month" type="text" pattern="[0-9]*" inputmode="numeric">

This change was introduced in pull request #1704: Update date input to use type=text and inputmode=numeric.

Fix fallback logo so Chrome will not flag it to screen readers

If you’re not using Nunjucks macros, change the SVG markup within the header, footer and button components. We’ve added this fix so screen readers will not announce the fallback image to users.

For the header, footer and button, replace role="presentation" with aria-hidden="true". For example:

<svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false">

This change was introduced in pull request #1724: Fix fallback logo so Chrome will not flag it to screen readers.

Add data-nosnippet attribute to cookie banner

Apply a data-nosnippet attribute to the cookie banner component to stop it appearing in Google Search snippets.

If you’re not using Nunjucks macros, add a new data-nosnippet attribute to the cookie banner.

<div class="govuk-cookie-banner " data-nosnippet role="region" aria-label="Cookies on your service">

This change was introduced in pull request #2192: Add data-nosnippet to prevent cookie banner text appearing in Google Search snippets.

Fixes

We’ve made fixes to GOV.UK Frontend in the following pull requests:

@govuk-design-system-ci govuk-design-system-ci temporarily deployed to govuk-frontend-pr-2480 December 15, 2021 14:41 Inactive
@github-actions
Copy link

Changes to dist

diff --git a/dist/VERSION.txt b/dist/VERSION.txt
index 0d0e48dd..e74e2121 100644
--- a/dist/VERSION.txt
+++ b/dist/VERSION.txt
@@ -1 +1 @@
-3.13.1
+4.0.0
diff --git a/dist/govuk-frontend-3.13.1.min.css b/dist/govuk-frontend-4.0.0.min.css
similarity index 5%
rename from dist/govuk-frontend-3.13.1.min.css
rename to dist/govuk-frontend-4.0.0.min.css
index ffc0356d..5ad564e5 100644
--- a/dist/govuk-frontend-3.13.1.min.css
+++ b/dist/govuk-frontend-4.0.0.min.css
@@ -47,10 +47,7 @@
     color: #003078
 }
 
-.govuk-link:active {
-    color: #0b0c0c
-}
-
+.govuk-link:active,
 .govuk-link:focus {
     color: #0b0c0c
 }
@@ -72,14 +69,8 @@
 }
 
 .govuk-link--muted:active,
-.govuk-link--muted:hover {
-    color: #0b0c0c
-}
-
-.govuk-link--muted:focus {
-    color: #0b0c0c
-}
-
+.govuk-link--muted:focus,
+.govuk-link--muted:hover,
 .govuk-link--text-colour:link,
 .govuk-link--text-colour:visited {
     color: #0b0c0c
@@ -137,11 +128,9 @@
     color: #003078
 }
 
-.govuk-link--no-visited-state:active {
-    color: #0b0c0c
-}
-
-.govuk-link--no-visited-state:focus {
+.govuk-link--no-visited-state:active,
+.govuk-link--no-visited-state:focus,
+.govuk-list {
     color: #0b0c0c
 }
 
@@ -153,7 +142,6 @@
     font-size: 16px;
     font-size: 1rem;
     line-height: 1.25;
-    color: #0b0c0c;
     margin-top: 0;
     margin-bottom: 15px;
     padding-left: 0;
@@ -229,24 +217,6 @@
     }
 }
 
-.govuk-template {
-    background-color: #f3f2f1;
-    -webkit-text-size-adjust: 100%;
-    -ms-text-size-adjust: 100%;
-    text-size-adjust: 100%
-}
-
-@media screen {
-    .govuk-template {
-        overflow-y: scroll
-    }
-}
-
-.govuk-template__body {
-    margin: 0;
-    background-color: #fff
-}
-
 .govuk-heading-xl {
     color: #0b0c0c;
     font-family: GDS Transport, arial, sans-serif;
@@ -1111,6 +1081,24 @@
     }
 }
 
+.govuk-template {
+    background-color: #f3f2f1;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+    text-size-adjust: 100%
+}
+
+@media screen {
+    .govuk-template {
+        overflow-y: scroll
+    }
+}
+
+.govuk-template__body {
+    margin: 0;
+    background-color: #fff
+}
+
 .govuk-width-container {
     max-width: 960px;
     margin-right: 15px;
@@ -1166,65 +1154,44 @@
     padding-top: 15px
 }
 
-.govuk-accordion__section-header {
-    padding-top: 15px;
-    padding-bottom: 15px
-}
-
 .govuk-accordion__section-heading {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    font-weight: 400;
-    font-size: 18px;
-    font-size: 1.125rem;
-    line-height: 1.11111;
     margin-top: 0;
-    margin-bottom: 0
-}
-
-@media print {
-    .govuk-accordion__section-heading {
-        font-family: sans-serif
-    }
+    margin-bottom: 0;
+    padding-top: 15px;
+    padding-bottom: 15px
 }
 
-@media (min-width:40.0625em) {
-    .govuk-accordion__section-heading {
-        font-size: 24px;
-        font-size: 1.5rem;
-        line-height: 1.25
-    }
+.govuk-accordion__section-button {
+    color: #0b0c0c;
+    display: block;
+    margin-bottom: 0;
+    padding-top: 15px
 }
 
 @media print {
-    .govuk-accordion__section-heading {
-        font-size: 18pt;
-        line-height: 1.15
+    .govuk-accordion__section-button {
+        color: #000
     }
 }
 
-.govuk-accordion__section-button {
+.govuk-accordion__section-heading-text {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
     -moz-osx-font-smoothing: grayscale;
     font-weight: 700;
     font-size: 18px;
     font-size: 1.125rem;
-    line-height: 1.11111;
-    display: inline-block;
-    margin-bottom: 0;
-    padding-top: 15px
+    line-height: 1.11111
 }
 
 @media print {
-    .govuk-accordion__section-button {
+    .govuk-accordion__section-heading-text {
         font-family: sans-serif
     }
 }
 
 @media (min-width:40.0625em) {
-    .govuk-accordion__section-button {
+    .govuk-accordion__section-heading-text {
         font-size: 24px;
         font-size: 1.5rem;
         line-height: 1.25
@@ -1232,17 +1199,12 @@
 }
 
 @media print {
-    .govuk-accordion__section-button {
+    .govuk-accordion__section-heading-text {
         font-size: 18pt;
         line-height: 1.15
     }
 }
 
-.govuk-accordion__section-summary {
-    margin-top: 10px;
-    margin-bottom: 0
-}
-
 .govuk-accordion__section-content>:last-child {
     margin-bottom: 0
 }
@@ -1257,14 +1219,12 @@
 
 .js-enabled .govuk-accordion__section-content {
     display: none;
-    padding-top: 15px;
-    padding-bottom: 15px
+    padding-bottom: 30px
 }
 
 @media (min-width:40.0625em) {
     .js-enabled .govuk-accordion__section-content {
-        padding-top: 15px;
-        padding-bottom: 15px
+        padding-bottom: 50px
     }
 }
 
@@ -1272,104 +1232,178 @@
     display: block
 }
 
-.js-enabled .govuk-accordion__open-all {
+.js-enabled .govuk-accordion__show-all {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 400;
-    font-size: 14px;
-    font-size: .875rem;
-    line-height: 1.14286;
+    font-size: 16px;
+    font-size: 1rem;
+    line-height: 1.25;
     position: relative;
     z-index: 1;
-    margin: 0;
-    padding: 0;
+    margin-bottom: 9px;
+    padding: 5px 2px 5px 0;
     border-width: 0;
     color: #1d70b8;
     background: none;
     cursor: pointer;
-    -webkit-appearance: none;
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    text-decoration: underline
+    -webkit-appearance: none
+}
+
+@media print {
+    .js-enabled .govuk-accordion__show-all {
+        font-family: sans-serif
+    }
 }
 
 @media (min-width:40.0625em) {
-    .js-enabled .govuk-accordion__open-all {
-        font-size: 16px;
-        font-size: 1rem;
-        line-height: 1.25
+    .js-enabled .govuk-accordion__show-all {
+        font-size: 19px;
+        font-size: 1.1875rem;
+        line-height: 1.31579
     }
 }
 
 @media print {
-    .js-enabled .govuk-accordion__open-all {
+    .js-enabled .govuk-accordion__show-all {
         font-size: 14pt;
-        line-height: 1.2;
-        font-family: sans-serif
+        line-height: 1.15
     }
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
+@media (min-width:48.0625em) {
+    .js-enabled .govuk-accordion__show-all {
+        margin-bottom: 14px
+    }
+}
+
+.js-enabled .govuk-accordion__show-all::-moz-focus-inner {
+    padding: 0;
+    border: 0
+}
+
+.js-enabled .govuk-accordion__show-all:hover {
+    color: #0b0c0c;
+    background: #f3f2f1;
+    box-shadow: 0 -2px #f3f2f1, 0 4px #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:focus {
     outline: 3px solid rgba(0, 0, 0, 0);
+    color: #0b0c0c;
     background-color: #fd0;
     box-shadow: 0 -2px #fd0, 0 4px #0b0c0c;
     text-decoration: none
 }
 
-.js-enabled .govuk-accordion__open-all:link {
-    color: #1d70b8
-}
-
-.js-enabled .govuk-accordion__open-all:visited {
-    color: #4c2c92
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron {
+    background: #0b0c0c
 }
 
-.js-enabled .govuk-accordion__open-all:hover {
-    color: #003078
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
 }
 
-.js-enabled .govuk-accordion__open-all:active {
-    color: #0b0c0c
+.js-enabled .govuk-accordion__section-heading {
+    padding: 0
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
-    color: #0b0c0c
+.js-enabled .govuk-accordion-nav__chevron {
+    box-sizing: border-box;
+    display: inline-block;
+    position: relative;
+    width: 1.25rem;
+    height: 1.25rem;
+    border: .0625rem solid;
+    border-radius: 50%;
+    vertical-align: middle
 }
 
-.js-enabled .govuk-accordion__open-all::-moz-focus-inner {
-    padding: 0;
-    border: 0
+.js-enabled .govuk-accordion-nav__chevron:after {
+    content: "";
+    box-sizing: border-box;
+    display: block;
+    position: absolute;
+    bottom: .3125rem;
+    left: .375rem;
+    width: .375rem;
+    height: .375rem;
+    -webkit-transform: rotate(-45deg);
+    -ms-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+    border-top: .125rem solid;
+    border-right: .125rem solid
 }
 
-.js-enabled .govuk-accordion__section-header {
-    position: relative;
-    padding-right: 40px;
-    border-top: 1px solid #b1b4b6;
-    cursor: pointer
+.js-enabled .govuk-accordion-nav__chevron--down {
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg)
 }
 
 .js-enabled .govuk-accordion__section-button {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 0;
-    padding: 0;
-    border-width: 0;
-    color: #1d70b8;
+    width: 100%;
+    padding: 10px 0 0;
+    border: 0;
+    border-top: 1px solid #b1b4b6;
+    border-bottom: 10px solid rgba(0, 0, 0, 0);
+    color: #0b0c0c;
     background: none;
     text-align: left;
     cursor: pointer;
     -webkit-appearance: none
 }
 
-@media print {
+@media (min-width:40.0625em) {
     .js-enabled .govuk-accordion__section-button {
-        font-family: sans-serif
+        padding-bottom: 10px
     }
 }
 
+.js-enabled .govuk-accordion__section-button:active {
+    color: #0b0c0c;
+    background: none
+}
+
+.js-enabled .govuk-accordion__section-button:hover {
+    color: #0b0c0c;
+    background: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
+}
+
 .js-enabled .govuk-accordion__section-button:focus {
+    outline: 0
+}
+
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
     outline: 3px solid rgba(0, 0, 0, 0);
     color: #0b0c0c;
     background-color: #fd0;
@@ -1377,72 +1411,121 @@
     text-decoration: none
 }
 
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
+}
+
 .js-enabled .govuk-accordion__section-button::-moz-focus-inner {
     padding: 0;
     border: 0
 }
 
-.js-enabled .govuk-accordion__section-button:after {
-    content: "";
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0
+.js-enabled .govuk-accordion__section--expanded .govuk-accordion__section-button {
+    padding-bottom: 20px;
+    border-bottom: 0
 }
 
-.js-enabled .govuk-accordion__section-button:hover:not(:focus) {
-    color: #003078;
-    text-decoration: underline;
-    text-underline-offset: .1em
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
+    padding-bottom: 3px
 }
 
-@media (hover:none) {
-    .js-enabled .govuk-accordion__section-button:hover {
-        text-decoration: none
+@media (min-width:48.0625em) {
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
+        padding-bottom: 2px
     }
 }
 
-.js-enabled .govuk-accordion__controls {
-    text-align: right
+.js-enabled .govuk-accordion__section-heading-text,
+.js-enabled .govuk-accordion__section-summary,
+.js-enabled .govuk-accordion__section-toggle {
+    display: block;
+    margin-bottom: 13px
 }
 
-.js-enabled .govuk-accordion__icon {
-    position: absolute;
-    top: 50%;
-    right: 15px;
-    width: 16px;
-    height: 16px;
-    margin-top: -8px
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-toggle-focus {
+    display: inline
 }
 
-.js-enabled .govuk-accordion__icon:after,
-.js-enabled .govuk-accordion__icon:before {
-    content: "";
-    box-sizing: border-box;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    width: 25%;
-    height: 25%;
-    margin: auto;
-    border: 2px solid rgba(0, 0, 0, 0);
-    background-color: #0b0c0c
+.js-enabled .govuk-accordion__section-toggle {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    font-weight: 400;
+    font-size: 16px;
+    font-size: 1rem;
+    line-height: 1.25;
+    color: #1d70b8
 }
 
-.js-enabled .govuk-accordion__icon:before {
-    width: 100%
+@media print {
+    .js-enabled .govuk-accordion__section-toggle {
+        font-family: sans-serif
+    }
 }
 
-.js-enabled .govuk-accordion__icon:after {
-    height: 100%
+@media (min-width:40.0625em) {
+    .js-enabled .govuk-accordion__section-toggle {
+        font-size: 19px;
+        font-size: 1.1875rem;
+        line-height: 1.31579
+    }
 }
 
-.js-enabled .govuk-accordion__section--expanded .govuk-accordion__icon:after {
-    content: " ";
-    display: none
+@media print {
+    .js-enabled .govuk-accordion__section-toggle {
+        font-size: 14pt;
+        line-height: 1.15
+    }
+}
+
+.js-enabled .govuk-accordion__section-toggle-text,
+.js-enabled .govuk-accordion__show-all-text {
+    margin-left: 5px;
+    vertical-align: middle
+}
+
+@media screen and (forced-colors:active) {
+
+    .js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron,
+    .js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron {
+        background-color: rgba(0, 0, 0, 0)
+    }
+
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron,
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-heading-text-focus,
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-summary-focus,
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion__section-heading-text-focus,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion__section-summary-focus,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion__section-toggle-focus {
+        background: rgba(0, 0, 0, 0);
+        background-color: rgba(0, 0, 0, 0)
+    }
+}
+
+@media (hover:none) {
+    .js-enabled .govuk-accordion__section-header:hover {
+        border-top-color: #b1b4b6;
+        box-shadow: inset 0 3px 0 0 #1d70b8
+    }
+
+    .js-enabled .govuk-accordion__section-header:hover .govuk-accordion__section-button {
+        border-top-color: #b1b4b6
+    }
 }
 
 .govuk-back-link {
@@ -1925,6 +2008,7 @@
     font-size: 1rem;
     line-height: 1.25;
     display: block;
+    margin-top: 0;
     margin-bottom: 15px;
     clear: both;
     color: #d4351c
@@ -2152,7 +2236,6 @@
     font-size: 16px;
     font-size: 1rem;
     line-height: 1.25;
-    display: block;
     margin-bottom: 15px;
     color: #505a5f
 }
@@ -2666,7 +2749,7 @@ screen and (forced-colors:active) {
 }
 
 .govuk-textarea--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-textarea--error:focus {
@@ -2718,39 +2801,11 @@ screen and (forced-colors:active) {
 }
 
 .govuk-cookie-banner {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    font-weight: 400;
-    font-size: 16px;
-    font-size: 1rem;
-    line-height: 1.25;
     padding-top: 20px;
     border-bottom: 10px solid rgba(0, 0, 0, 0);
     background-color: #f3f2f1
 }
 
-@media print {
-    .govuk-cookie-banner {
-        font-family: sans-serif
-    }
-}
-
-@media (min-width:40.0625em) {
-    .govuk-cookie-banner {
-        font-size: 19px;
-        font-size: 1.1875rem;
-        line-height: 1.31579
-    }
-}
-
-@media print {
-    .govuk-cookie-banner {
-        font-size: 14pt;
-        line-height: 1.15
-    }
-}
-
 .govuk-cookie-banner[hidden] {
     display: none
 }
@@ -2806,14 +2861,18 @@ screen and (forced-colors:active) {
         display: table;
         width: 100%;
         table-layout: fixed;
+        border-collapse: collapse;
         margin-bottom: 30px
     }
 }
 
+.govuk-summary-list__row {
+    border-bottom: 1px solid #b1b4b6
+}
+
 @media (max-width:40.0525em) {
     .govuk-summary-list__row {
-        margin-bottom: 15px;
-        border-bottom: 1px solid #b1b4b6
+        margin-bottom: 15px
     }
 }
 
@@ -2823,6 +2882,11 @@ screen and (forced-colors:active) {
     }
 }
 
+.govuk-summary-list__row--no-actions:after {
+    content: "";
+    display: table-cell
+}
+
 .govuk-summary-list__actions,
 .govuk-summary-list__key,
 .govuk-summary-list__value {
@@ -2837,8 +2901,7 @@ screen and (forced-colors:active) {
         display: table-cell;
         padding-top: 10px;
         padding-right: 20px;
-        padding-bottom: 10px;
-        border-bottom: 1px solid #b1b4b6
+        padding-bottom: 10px
     }
 }
 
@@ -2877,18 +2940,6 @@ screen and (forced-colors:active) {
     }
 }
 
-@media (min-width:40.0625em) {
-    .govuk-summary-list__value {
-        width: 50%
-    }
-}
-
-@media (min-width:40.0625em) {
-    .govuk-summary-list__value:last-child {
-        width: 70%
-    }
-}
-
 .govuk-summary-list__value>p {
     margin-bottom: 10px
 }
@@ -2919,10 +2970,8 @@ screen and (forced-colors:active) {
     border: 0
 }
 
-@media (max-width:40.0525em) {
-    .govuk-summary-list--no-border .govuk-summary-list__row {
-        border: 0
-    }
+.govuk-summary-list--no-border .govuk-summary-list__row {
+    border: 0
 }
 
 @media (min-width:40.0625em) {
@@ -2930,15 +2979,12 @@ screen and (forced-colors:active) {
     .govuk-summary-list--no-border .govuk-summary-list__actions,
     .govuk-summary-list--no-border .govuk-summary-list__key,
     .govuk-summary-list--no-border .govuk-summary-list__value {
-        padding-bottom: 11px;
-        border: 0
+        padding-bottom: 11px
     }
 }
 
-@media (max-width:40.0525em) {
-    .govuk-summary-list__row--no-border {
-        border: 0
-    }
+.govuk-summary-list__row--no-border {
+    border: 0
 }
 
 @media (min-width:40.0625em) {
@@ -2946,8 +2992,7 @@ screen and (forced-colors:active) {
     .govuk-summary-list__row--no-border .govuk-summary-list__actions,
     .govuk-summary-list__row--no-border .govuk-summary-list__key,
     .govuk-summary-list__row--no-border .govuk-summary-list__value {
-        padding-bottom: 11px;
-        border: 0
+        padding-bottom: 11px
     }
 }
 
@@ -3010,7 +3055,7 @@ screen and (forced-colors:active) {
 }
 
 .govuk-input--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-input--error:focus {
@@ -3714,17 +3759,11 @@ only screen and (min-resolution:192dpi) {
 }
 
 .govuk-footer__heading {
-    margin-bottom: 25px;
+    margin-bottom: 30px;
     padding-bottom: 20px;
     border-bottom: 1px solid #b1b4b6
 }
 
-@media (min-width:40.0625em) {
-    .govuk-footer__heading {
-        margin-bottom: 40px
-    }
-}
-
 @media (max-width:40.0525em) {
     .govuk-footer__heading {
         padding-bottom: 10px
@@ -3732,47 +3771,20 @@ only screen and (min-resolution:192dpi) {
 }
 
 .govuk-footer__navigation {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
     margin-right: -15px;
-    margin-left: -15px;
-    -webkit-flex-wrap: wrap;
-    -ms-flex-wrap: wrap;
-    flex-wrap: wrap
+    margin-left: -15px
+}
+
+.govuk-footer__navigation:after {
+    content: "";
+    display: block;
+    clear: both
 }
 
 .govuk-footer__section {
     display: inline-block;
-    margin-right: 15px;
     margin-bottom: 30px;
-    margin-left: 15px;
-    vertical-align: top;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    -webkit-flex-shrink: 1;
-    -ms-flex-negative: 1;
-    flex-shrink: 1
-}
-
-@media (max-width:48.0525em) {
-    .govuk-footer__section {
-        -webkit-flex-basis: 200px;
-        -ms-flex-preferred-size: 200px;
-        flex-basis: 200px
-    }
-}
-
-@media (min-width:48.0625em) {
-    .govuk-footer__section:first-child:nth-last-child(2) {
-        -webkit-box-flex: 2;
-        -webkit-flex-grow: 2;
-        -ms-flex-positive: 2;
-        flex-grow: 2
-    }
+    vertical-align: top
 }
 
 .govuk-footer__list {
@@ -4155,19 +4167,18 @@ only screen and (min-resolution:192dpi) {
     border-bottom-color: inherit
 }
 
-.govuk-header__navigation {
-    display: block;
-    margin: 0;
-    padding: 0;
-    list-style: none
-}
-
-@media (min-width:40.0625em) {
+@media (min-width:48.0625em) {
     .govuk-header__navigation {
         margin-bottom: 10px
     }
 }
 
+.govuk-header__navigation-list {
+    margin: 0;
+    padding: 0;
+    list-style: none
+}
+
 .js-enabled .govuk-header__menu-button {
     display: block
 }
@@ -4178,17 +4189,17 @@ only screen and (min-resolution:192dpi) {
     }
 }
 
-.js-enabled .govuk-header__navigation {
+.js-enabled .govuk-header__navigation-list {
     display: none
 }
 
 @media (min-width:48.0625em) {
-    .js-enabled .govuk-header__navigation {
+    .js-enabled .govuk-header__navigation-list {
         display: block
     }
 }
 
-.js-enabled .govuk-header__navigation--open {
+.js-enabled .govuk-header__navigation-list--open {
     display: block
 }
 
@@ -4261,7 +4272,8 @@ only screen and (min-resolution:192dpi) {
 }
 
 .govuk-header__navigation-item:last-child {
-    margin-right: 0
+    margin-right: 0;
+    border-bottom: 0
 }
 
 @media print {
@@ -4517,10 +4529,7 @@ only screen and (min-resolution:192dpi) {
     color: #003078
 }
 
-.govuk-notification-banner__link:active {
-    color: #0b0c0c
-}
-
+.govuk-notification-banner__link:active,
 .govuk-notification-banner__link:focus {
     color: #0b0c0c
 }
@@ -4585,7 +4594,9 @@ only screen and (min-resolution:192dpi) {
 
 @media (max-width:40.0525em) {
     .govuk-panel {
-        padding: 25px
+        padding: 10px;
+        overflow-wrap: break-word;
+        word-wrap: break-word
     }
 }
 
@@ -4710,10 +4721,6 @@ only screen and (min-resolution:192dpi) {
     }
 }
 
-.govuk-tag--inactive {
-    background-color: #505a5f
-}
-
 .govuk-tag--grey {
     color: #383f43;
     background: #eeefef
@@ -4946,10 +4953,7 @@ only screen and (min-resolution:192dpi) {
     color: #003078
 }
 
-.govuk-tabs__tab:active {
-    color: #0b0c0c
-}
-
+.govuk-tabs__tab:active,
 .govuk-tabs__tab:focus {
     color: #0b0c0c
 }
@@ -5406,7 +5410,7 @@ screen and (forced-colors:active) {
 }
 
 .govuk-select--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-select--error:focus {
@@ -5511,6 +5515,10 @@ screen and (forced-colors:active) {
     background-color: #fd0
 }
 
+.govuk-skip-link-focused-element:focus {
+    outline: none
+}
+
 .govuk-table {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
@@ -6897,6 +6905,18 @@ screen and (forced-colors:active) {
     }
 }
 
+.govuk-\!-text-align-left {
+    text-align: left !important
+}
+
+.govuk-\!-text-align-centre {
+    text-align: center !important
+}
+
+.govuk-\!-text-align-right {
+    text-align: right !important
+}
+
 .govuk-\!-font-size-80 {
     font-size: 53px !important;
     font-size: 3.3125rem !important;
diff --git a/dist/govuk-frontend-3.13.1.min.js b/dist/govuk-frontend-4.0.0.min.js
similarity index 11%
rename from dist/govuk-frontend-3.13.1.min.js
rename to dist/govuk-frontend-4.0.0.min.js
index e9366b04..56ea78f8 100644
--- a/dist/govuk-frontend-3.13.1.min.js
+++ b/dist/govuk-frontend-4.0.0.min.js
@@ -3,15 +3,15 @@
 }(this, function(t) {
     "use strict";
 
-    function r(t, e) {
+    function s(t, e) {
         if (window.NodeList.prototype.forEach) return t.forEach(e);
         for (var n = 0; n < t.length; n++) e.call(window, t[n], n, t)
     }
 
     function n(t) {
-        this.$module = t, this.moduleId = t.getAttribute("id"), this.$sections = t.querySelectorAll(".govuk-accordion__section"), this.$openAllButton = "", this.browserSupportsSessionStorage = e.checkForSessionStorage(), this.controlsClass = "govuk-accordion__controls", this.openAllClass = "govuk-accordion__open-all", this.iconClass = "govuk-accordion__icon", this.sectionHeaderClass = "govuk-accordion__section-header", this.sectionHeaderFocusedClass = "govuk-accordion__section-header--focused", this.sectionHeadingClass = "govuk-accordion__section-heading", this.sectionSummaryClass = "govuk-accordion__section-summary", this.sectionButtonClass = "govuk-accordion__section-button", this.sectionExpandedClass = "govuk-accordion__section--expanded"
+        this.$module = t, this.moduleId = t.getAttribute("id"), this.$sections = t.querySelectorAll(".govuk-accordion__section"), this.$showAllButton = "", this.browserSupportsSessionStorage = e.checkForSessionStorage(), this.controlsClass = "govuk-accordion__controls", this.showAllClass = "govuk-accordion__show-all", this.showAllTextClass = "govuk-accordion__show-all-text", this.sectionExpandedClass = "govuk-accordion__section--expanded", this.sectionButtonClass = "govuk-accordion__section-button", this.sectionHeaderClass = "govuk-accordion__section-header", this.sectionHeadingClass = "govuk-accordion__section-heading", this.sectionHeadingTextClass = "govuk-accordion__section-heading-text", this.sectionHeadingTextFocusClass = "govuk-accordion__section-heading-text-focus", this.sectionShowHideToggleClass = "govuk-accordion__section-toggle", this.sectionShowHideToggleFocusClass = "govuk-accordion__section-toggle-focus", this.sectionShowHideTextClass = "govuk-accordion__section-toggle-text", this.upChevronIconClass = "govuk-accordion-nav__chevron", this.downChevronIconClass = "govuk-accordion-nav__chevron--down", this.sectionSummaryClass = "govuk-accordion__section-summary", this.sectionSummaryFocusClass = "govuk-accordion__section-summary-focus"
     }(function(t) {
-        var a, c, l, u;
+        var a, l, c, u;
         "defineProperty" in Object && function() {
             try {
                 return Object.defineProperty({}, "test", {
@@ -20,23 +20,23 @@
             } catch (t) {
                 return !1
             }
-        }() || (a = Object.defineProperty, c = Object.prototype.hasOwnProperty("__defineGetter__"), l = "Getters & setters cannot be defined on this javascript engine", u = "A property cannot both have accessors and be writable or have a value", Object.defineProperty = function(t, e, n) {
+        }() || (a = Object.defineProperty, l = Object.prototype.hasOwnProperty("__defineGetter__"), c = "Getters & setters cannot be defined on this javascript engine", u = "A property cannot both have accessors and be writable or have a value", Object.defineProperty = function(t, e, n) {
             if (a && (t === window || t === document || t === Element.prototype || t instanceof Element)) return a(t, e, n);
             if (null === t || !(t instanceof Object || "object" == typeof t)) throw new TypeError("Object.defineProperty called on non-object");
             if (!(n instanceof Object)) throw new TypeError("Property description must be an object");
             var o = String(e),
                 i = "value" in n || "writable" in n,
-                r = "get" in n && typeof n.get,
-                s = "set" in n && typeof n.set;
-            if (r) {
-                if ("function" !== r) throw new TypeError("Getter must be a function");
-                if (!c) throw new TypeError(l);
+                s = "get" in n && typeof n.get,
+                r = "set" in n && typeof n.set;
+            if (s) {
+                if ("function" !== s) throw new TypeError("Getter must be a function");
+                if (!l) throw new TypeError(c);
                 if (i) throw new TypeError(u);
                 Object.__defineGetter__.call(t, o, n.get)
             } else t[o] = n.value;
-            if (s) {
-                if ("function" !== s) throw new TypeError("Setter must be a function");
-                if (!c) throw new TypeError(l);
+            if (r) {
+                if ("function" !== r) throw new TypeError("Setter must be a function");
+                if (!l) throw new TypeError(c);
                 if (i) throw new TypeError(u);
                 Object.__defineSetter__.call(t, o, n.set)
             }
@@ -49,38 +49,38 @@
                     var n, t = Array,
                         o = Object,
                         i = o.prototype,
-                        r = t.prototype,
-                        s = function s() {},
+                        s = t.prototype,
+                        r = function r() {},
                         a = i.toString,
-                        c = "function" == typeof Symbol && "symbol" == typeof Symbol.toStringTag,
-                        l = Function.prototype.toString,
+                        l = "function" == typeof Symbol && "symbol" == typeof Symbol.toStringTag,
+                        c = Function.prototype.toString,
                         u = function u(t) {
                             try {
-                                return l.call(t), !0
+                                return c.call(t), !0
                             } catch (e) {
                                 return !1
                             }
                         };
                     n = function n(t) {
                         if ("function" != typeof t) return !1;
-                        if (c) return u(t);
+                        if (l) return u(t);
                         var e = a.call(t);
                         return "[object Function]" === e || "[object GeneratorFunction]" === e
                     };
-                    var d = r.slice,
-                        h = r.concat,
-                        p = r.push,
+                    var d = s.slice,
+                        h = s.concat,
+                        p = s.push,
                         f = Math.max,
-                        b = this;
-                    if (!n(b)) throw new TypeError("Function.prototype.bind called on incompatible " + b);
-                    for (var m, y = d.call(arguments, 1), v = f(0, b.length - y.length), g = [], w = 0; w < v; w++) p.call(g, "$" + w);
-                    return m = Function("binder", "return function (" + g.join(",") + "){ return binder.apply(this, arguments); }")(function() {
-                        if (this instanceof m) {
-                            var t = b.apply(this, h.call(y, d.call(arguments)));
+                        m = this;
+                    if (!n(m)) throw new TypeError("Function.prototype.bind called on incompatible " + m);
+                    for (var b, v = d.call(arguments, 1), y = f(0, m.length - v.length), g = [], w = 0; w < y; w++) p.call(g, "$" + w);
+                    return b = Function("binder", "return function (" + g.join(",") + "){ return binder.apply(this, arguments); }")(function() {
+                        if (this instanceof b) {
+                            var t = m.apply(this, h.call(v, d.call(arguments)));
                             return o(t) === t ? t : this
                         }
-                        return b.apply(e, h.call(y, d.call(arguments)))
-                    }), b.prototype && (s.prototype = b.prototype, m.prototype = new s, s.prototype = null), m
+                        return m.apply(e, h.call(v, d.call(arguments)))
+                    }), m.prototype && (r.prototype = m.prototype, b.prototype = new r, r.prototype = null), b
                 }
             })
         }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}),
@@ -99,20 +99,20 @@
                 } catch (t) {
                     i = !1
                 }
-                return function(i, r) {
-                    var s = this,
+                return function(i, s) {
+                    var r = this,
                         a = [],
-                        c = {},
-                        l = 0,
+                        l = {},
+                        c = 0,
                         t = 0,
                         e = function(t) {
-                            n(s, t, function() {
+                            n(r, t, function() {
                                 return d(), a[t]
                             }, !1)
                         },
                         u = function() {
-                            if (t <= l)
-                                for (; t < l; ++t) e(t)
+                            if (t <= c)
+                                for (; t < c; ++t) e(t)
                         },
                         d = function() {
                             var t, e, n = arguments,
@@ -120,29 +120,29 @@
                             if (n.length)
                                 for (e = 0; e < n.length; ++e)
                                     if (o.test(n[e])) throw (t = new SyntaxError('String "' + n[e] + '" contains an invalid character')).code = 5, t.name = "InvalidCharacterError", t;
-                            for ("" === (a = "object" == typeof i[r] ? ("" + i[r].baseVal).replace(/^\s+|\s+$/g, "").split(o) : ("" + i[r]).replace(/^\s+|\s+$/g, "").split(o))[0] && (a = []), c = {}, e = 0; e < a.length; ++e) c[a[e]] = !0;
-                            l = a.length, u()
+                            for ("" === (a = "object" == typeof i[s] ? ("" + i[s].baseVal).replace(/^\s+|\s+$/g, "").split(o) : ("" + i[s]).replace(/^\s+|\s+$/g, "").split(o))[0] && (a = []), l = {}, e = 0; e < a.length; ++e) l[a[e]] = !0;
+                            c = a.length, u()
                         };
-                    return d(), n(s, "length", function() {
-                        return d(), l
-                    }), s.toLocaleString = s.toString = function() {
+                    return d(), n(r, "length", function() {
+                        return d(), c
+                    }), r.toLocaleString = r.toString = function() {
                         return d(), a.join(" ")
-                    }, s.item = function(t) {
+                    }, r.item = function(t) {
                         return d(), a[t]
-                    }, s.contains = function(t) {
-                        return d(), !!c[t]
-                    }, s.add = function() {
-                        d.apply(s, t = arguments);
-                        for (var t, e, n = 0, o = t.length; n < o; ++n) c[e = t[n]] || (a.push(e), c[e] = !0);
-                        l !== a.length && (l = a.length >>> 0, "object" == typeof i[r] ? i[r].baseVal = a.join(" ") : i[r] = a.join(" "), u())
-                    }, s.remove = function() {
-                        d.apply(s, t = arguments);
-                        for (var t, e = {}, n = 0, o = []; n < t.length; ++n) e[t[n]] = !0, delete c[t[n]];
+                    }, r.contains = function(t) {
+                        return d(), !!l[t]
+                    }, r.add = function() {
+                        d.apply(r, t = arguments);
+                        for (var t, e, n = 0, o = t.length; n < o; ++n) l[e = t[n]] || (a.push(e), l[e] = !0);
+                        c !== a.length && (c = a.length >>> 0, "object" == typeof i[s] ? i[s].baseVal = a.join(" ") : i[s] = a.join(" "), u())
+                    }, r.remove = function() {
+                        d.apply(r, t = arguments);
+                        for (var t, e = {}, n = 0, o = []; n < t.length; ++n) e[t[n]] = !0, delete l[t[n]];
                         for (n = 0; n < a.length; ++n) e[a[n]] || o.push(a[n]);
-                        l = (a = o).length >>> 0, "object" == typeof i[r] ? i[r].baseVal = a.join(" ") : i[r] = a.join(" "), u()
-                    }, s.toggle = function(t, e) {
-                        return d.apply(s, [t]), o !== e ? e ? (s.add(t), !0) : (s.remove(t), !1) : c[t] ? (s.remove(t), !1) : (s.add(t), !0)
-                    }, s
+                        c = (a = o).length >>> 0, "object" == typeof i[s] ? i[s].baseVal = a.join(" ") : i[s] = a.join(" "), u()
+                    }, r.toggle = function(t, e) {
+                        return d.apply(r, [t]), o !== e ? e ? (r.add(t), !0) : (r.remove(t), !1) : l[t] ? (r.remove(t), !1) : (r.add(t), !0)
+                    }, r
                 }
             }()), "classList" in (n = document.createElement("span")) && (n.classList.toggle("x", !1), n.classList.contains("x") && (n.classList.constructor.prototype.toggle = function(t) {
                 var e = arguments[1];
@@ -177,31 +177,31 @@
                     var t, e = document.appendChild(document.createElement("body")),
                         n = e.appendChild(document.createElement("iframe")).contentWindow.document,
                         a = Element.prototype = n.appendChild(n.createElement("*")),
-                        c = {},
-                        l = function(t, e) {
-                            var n, o, i, r = t.childNodes || [],
-                                s = -1;
+                        l = {},
+                        c = function(t, e) {
+                            var n, o, i, s = t.childNodes || [],
+                                r = -1;
                             if (1 === t.nodeType && t.constructor !== Element)
-                                for (n in t.constructor = Element, c) o = c[n], t[n] = o;
-                            for (; i = e && r[++s];) l(i, e);
+                                for (n in t.constructor = Element, l) o = l[n], t[n] = o;
+                            for (; i = e && s[++r];) c(i, e);
                             return t
                         },
                         u = document.getElementsByTagName("*"),
                         o = document.createElement,
                         i = 100;
                     a.attachEvent("onpropertychange", function(t) {
-                        for (var e, n = t.propertyName, o = !c.hasOwnProperty(n), i = a[n], r = c[n], s = -1; e = u[++s];) 1 === e.nodeType && (!o && e[n] !== r || (e[n] = i));
-                        c[n] = i
+                        for (var e, n = t.propertyName, o = !l.hasOwnProperty(n), i = a[n], s = l[n], r = -1; e = u[++r];) 1 === e.nodeType && (!o && e[n] !== s || (e[n] = i));
+                        l[n] = i
                     }), a.constructor = Element, a.hasAttribute || (a.hasAttribute = function(t) {
                         return null !== this.getAttribute(t)
-                    }), r() || (document.onreadystatechange = r, t = setInterval(r, 25)), document.createElement = function(t) {
+                    }), s() || (document.onreadystatechange = s, t = setInterval(s, 25)), document.createElement = function(t) {
                         var e = o(String(t).toLowerCase());
-                        return l(e)
+                        return c(e)
                     }, document.removeChild(e)
                 } else window.HTMLElement = window.Element;
 
-                function r() {
-                    return i-- || clearTimeout(t), !(!document.body || document.body.prototype || !/(complete|interactive)/.test(document.readyState)) && (l(document, !0), t && document.body.prototype && clearTimeout(t), !!document.body.prototype)
+                function s() {
+                    return i-- || clearTimeout(t), !(!document.body || document.body.prototype || !/(complete|interactive)/.test(document.readyState)) && (c(document, !0), t && document.body.prototype && clearTimeout(t), !!document.body.prototype)
                 }
             }()
         }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}),
@@ -220,19 +220,19 @@
                 } catch (e) {
                     u = !1
                 }
-                var h = function(t, c, l) {
-                    d(t.prototype, c, function() {
+                var h = function(t, l, c) {
+                    d(t.prototype, l, function() {
                         var t, e = this,
-                            n = "__defineGetter__DEFINE_PROPERTY" + c;
+                            n = "__defineGetter__DEFINE_PROPERTY" + l;
                         if (e[n]) return t;
                         if (!(e[n] = !0) === u) {
-                            for (var o, i = h.mirror || document.createElement("div"), r = i.childNodes, s = r.length, a = 0; a < s; ++a)
-                                if (r[a]._R === e) {
-                                    o = r[a];
+                            for (var o, i = h.mirror || document.createElement("div"), s = i.childNodes, r = s.length, a = 0; a < r; ++a)
+                                if (s[a]._R === e) {
+                                    o = s[a];
                                     break
-                                } o = o || i.appendChild(document.createElement("div")), t = DOMTokenList.call(o, e, l)
-                        } else t = new DOMTokenList(e, l);
-                        return d(e, c, function() {
+                                } o = o || i.appendChild(document.createElement("div")), t = DOMTokenList.call(o, e, c)
+                        } else t = new DOMTokenList(e, c);
+                        return d(e, l, function() {
                             return t
                         }), delete e[n], t
                     }, !0)
@@ -243,56 +243,81 @@
             if (this.$module) {
                 this.initControls(), this.initSectionHeaders();
                 var t = this.checkIfAllSectionsOpen();
-                this.updateOpenAllButton(t)
+                this.updateShowAllButton(t)
             }
         }, n.prototype.initControls = function() {
-            this.$openAllButton = document.createElement("button"), this.$openAllButton.setAttribute("type", "button"), this.$openAllButton.innerHTML = 'Open all <span class="govuk-visually-hidden">sections</span>', this.$openAllButton.setAttribute("class", this.openAllClass), this.$openAllButton.setAttribute("aria-expanded", "false"), this.$openAllButton.setAttribute("type", "button");
-            var t = document.createElement("div");
-            t.setAttribute("class", this.controlsClass), t.appendChild(this.$openAllButton), this.$module.insertBefore(t, this.$module.firstChild), this.$openAllButton.addEventListener("click", this.onOpenOrCloseAllToggle.bind(this))
+            this.$showAllButton = document.createElement("button"), this.$showAllButton.setAttribute("type", "button"), this.$showAllButton.setAttribute("class", this.showAllClass), this.$showAllButton.setAttribute("aria-expanded", "false");
+            var t = document.createElement("span");
+            t.classList.add(this.upChevronIconClass), this.$showAllButton.appendChild(t);
+            var e = document.createElement("div");
+            e.setAttribute("class", this.controlsClass), e.appendChild(this.$showAllButton), this.$module.insertBefore(e, this.$module.firstChild);
+            var n = document.createElement("span");
+            n.classList.add(this.showAllTextClass), this.$showAllButton.appendChild(n), this.$showAllButton.addEventListener("click", this.onShowOrHideAllToggle.bind(this))
         }, n.prototype.initSectionHeaders = function() {
-            r(this.$sections, function(t, e) {
+            s(this.$sections, function(t, e) {
                 var n = t.querySelector("." + this.sectionHeaderClass);
-                this.initHeaderAttributes(n, e), this.setExpanded(this.isExpanded(t), t), n.addEventListener("click", this.onSectionToggle.bind(this, t)), this.setInitialState(t)
+                this.constructHeaderMarkup(n, e), this.setExpanded(this.isExpanded(t), t), n.addEventListener("click", this.onSectionToggle.bind(this, t)), this.setInitialState(t)
             }.bind(this))
-        }, n.prototype.initHeaderAttributes = function(e, t) {
-            var n = this,
-                o = e.querySelector("." + this.sectionButtonClass),
-                i = e.querySelector("." + this.sectionHeadingClass),
-                r = e.querySelector("." + this.sectionSummaryClass),
+        }, n.prototype.constructHeaderMarkup = function(t, e) {
+            var n = t.querySelector("." + this.sectionButtonClass),
+                o = t.querySelector("." + this.sectionHeadingClass),
+                i = t.querySelector("." + this.sectionSummaryClass),
                 s = document.createElement("button");
-            s.setAttribute("type", "button"), s.setAttribute("id", this.moduleId + "-heading-" + (t + 1)), s.setAttribute("aria-controls", this.moduleId + "-content-" + (t + 1));
-            for (var a = 0; a < o.attributes.length; a++) {
-                var c = o.attributes.item(a);
-                s.setAttribute(c.nodeName, c.nodeValue)
+            s.setAttribute("type", "button"), s.setAttribute("aria-controls", this.moduleId + "-content-" + (e + 1));
+            for (var r = 0; r < n.attributes.length; r++) {
+                var a = n.attributes.item(r);
+                "id" !== a.nodeName && s.setAttribute(a.nodeName, a.nodeValue)
             }
-            s.addEventListener("focusin", function(t) {
-                e.classList.contains(n.sectionHeaderFocusedClass) || (e.className += " " + n.sectionHeaderFocusedClass)
-            }), s.addEventListener("blur", function(t) {
-                e.classList.remove(n.sectionHeaderFocusedClass)
-            }), null != r && s.setAttribute("aria-describedby", this.moduleId + "-summary-" + (t + 1)), s.innerHTML = o.innerHTML, i.removeChild(o), i.appendChild(s);
             var l = document.createElement("span");
-            l.className = this.iconClass, l.setAttribute("aria-hidden", "true"), s.appendChild(l)
+            l.classList.add(this.sectionHeadingTextClass), l.id = n.id;
+            var c = document.createElement("span");
+            c.classList.add(this.sectionHeadingTextFocusClass), l.appendChild(c), c.innerHTML = n.innerHTML;
+            var u = document.createElement("span");
+            u.classList.add(this.sectionShowHideToggleClass), u.setAttribute("data-nosnippet", "");
+            var d = document.createElement("span");
+            d.classList.add(this.sectionShowHideToggleFocusClass), u.appendChild(d);
+            var h = document.createElement("span"),
+                p = document.createElement("span");
+            if (p.classList.add(this.upChevronIconClass), d.appendChild(p), h.classList.add(this.sectionShowHideTextClass), d.appendChild(h), s.appendChild(l), s.appendChild(this.getButtonPunctuationEl()), null != i) {
+                var f = document.createElement("span"),
+                    m = document.createElement("span");
+                m.classList.add(this.sectionSummaryFocusClass), f.appendChild(m);
+                for (var b = 0, v = i.attributes.length; b < v; ++b) {
+                    var y = i.attributes.item(b).nodeName,
+                        g = i.attributes.item(b).nodeValue;
+                    f.setAttribute(y, g)
+                }
+                m.innerHTML = i.innerHTML, i.parentNode.replaceChild(f, i), s.appendChild(f), s.appendChild(this.getButtonPunctuationEl())
+            }
+            s.appendChild(u), o.removeChild(n), o.appendChild(s)
         }, n.prototype.onSectionToggle = function(t) {
             var e = this.isExpanded(t);
             this.setExpanded(!e, t), this.storeState(t)
-        }, n.prototype.onOpenOrCloseAllToggle = function() {
+        }, n.prototype.onShowOrHideAllToggle = function() {
             var e = this,
                 t = this.$sections,
                 n = !this.checkIfAllSectionsOpen();
-            r(t, function(t) {
+            s(t, function(t) {
                 e.setExpanded(n, t), e.storeState(t)
-            }), e.updateOpenAllButton(n)
+            }), e.updateShowAllButton(n)
         }, n.prototype.setExpanded = function(t, e) {
-            e.querySelector("." + this.sectionButtonClass).setAttribute("aria-expanded", t), t ? e.classList.add(this.sectionExpandedClass) : e.classList.remove(this.sectionExpandedClass);
-            var n = this.checkIfAllSectionsOpen();
-            this.updateOpenAllButton(n)
+            var n = e.querySelector("." + this.upChevronIconClass),
+                o = e.querySelector("." + this.sectionShowHideTextClass),
+                i = e.querySelector("." + this.sectionButtonClass),
+                s = t ? "Hide" : "Show",
+                r = document.createElement("span");
+            r.classList.add("govuk-visually-hidden"), r.innerHTML = " this section", o.innerHTML = s, o.appendChild(r), i.setAttribute("aria-expanded", t), t ? (e.classList.add(this.sectionExpandedClass), n.classList.remove(this.downChevronIconClass)) : (e.classList.remove(this.sectionExpandedClass), n.classList.add(this.downChevronIconClass));
+            var a = this.checkIfAllSectionsOpen();
+            this.updateShowAllButton(a)
         }, n.prototype.isExpanded = function(t) {
             return t.classList.contains(this.sectionExpandedClass)
         }, n.prototype.checkIfAllSectionsOpen = function() {
             return this.$sections.length === this.$module.querySelectorAll("." + this.sectionExpandedClass).length
-        }, n.prototype.updateOpenAllButton = function(t) {
-            var e = t ? "Close all" : "Open all";
-            e += '<span class="govuk-visually-hidden"> sections</span>', this.$openAllButton.setAttribute("aria-expanded", t), this.$openAllButton.innerHTML = e
+        }, n.prototype.updateShowAllButton = function(t) {
+            var e = this.$showAllButton.querySelector("." + this.upChevronIconClass),
+                n = this.$showAllButton.querySelector("." + this.showAllTextClass),
+                o = t ? "Hide all sections" : "Show all sections";
+            this.$showAllButton.setAttribute("aria-expanded", t), n.innerHTML = o, t ? e.classList.remove(this.downChevronIconClass) : e.classList.add(this.downChevronIconClass)
         };
     var e = {
         checkForSessionStorage: function() {
@@ -322,13 +347,16 @@
                     null !== o && this.setExpanded("true" === o, t)
                 }
             }
+        }, n.prototype.getButtonPunctuationEl = function() {
+            var t = document.createElement("span");
+            return t.classList.add("govuk-visually-hidden", "govuk-accordion__section-heading-divider"), t.innerHTML = ", ", t
         },
         function(t) {
             "Window" in this || "undefined" == typeof WorkerGlobalScope && "function" != typeof importScripts && function(t) {
                 t.constructor ? t.Window = t.constructor : (t.Window = t.constructor = new Function("return function Window() {}")()).prototype = this
             }(this)
         }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}),
-        function(r) {
+        function(s) {
             ! function(t) {
                 if (!("Event" in t)) return !1;
                 if ("function" == typeof t.Event) return !0;
@@ -362,34 +390,34 @@
                         var n;
                         if ("createEvent" in document) {
                             n = document.createEvent("Event");
-                            var o = !(!e || e.bubbles === r) && e.bubbles,
-                                i = !(!e || e.cancelable === r) && e.cancelable;
+                            var o = !(!e || e.bubbles === s) && e.bubbles,
+                                i = !(!e || e.cancelable === s) && e.cancelable;
                             return n.initEvent(t, o, i), n
                         }
-                        return (n = document.createEventObject()).type = t, n.bubbles = !(!e || e.bubbles === r) && e.bubbles, n.cancelable = !(!e || e.cancelable === r) && e.cancelable, n
+                        return (n = document.createEventObject()).type = t, n.bubbles = !(!e || e.bubbles === s) && e.bubbles, n.cancelable = !(!e || e.cancelable === s) && e.cancelable, n
                     }, t && Object.defineProperty(window.Event, "prototype", {
                         configurable: !1,
                         enumerable: !1,
                         writable: !0,
                         value: t
                     }), "createEvent" in document || (window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function() {
-                        var s = this,
+                        var r = this,
                             t = arguments[0],
                             e = arguments[1];
-                        if (s === window && t in n) throw new Error("In IE8 the event: " + t + " is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.");
-                        s._events || (s._events = {}), s._events[t] || (s._events[t] = function(t) {
-                            var e, n = s._events[t.type].list,
+                        if (r === window && t in n) throw new Error("In IE8 the event: " + t + " is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.");
+                        r._events || (r._events = {}), r._events[t] || (r._events[t] = function(t) {
+                            var e, n = r._events[t.type].list,
                                 o = n.slice(),
                                 i = -1,
-                                r = o.length;
+                                s = o.length;
                             for (t.preventDefault = function() {
                                     !1 !== t.cancelable && (t.returnValue = !1)
                                 }, t.stopPropagation = function() {
                                     t.cancelBubble = !0
                                 }, t.stopImmediatePropagation = function() {
                                     t.cancelBubble = !0, t.cancelImmediate = !0
-                                }, t.currentTarget = s, t.relatedTarget = t.fromElement || null, t.target = t.target || t.srcElement || s, t.timeStamp = (new Date).getTime(), t.clientX && (t.pageX = t.clientX + document.documentElement.scrollLeft, t.pageY = t.clientY + document.documentElement.scrollTop); ++i < r && !t.cancelImmediate;) i in o && -1 !== a(n, e = o[i]) && "function" == typeof e && e.call(s, t)
-                        }, s._events[t].list = [], s.attachEvent && s.attachEvent("on" + t, s._events[t])), s._events[t].list.push(e)
+                                }, t.currentTarget = r, t.relatedTarget = t.fromElement || null, t.target = t.target || t.srcElement || r, t.timeStamp = (new Date).getTime(), t.clientX && (t.pageX = t.clientX + document.documentElement.scrollLeft, t.pageY = t.clientY + document.documentElement.scrollTop); ++i < s && !t.cancelImmediate;) i in o && -1 !== a(n, e = o[i]) && "function" == typeof e && e.call(r, t)
+                        }, r._events[t].list = [], r.attachEvent && r.attachEvent("on" + t, r._events[t])), r._events[t].list.push(e)
                     }, window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function() {
                         var t, e = this,
                             n = arguments[0],
@@ -447,19 +475,19 @@
         this.$module = t
     }
 
-    function s(t) {
-        this.$module = t, this.$textarea = t.querySelector(".govuk-js-character-count"), this.$textarea && (this.$countMessage = t.querySelector('[id="' + this.$textarea.id + '-info"]'))
+    function r(t) {
+        this.$module = t, this.$textarea = t.querySelector(".govuk-js-character-count"), this.$textarea && (this.$countMessage = document.getElementById(this.$textarea.id + "-info"))
     }
 
     function a(t) {
         this.$module = t, this.$inputs = t.querySelectorAll('input[type="checkbox"]')
     }
 
-    function c(t) {
+    function l(t) {
         this.$module = t
     }
 
-    function l(t) {
+    function c(t) {
         this.$module = t
     }
 
@@ -472,6 +500,10 @@
     }
 
     function h(t) {
+        this.$module = t, this.$linkedElement = null, this.linkedElementListener = !1
+    }
+
+    function p(t) {
         this.$module = t, this.$tabs = t.querySelectorAll(".govuk-tabs__tab"), this.keys = {
             left: 37,
             right: 39,
@@ -507,10 +539,10 @@
                 var e = t.target;
                 32 === t.keyCode && "summary" === e.nodeName.toLowerCase() && t.preventDefault()
             }), t.addEventListener("click", n)
-        }, s.prototype.defaults = {
+        }, r.prototype.defaults = {
             characterCountAttribute: "data-maxlength",
             wordCountAttribute: "data-maxwords"
-        }, s.prototype.init = function() {
+        }, r.prototype.init = function() {
             var t = this.$module,
                 e = this.$textarea,
                 n = this.$countMessage;
@@ -519,63 +551,63 @@
                 var o = this.defaults.characterCountAttribute;
                 this.options.maxwords && (o = this.defaults.wordCountAttribute), this.maxLength = t.getAttribute(o), this.maxLength && (t.removeAttribute("maxlength"), "onpageshow" in window ? window.addEventListener("pageshow", this.sync.bind(this)) : window.addEventListener("DOMContentLoaded", this.sync.bind(this)), this.sync())
             }
-        }, s.prototype.sync = function() {
+        }, r.prototype.sync = function() {
             this.bindChangeEvents(), this.updateCountMessage()
-        }, s.prototype.getDataset = function(t) {
+        }, r.prototype.getDataset = function(t) {
             var e = {},
                 n = t.attributes;
             if (n)
                 for (var o = 0; o < n.length; o++) {
                     var i = n[o],
-                        r = i.name.match(/^data-(.+)/);
-                    r && (e[r[1]] = i.value)
+                        s = i.name.match(/^data-(.+)/);
+                    s && (e[s[1]] = i.value)
                 }
             return e
-        }, s.prototype.count = function(t) {
+        }, r.prototype.count = function(t) {
             var e;
             this.options.maxwords ? e = (t.match(/\S+/g) || []).length : e = t.length;
             return e
-        }, s.prototype.bindChangeEvents = function() {
+        }, r.prototype.bindChangeEvents = function() {
             var t = this.$textarea;
             t.addEventListener("keyup", this.checkIfValueChanged.bind(this)), t.addEventListener("focus", this.handleFocus.bind(this)), t.addEventListener("blur", this.handleBlur.bind(this))
-        }, s.prototype.checkIfValueChanged = function() {
+        }, r.prototype.checkIfValueChanged = function() {
             this.$textarea.oldValue || (this.$textarea.oldValue = ""), this.$textarea.value !== this.$textarea.oldValue && (this.$textarea.oldValue = this.$textarea.value, this.updateCountMessage())
-        }, s.prototype.updateCountMessage = function() {
+        }, r.prototype.updateCountMessage = function() {
             var t = this.$textarea,
                 e = this.options,
                 n = this.$countMessage,
                 o = this.count(t.value),
                 i = this.maxLength,
-                r = i - o;
-            o < i * (e.threshold ? e.threshold : 0) / 100 ? (n.classList.add("govuk-character-count__message--disabled"), n.setAttribute("aria-hidden", !0)) : (n.classList.remove("govuk-character-count__message--disabled"), n.removeAttribute("aria-hidden")), r < 0 ? (t.classList.add("govuk-textarea--error"), n.classList.remove("govuk-hint"), n.classList.add("govuk-error-message")) : (t.classList.remove("govuk-textarea--error"), n.classList.remove("govuk-error-message"), n.classList.add("govuk-hint"));
-            var s, a, c = "character";
-            e.maxwords && (c = "word"), c += -1 == r || 1 == r ? "" : "s", s = r < 0 ? "too many" : "remaining", a = Math.abs(r), n.innerHTML = "You have " + a + " " + c + " " + s
-        }, s.prototype.handleFocus = function() {
+                s = i - o;
+            o < i * (e.threshold ? e.threshold : 0) / 100 ? (n.classList.add("govuk-character-count__message--disabled"), n.setAttribute("aria-hidden", !0)) : (n.classList.remove("govuk-character-count__message--disabled"), n.removeAttribute("aria-hidden")), s < 0 ? (t.classList.add("govuk-textarea--error"), n.classList.remove("govuk-hint"), n.classList.add("govuk-error-message")) : (t.classList.remove("govuk-textarea--error"), n.classList.remove("govuk-error-message"), n.classList.add("govuk-hint"));
+            var r, a, l = "character";
+            e.maxwords && (l = "word"), l += -1 == s || 1 == s ? "" : "s", r = s < 0 ? "too many" : "remaining", a = Math.abs(s), n.innerHTML = "You have " + a + " " + l + " " + r
+        }, r.prototype.handleFocus = function() {
             this.valueChecker = setInterval(this.checkIfValueChanged.bind(this), 1e3)
-        }, s.prototype.handleBlur = function() {
+        }, r.prototype.handleBlur = function() {
             clearInterval(this.valueChecker)
         }, a.prototype.init = function() {
-            var n = this.$module;
-            r(this.$inputs, function(t) {
+            var t = this.$module;
+            s(this.$inputs, function(t) {
                 var e = t.getAttribute("data-aria-controls");
-                e && n.querySelector("#" + e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
-            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), n.addEventListener("click", this.handleClick.bind(this))
+                e && document.getElementById(e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
+            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), t.addEventListener("click", this.handleClick.bind(this))
         }, a.prototype.syncAllConditionalReveals = function() {
-            r(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
+            s(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
         }, a.prototype.syncConditionalRevealWithInputState = function(t) {
-            var e = this.$module.querySelector("#" + t.getAttribute("aria-controls"));
+            var e = document.getElementById(t.getAttribute("aria-controls"));
             if (e && e.classList.contains("govuk-checkboxes__conditional")) {
                 var n = t.checked;
                 t.setAttribute("aria-expanded", n), e.classList.toggle("govuk-checkboxes__conditional--hidden", !n)
             }
         }, a.prototype.unCheckAllInputsExcept = function(e) {
-            r(document.querySelectorAll('input[type="checkbox"][name="' + e.name + '"]'), function(t) {
-                e.form === t.form && t !== e && (t.checked = !1)
-            }), this.syncAllConditionalReveals()
+            s(document.querySelectorAll('input[type="checkbox"][name="' + e.name + '"]'), function(t) {
+                e.form === t.form && t !== e && (t.checked = !1, this.syncConditionalRevealWithInputState(t))
+            }.bind(this))
         }, a.prototype.unCheckExclusiveInputs = function(e) {
-            r(document.querySelectorAll('input[data-behaviour="exclusive"][type="checkbox"][name="' + e.name + '"]'), function(t) {
-                e.form === t.form && (t.checked = !1)
-            }), this.syncAllConditionalReveals()
+            s(document.querySelectorAll('input[data-behaviour="exclusive"][type="checkbox"][name="' + e.name + '"]'), function(t) {
+                e.form === t.form && (t.checked = !1, this.syncConditionalRevealWithInputState(t))
+            }.bind(this))
         }, a.prototype.handleClick = function(t) {
             var e = t.target;
             "checkbox" === e.type && (e.getAttribute("aria-controls") && this.syncConditionalRevealWithInputState(e), e.checked && ("exclusive" === e.getAttribute("data-behaviour") ? this.unCheckAllInputsExcept(e) : this.unCheckExclusiveInputs(e)))
@@ -594,13 +626,13 @@
                 }
                 return null
             })
-        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), c.prototype.init = function() {
+        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), l.prototype.init = function() {
             var t = this.$module;
             t && (t.focus(), t.addEventListener("click", this.handleClick.bind(this)))
-        }, c.prototype.handleClick = function(t) {
+        }, l.prototype.handleClick = function(t) {
             var e = t.target;
             this.focusTarget(e) && t.preventDefault()
-        }, c.prototype.focusTarget = function(t) {
+        }, l.prototype.focusTarget = function(t) {
             if ("A" !== t.tagName || !1 === t.href) return !1;
             var e = this.getFragmentFromUrl(t.href),
                 n = document.getElementById(e);
@@ -609,9 +641,9 @@
             return !!o && (o.scrollIntoView(), n.focus({
                 preventScroll: !0
             }), !0)
-        }, c.prototype.getFragmentFromUrl = function(t) {
+        }, l.prototype.getFragmentFromUrl = function(t) {
             return -1 !== t.indexOf("#") && t.split("#").pop()
-        }, c.prototype.getAssociatedLegendOrLabel = function(t) {
+        }, l.prototype.getAssociatedLegendOrLabel = function(t) {
             var e = t.closest("fieldset");
             if (e) {
                 var n = e.getElementsByTagName("legend");
@@ -619,46 +651,58 @@
                     var o = n[0];
                     if ("checkbox" === t.type || "radio" === t.type) return o;
                     var i = o.getBoundingClientRect().top,
-                        r = t.getBoundingClientRect();
-                    if (r.height && window.innerHeight)
-                        if (r.top + r.height - i < window.innerHeight / 2) return o
+                        s = t.getBoundingClientRect();
+                    if (s.height && window.innerHeight)
+                        if (s.top + s.height - i < window.innerHeight / 2) return o
                 }
             }
             return document.querySelector("label[for='" + t.getAttribute("id") + "']") || t.closest("label")
-        }, l.prototype.init = function() {
+        }, c.prototype.init = function() {
             this.$module && this.setFocus()
-        }, l.prototype.setFocus = function() {
+        }, c.prototype.setFocus = function() {
             var t = this.$module;
             "true" !== t.getAttribute("data-disable-auto-focus") && "alert" === t.getAttribute("role") && (t.getAttribute("tabindex") || (t.setAttribute("tabindex", "-1"), t.addEventListener("blur", function() {
                 t.removeAttribute("tabindex")
             })), t.focus())
         }, u.prototype.init = function() {
-            this.$module && this.$menuButton && this.$menu && (this.syncState(this.$menu.classList.contains("govuk-header__navigation--open")), this.$menuButton.addEventListener("click", this.handleMenuButtonClick.bind(this)))
+            this.$module && this.$menuButton && this.$menu && (this.syncState(this.$menu.classList.contains("govuk-header__navigation-list--open")), this.$menuButton.addEventListener("click", this.handleMenuButtonClick.bind(this)))
         }, u.prototype.syncState = function(t) {
             this.$menuButton.classList.toggle("govuk-header__menu-button--open", t), this.$menuButton.setAttribute("aria-expanded", t)
         }, u.prototype.handleMenuButtonClick = function() {
-            var t = this.$menu.classList.toggle("govuk-header__navigation--open");
+            var t = this.$menu.classList.toggle("govuk-header__navigation-list--open");
             this.syncState(t)
         }, d.prototype.init = function() {
-            var n = this.$module;
-            r(this.$inputs, function(t) {
+            var t = this.$module;
+            s(this.$inputs, function(t) {
                 var e = t.getAttribute("data-aria-controls");
-                e && n.querySelector("#" + e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
-            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), n.addEventListener("click", this.handleClick.bind(this))
+                e && document.getElementById(e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
+            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), t.addEventListener("click", this.handleClick.bind(this))
         }, d.prototype.syncAllConditionalReveals = function() {
-            r(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
+            s(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
         }, d.prototype.syncConditionalRevealWithInputState = function(t) {
-            var e = document.querySelector("#" + t.getAttribute("aria-controls"));
+            var e = document.getElementById(t.getAttribute("aria-controls"));
             if (e && e.classList.contains("govuk-radios__conditional")) {
                 var n = t.checked;
                 t.setAttribute("aria-expanded", n), e.classList.toggle("govuk-radios__conditional--hidden", !n)
             }
         }, d.prototype.handleClick = function(t) {
             var n = t.target;
-            "radio" === n.type && r(document.querySelectorAll('input[type="radio"][aria-controls]'), function(t) {
+            "radio" === n.type && s(document.querySelectorAll('input[type="radio"][aria-controls]'), function(t) {
                 var e = t.form === n.form;
                 t.name === n.name && e && this.syncConditionalRevealWithInputState(t)
             }.bind(this))
+        }, h.prototype.init = function() {
+            this.$module && (this.$linkedElement = this.getLinkedElement(), this.$linkedElement && this.$module.addEventListener("click", this.focusLinkedElement.bind(this)))
+        }, h.prototype.getLinkedElement = function() {
+            var t = this.getFragmentFromUrl();
+            return !!t && document.getElementById(t)
+        }, h.prototype.focusLinkedElement = function() {
+            var t = this.$linkedElement;
+            t.getAttribute("tabindex") || (t.setAttribute("tabindex", "-1"), t.classList.add("govuk-skip-link-focused-element"), this.linkedElementListener || (this.$linkedElement.addEventListener("blur", this.removeFocusProperties.bind(this)), this.linkedElementListener = !0)), t.focus()
+        }, h.prototype.removeFocusProperties = function() {
+            this.$linkedElement.removeAttribute("tabindex"), this.$linkedElement.classList.remove("govuk-skip-link-focused-element")
+        }, h.prototype.getFragmentFromUrl = function() {
+            return !!this.$module.hash && this.$module.hash.split("#").pop()
         },
         function(t) {
             "document" in this && "nextElementSibling" in document.documentElement || Object.defineProperty(Element.prototype, "nextElementSibling", {
@@ -675,37 +719,37 @@
                     return t
                 }
             })
-        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), h.prototype.init = function() {
+        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), p.prototype.init = function() {
             "function" == typeof window.matchMedia ? this.setupResponsiveChecks() : this.setup()
-        }, h.prototype.setupResponsiveChecks = function() {
+        }, p.prototype.setupResponsiveChecks = function() {
             this.mql = window.matchMedia("(min-width: 40.0625em)"), this.mql.addListener(this.checkMode.bind(this)), this.checkMode()
-        }, h.prototype.checkMode = function() {
+        }, p.prototype.checkMode = function() {
             this.mql.matches ? this.setup() : this.teardown()
-        }, h.prototype.setup = function() {
+        }, p.prototype.setup = function() {
             var t = this.$module,
                 e = this.$tabs,
                 n = t.querySelector(".govuk-tabs__list"),
                 o = t.querySelectorAll(".govuk-tabs__list-item");
             if (e && n && o) {
-                n.setAttribute("role", "tablist"), r(o, function(t) {
+                n.setAttribute("role", "tablist"), s(o, function(t) {
                     t.setAttribute("role", "presentation")
-                }), r(e, function(t) {
+                }), s(e, function(t) {
                     this.setAttributes(t), t.boundTabClick = this.onTabClick.bind(this), t.boundTabKeydown = this.onTabKeydown.bind(this), t.addEventListener("click", t.boundTabClick, !0), t.addEventListener("keydown", t.boundTabKeydown, !0), this.hideTab(t)
                 }.bind(this));
                 var i = this.getTab(window.location.hash) || this.$tabs[0];
                 this.showTab(i), t.boundOnHashChange = this.onHashChange.bind(this), window.addEventListener("hashchange", t.boundOnHashChange, !0)
             }
-        }, h.prototype.teardown = function() {
+        }, p.prototype.teardown = function() {
             var t = this.$module,
                 e = this.$tabs,
                 n = t.querySelector(".govuk-tabs__list"),
                 o = t.querySelectorAll(".govuk-tabs__list-item");
-            e && n && o && (n.removeAttribute("role"), r(o, function(t) {
+            e && n && o && (n.removeAttribute("role"), s(o, function(t) {
                 t.removeAttribute("role", "presentation")
-            }), r(e, function(t) {
+            }), s(e, function(t) {
                 t.removeEventListener("click", t.boundTabClick, !0), t.removeEventListener("keydown", t.boundTabKeydown, !0), this.unsetAttributes(t)
             }.bind(this)), window.removeEventListener("hashchange", t.boundOnHashChange, !0))
-        }, h.prototype.onHashChange = function(t) {
+        }, p.prototype.onHashChange = function(t) {
             var e = window.location.hash,
                 n = this.getTab(e);
             if (n)
@@ -714,32 +758,32 @@
                     var o = this.getCurrentTab();
                     this.hideTab(o), this.showTab(n), n.focus()
                 }
-        }, h.prototype.hideTab = function(t) {
+        }, p.prototype.hideTab = function(t) {
             this.unhighlightTab(t), this.hidePanel(t)
-        }, h.prototype.showTab = function(t) {
+        }, p.prototype.showTab = function(t) {
             this.highlightTab(t), this.showPanel(t)
-        }, h.prototype.getTab = function(t) {
+        }, p.prototype.getTab = function(t) {
             return this.$module.querySelector('.govuk-tabs__tab[href="' + t + '"]')
-        }, h.prototype.setAttributes = function(t) {
+        }, p.prototype.setAttributes = function(t) {
             var e = this.getHref(t).slice(1);
             t.setAttribute("id", "tab_" + e), t.setAttribute("role", "tab"), t.setAttribute("aria-controls", e), t.setAttribute("aria-selected", "false"), t.setAttribute("tabindex", "-1");
             var n = this.getPanel(t);
             n.setAttribute("role", "tabpanel"), n.setAttribute("aria-labelledby", t.id), n.classList.add(this.jsHiddenClass)
-        }, h.prototype.unsetAttributes = function(t) {
+        }, p.prototype.unsetAttributes = function(t) {
             t.removeAttribute("id"), t.removeAttribute("role"), t.removeAttribute("aria-controls"), t.removeAttribute("aria-selected"), t.removeAttribute("tabindex");
             var e = this.getPanel(t);
             e.removeAttribute("role"), e.removeAttribute("aria-labelledby"), e.classList.remove(this.jsHiddenClass)
-        }, h.prototype.onTabClick = function(t) {
+        }, p.prototype.onTabClick = function(t) {
             if (!t.target.classList.contains("govuk-tabs__tab")) return !1;
             t.preventDefault();
             var e = t.target,
                 n = this.getCurrentTab();
             this.hideTab(n), this.showTab(e), this.createHistoryEntry(e)
-        }, h.prototype.createHistoryEntry = function(t) {
+        }, p.prototype.createHistoryEntry = function(t) {
             var e = this.getPanel(t),
                 n = e.id;
             e.id = "", this.changingHash = !0, window.location.hash = this.getHref(t).slice(1), e.id = n
-        }, h.prototype.onTabKeydown = function(t) {
+        }, p.prototype.onTabKeydown = function(t) {
             switch (t.keyCode) {
                 case this.keys.left:
                 case this.keys.up:
@@ -749,49 +793,49 @@
                 case this.keys.down:
                     this.activateNextTab(), t.preventDefault()
             }
-        }, h.prototype.activateNextTab = function() {
+        }, p.prototype.activateNextTab = function() {
             var t = this.getCurrentTab(),
                 e = t.parentNode.nextElementSibling;
             if (e) var n = e.querySelector(".govuk-tabs__tab");
             n && (this.hideTab(t), this.showTab(n), n.focus(), this.createHistoryEntry(n))
-        }, h.prototype.activatePreviousTab = function() {
+        }, p.prototype.activatePreviousTab = function() {
             var t = this.getCurrentTab(),
                 e = t.parentNode.previousElementSibling;
             if (e) var n = e.querySelector(".govuk-tabs__tab");
             n && (this.hideTab(t), this.showTab(n), n.focus(), this.createHistoryEntry(n))
-        }, h.prototype.getPanel = function(t) {
+        }, p.prototype.getPanel = function(t) {
             return this.$module.querySelector(this.getHref(t))
-        }, h.prototype.showPanel = function(t) {
+        }, p.prototype.showPanel = function(t) {
             this.getPanel(t).classList.remove(this.jsHiddenClass)
-        }, h.prototype.hidePanel = function(t) {
+        }, p.prototype.hidePanel = function(t) {
             this.getPanel(t).classList.add(this.jsHiddenClass)
-        }, h.prototype.unhighlightTab = function(t) {
+        }, p.prototype.unhighlightTab = function(t) {
             t.setAttribute("aria-selected", "false"), t.parentNode.classList.remove("govuk-tabs__list-item--selected"), t.setAttribute("tabindex", "-1")
-        }, h.prototype.highlightTab = function(t) {
+        }, p.prototype.highlightTab = function(t) {
             t.setAttribute("aria-selected", "true"), t.parentNode.classList.add("govuk-tabs__list-item--selected"), t.setAttribute("tabindex", "0")
-        }, h.prototype.getCurrentTab = function() {
+        }, p.prototype.getCurrentTab = function() {
             return this.$module.querySelector(".govuk-tabs__list-item--selected .govuk-tabs__tab")
-        }, h.prototype.getHref = function(t) {
+        }, p.prototype.getHref = function(t) {
             var e = t.getAttribute("href");
             return e.slice(e.indexOf("#"), e.length)
-        }, t.initAll = function p(t) {
+        }, t.initAll = function f(t) {
             var e = "undefined" != typeof(t = void 0 !== t ? t : {}).scope ? t.scope : document;
-            r(e.querySelectorAll('[data-module="govuk-button"]'), function(t) {
+            s(e.querySelectorAll('[data-module="govuk-button"]'), function(t) {
                 new o(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-accordion"]'), function(t) {
+            }), s(e.querySelectorAll('[data-module="govuk-accordion"]'), function(t) {
                 new n(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-details"]'), function(t) {
+            }), s(e.querySelectorAll('[data-module="govuk-details"]'), function(t) {
                 new i(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-character-count"]'), function(t) {
-                new s(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-checkboxes"]'), function(t) {
+            }), s(e.querySelectorAll('[data-module="govuk-character-count"]'), function(t) {
+                new r(t).init()
+            }), s(e.querySelectorAll('[data-module="govuk-checkboxes"]'), function(t) {
                 new a(t).init()
-            }), new c(e.querySelector('[data-module="govuk-error-summary"]')).init(), new u(e.querySelector('[data-module="govuk-header"]')).init(), r(e.querySelectorAll('[data-module="govuk-notification-banner"]'), function(t) {
-                new l(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-radios"]'), function(t) {
+            }), new l(e.querySelector('[data-module="govuk-error-summary"]')).init(), new u(e.querySelector('[data-module="govuk-header"]')).init(), s(e.querySelectorAll('[data-module="govuk-notification-banner"]'), function(t) {
+                new c(t).init()
+            }), s(e.querySelectorAll('[data-module="govuk-radios"]'), function(t) {
                 new d(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-tabs"]'), function(t) {
-                new h(t).init()
+            }), new h(e.querySelector('[data-module="govuk-skip-link"]')).init(), s(e.querySelectorAll('[data-module="govuk-tabs"]'), function(t) {
+                new p(t).init()
             })
-        }, t.Accordion = n, t.Button = o, t.Details = i, t.CharacterCount = s, t.Checkboxes = a, t.ErrorSummary = c, t.Header = u, t.Radios = d, t.Tabs = h
+        }, t.Accordion = n, t.Button = o, t.Details = i, t.CharacterCount = r, t.Checkboxes = a, t.ErrorSummary = l, t.Header = u, t.NotificationBanner = c, t.Radios = d, t.SkipLink = h, t.Tabs = p
 });
\ No newline at end of file
diff --git a/dist/govuk-frontend-ie8-3.13.1.min.css b/dist/govuk-frontend-ie8-4.0.0.min.css
similarity index 5%
rename from dist/govuk-frontend-ie8-3.13.1.min.css
rename to dist/govuk-frontend-ie8-4.0.0.min.css
index ee0ca6f6..fb7224dd 100644
--- a/dist/govuk-frontend-ie8-3.13.1.min.css
+++ b/dist/govuk-frontend-ie8-4.0.0.min.css
@@ -23,10 +23,7 @@
     color: #003078
 }
 
-.govuk-link:active {
-    color: #0b0c0c
-}
-
+.govuk-link:active,
 .govuk-link:focus {
     color: #0b0c0c
 }
@@ -37,14 +34,8 @@
 }
 
 .govuk-link--muted:active,
-.govuk-link--muted:hover {
-    color: #0b0c0c
-}
-
-.govuk-link--muted:focus {
-    color: #0b0c0c
-}
-
+.govuk-link--muted:focus,
+.govuk-link--muted:hover,
 .govuk-link--text-colour:link,
 .govuk-link--text-colour:visited {
     color: #0b0c0c
@@ -86,11 +77,9 @@
     color: #003078
 }
 
-.govuk-link--no-visited-state:active {
-    color: #0b0c0c
-}
-
-.govuk-link--no-visited-state:focus {
+.govuk-link--no-visited-state:active,
+.govuk-link--no-visited-state:focus,
+.govuk-list {
     color: #0b0c0c
 }
 
@@ -105,7 +94,6 @@
     font-size: 19px;
     font-size: 1.1875rem;
     line-height: 1.31579;
-    color: #0b0c0c;
     margin-top: 0;
     margin-bottom: 20px;
     padding-left: 0;
@@ -139,19 +127,6 @@
     margin-bottom: 15px
 }
 
-.govuk-template {
-    background-color: #f3f2f1;
-    -webkit-text-size-adjust: 100%;
-    -ms-text-size-adjust: 100%;
-    text-size-adjust: 100%;
-    overflow-y: scroll
-}
-
-.govuk-template__body {
-    margin: 0;
-    background-color: #fff
-}
-
 .govuk-heading-xl {
     color: #0b0c0c;
     font-family: GDS Transport, arial, sans-serif;
@@ -564,6 +539,19 @@
     padding-top: 50px
 }
 
+.govuk-template {
+    background-color: #f3f2f1;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+    text-size-adjust: 100%;
+    overflow-y: scroll
+}
+
+.govuk-template__body {
+    margin: 0;
+    background-color: #fff
+}
+
 .govuk-width-container {
     max-width: 960px;
     width: 960px;
@@ -588,39 +576,31 @@
     padding-top: 15px
 }
 
-.govuk-accordion__section-header {
+.govuk-accordion__section-heading {
+    margin-top: 0;
+    margin-bottom: 0;
     padding-top: 15px;
     padding-bottom: 15px
 }
 
-.govuk-accordion__section-heading {
-    font-weight: 400;
-    margin-top: 0
+.govuk-accordion__section-button {
+    color: #0b0c0c;
+    display: block;
+    margin-bottom: 0;
+    padding-top: 15px
 }
 
-.govuk-accordion__section-button,
-.govuk-accordion__section-heading {
+.govuk-accordion__section-heading-text {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
     -moz-osx-font-smoothing: grayscale;
+    font-weight: 700;
     font-size: 18px;
     font-size: 1.125rem;
     line-height: 1.11111;
     font-size: 24px;
     font-size: 1.5rem;
-    line-height: 1.25;
-    margin-bottom: 0
-}
-
-.govuk-accordion__section-button {
-    font-weight: 700;
-    display: inline-block;
-    padding-top: 15px
-}
-
-.govuk-accordion__section-summary {
-    margin-top: 10px;
-    margin-bottom: 0
+    line-height: 1.25
 }
 
 .govuk-accordion__section-content>:last-child {
@@ -637,158 +617,230 @@
 
 .js-enabled .govuk-accordion__section-content {
     display: none;
-    padding-top: 15px;
-    padding-bottom: 15px
+    padding-bottom: 50px
 }
 
 .js-enabled .govuk-accordion__section--expanded .govuk-accordion__section-content {
     display: block
 }
 
-.js-enabled .govuk-accordion__open-all {
+.js-enabled .govuk-accordion__show-all {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 400;
-    font-size: 14px;
-    font-size: .875rem;
-    line-height: 1.14286;
     font-size: 16px;
     font-size: 1rem;
     line-height: 1.25;
+    font-size: 19px;
+    font-size: 1.1875rem;
+    line-height: 1.31579;
     position: relative;
     z-index: 1;
-    margin: 0;
-    padding: 0;
+    padding: 5px 2px 5px 0;
     border-width: 0;
     color: #1d70b8;
     background: none;
     cursor: pointer;
     -webkit-appearance: none;
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    text-decoration: underline
+    margin-bottom: 14px
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
+.js-enabled .govuk-accordion__show-all::-moz-focus-inner {
+    padding: 0;
+    border: 0
+}
+
+.js-enabled .govuk-accordion__show-all:hover {
+    color: #0b0c0c;
+    background: #f3f2f1;
+    box-shadow: 0 -2px #f3f2f1, 0 4px #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:focus {
+    color: #0b0c0c;
     background-color: #fd0;
     box-shadow: 0 -2px #fd0, 0 4px #0b0c0c;
     text-decoration: none
 }
 
-.js-enabled .govuk-accordion__open-all:link {
-    color: #1d70b8
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron {
+    background: #0b0c0c
 }
 
-.js-enabled .govuk-accordion__open-all:visited {
-    color: #4c2c92
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
 }
 
-.js-enabled .govuk-accordion__open-all:hover {
-    color: #003078
+.js-enabled .govuk-accordion__section-heading {
+    padding: 0
 }
 
-.js-enabled .govuk-accordion__open-all:active {
-    color: #0b0c0c
+.js-enabled .govuk-accordion-nav__chevron {
+    box-sizing: border-box;
+    position: relative;
+    width: 1.25rem;
+    height: 1.25rem;
+    border: .0625rem solid;
+    border-radius: 50%;
+    vertical-align: middle;
+    display: inline-block;
+    max-height: 20px;
+    line-height: 1
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
-    color: #0b0c0c
+.js-enabled .govuk-accordion-nav__chevron:after {
+    content: "";
+    box-sizing: border-box;
+    display: block;
+    position: absolute;
+    bottom: .3125rem;
+    left: .375rem;
+    width: .375rem;
+    height: .375rem;
+    -webkit-transform: rotate(-45deg);
+    -ms-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+    content: "\25B2";
+    position: relative;
+    border: 0
 }
 
-.js-enabled .govuk-accordion__open-all::-moz-focus-inner {
-    padding: 0;
-    border: 0
+.js-enabled .govuk-accordion-nav__chevron--down {
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg)
 }
 
-.js-enabled .govuk-accordion__section-header {
-    position: relative;
-    padding-right: 40px;
-    border-top: 1px solid #b1b4b6;
-    cursor: pointer
+.js-enabled .govuk-accordion-nav__chevron--down:after {
+    content: "\25BC";
+    -webkit-transform: none;
+    -ms-transform: none;
+    transform: none
 }
 
 .js-enabled .govuk-accordion__section-button {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 0;
-    padding: 0;
-    border-width: 0;
-    color: #1d70b8;
+    width: 100%;
+    border: 0;
+    border-top: 1px solid #b1b4b6;
+    border-bottom: 10px solid transparent;
+    color: #0b0c0c;
     background: none;
     text-align: left;
     cursor: pointer;
-    -webkit-appearance: none
+    -webkit-appearance: none;
+    padding: 10px 0
+}
+
+.js-enabled .govuk-accordion__section-button:active {
+    color: #0b0c0c;
+    background: none
+}
+
+.js-enabled .govuk-accordion__section-button:hover {
+    color: #0b0c0c;
+    background: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
 }
 
 .js-enabled .govuk-accordion__section-button:focus {
+    outline: 0
+}
+
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
     color: #0b0c0c;
     background-color: #fd0;
     box-shadow: 0 -2px #fd0, 0 4px #0b0c0c;
     text-decoration: none
 }
 
-.js-enabled .govuk-accordion__section-button::-moz-focus-inner {
-    padding: 0;
-    border: 0
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
 }
 
-.js-enabled .govuk-accordion__section-button:after {
-    content: "";
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
 }
 
-    {
-    color: #003078;
-    text-decoration: underline;
-    text-underline-offset: .1em
+.js-enabled .govuk-accordion__section-button::-moz-focus-inner {
+    padding: 0;
+    border: 0
 }
 
-.js-enabled .govuk-accordion__controls {
-    text-align: right
+.js-enabled .govuk-accordion__section--expanded .govuk-accordion__section-button {
+    padding-bottom: 20px;
+    border-bottom: 0
 }
 
-.js-enabled .govuk-accordion__icon {
-    position: absolute;
-    top: 50%;
-    right: 15px;
-    width: 16px;
-    height: 16px;
-    margin-top: -8px
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
+    padding-bottom: 2px
 }
 
-.js-enabled .govuk-accordion__icon:after,
-.js-enabled .govuk-accordion__icon:before {
-    content: "";
-    box-sizing: border-box;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    width: 25%;
-    height: 25%;
-    margin: auto;
-    border: 2px solid transparent;
-    background-color: #0b0c0c
+.js-enabled .govuk-accordion__section-heading-text,
+.js-enabled .govuk-accordion__section-summary,
+.js-enabled .govuk-accordion__section-toggle {
+    display: block;
+    margin-bottom: 13px
 }
 
-.js-enabled .govuk-accordion__icon:before {
-    width: 100%
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-toggle-focus {
+    display: inline
 }
 
-.js-enabled .govuk-accordion__icon:after {
-    height: 100%
+.js-enabled .govuk-accordion__section-toggle {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    font-weight: 400;
+    font-size: 16px;
+    font-size: 1rem;
+    line-height: 1.25;
+    font-size: 19px;
+    font-size: 1.1875rem;
+    line-height: 1.31579;
+    color: #1d70b8
 }
 
-.js-enabled .govuk-accordion__section--expanded .govuk-accordion__icon:after {
-    content: " ";
-    display: none
+.js-enabled .govuk-accordion__section-toggle-text,
+.js-enabled .govuk-accordion__show-all-text {
+    margin-left: 5px;
+    vertical-align: middle
 }
 
 .govuk-back-link {
@@ -1147,6 +1199,7 @@
     font-size: 1.1875rem;
     line-height: 1.31579;
     display: block;
+    margin-top: 0;
     margin-bottom: 15px;
     clear: both;
     color: #d4351c
@@ -1262,7 +1315,6 @@
     font-size: 19px;
     font-size: 1.1875rem;
     line-height: 1.31579;
-    display: block;
     margin-bottom: 15px;
     color: #505a5f
 }
@@ -1540,7 +1592,7 @@
 }
 
 .govuk-textarea--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-textarea--error:focus {
@@ -1580,16 +1632,6 @@
 }
 
 .govuk-cookie-banner {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    font-weight: 400;
-    font-size: 16px;
-    font-size: 1rem;
-    line-height: 1.25;
-    font-size: 19px;
-    font-size: 1.1875rem;
-    line-height: 1.31579;
     padding-top: 20px;
     border-bottom: 10px solid transparent;
     background-color: #f3f2f1
@@ -1626,13 +1668,20 @@
     display: table;
     width: 100%;
     table-layout: fixed;
+    border-collapse: collapse;
     margin: 0 0 30px
 }
 
 .govuk-summary-list__row {
+    border-bottom: 1px solid #b1b4b6;
     display: table-row
 }
 
+.govuk-summary-list__row--no-actions:after {
+    content: "";
+    display: table-cell
+}
+
 .govuk-summary-list__actions,
 .govuk-summary-list__key,
 .govuk-summary-list__value {
@@ -1640,8 +1689,7 @@
     display: table-cell;
     padding-top: 10px;
     padding-right: 20px;
-    padding-bottom: 10px;
-    border-bottom: 1px solid #b1b4b6
+    padding-bottom: 10px
 }
 
 .govuk-summary-list__actions {
@@ -1663,14 +1711,6 @@
     width: 30%
 }
 
-.govuk-summary-list__value {
-    width: 50%
-}
-
-.govuk-summary-list__value:last-child {
-    width: 70%
-}
-
 .govuk-summary-list__value>p {
     margin-bottom: 10px
 }
@@ -1701,14 +1741,24 @@
     border: 0
 }
 
+.govuk-summary-list--no-border .govuk-summary-list__row {
+    border: 0
+}
+
 .govuk-summary-list--no-border .govuk-summary-list__actions,
 .govuk-summary-list--no-border .govuk-summary-list__key,
-.govuk-summary-list--no-border .govuk-summary-list__value,
+.govuk-summary-list--no-border .govuk-summary-list__value {
+    padding-bottom: 11px
+}
+
+.govuk-summary-list__row--no-border {
+    border: 0
+}
+
 .govuk-summary-list__row--no-border .govuk-summary-list__actions,
 .govuk-summary-list__row--no-border .govuk-summary-list__key,
 .govuk-summary-list__row--no-border .govuk-summary-list__value {
-    padding-bottom: 11px;
-    border: 0
+    padding-bottom: 11px
 }
 
 .govuk-input {
@@ -1753,7 +1803,7 @@
 }
 
 .govuk-input--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-input--error:focus {
@@ -2194,43 +2244,26 @@
 }
 
 .govuk-footer__heading {
-    margin-bottom: 40px;
+    margin-bottom: 30px;
     padding-bottom: 20px;
     border-bottom: 1px solid #b1b4b6
 }
 
 .govuk-footer__navigation {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
     margin-right: -15px;
-    margin-left: -15px;
-    -webkit-flex-wrap: wrap;
-    -ms-flex-wrap: wrap;
-    flex-wrap: wrap
+    margin-left: -15px
+}
+
+.govuk-footer__navigation:after {
+    content: "";
+    display: block;
+    clear: both
 }
 
 .govuk-footer__section {
     display: inline-block;
-    margin-right: 15px;
     margin-bottom: 30px;
-    margin-left: 15px;
-    vertical-align: top;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    -webkit-flex-shrink: 1;
-    -ms-flex-negative: 1;
-    flex-shrink: 1
-}
-
-.govuk-footer__section:first-child:nth-last-child(2) {
-    -webkit-box-flex: 2;
-    -webkit-flex-grow: 2;
-    -ms-flex-positive: 2;
-    flex-grow: 2
+    vertical-align: top
 }
 
 .govuk-footer__list {
@@ -2494,19 +2527,22 @@
 }
 
 .govuk-header__navigation {
-    display: block;
+    margin-bottom: 10px
+}
+
+.govuk-header__navigation-list {
     margin: 0;
     padding: 0;
     list-style: none
 }
 
 .js-enabled .govuk-header__menu-button,
-.js-enabled .govuk-header__navigation {
+.js-enabled .govuk-header__navigation-list {
     display: block;
     display: none
 }
 
-.js-enabled .govuk-header__navigation--open {
+.js-enabled .govuk-header__navigation-list--open {
     display: block
 }
 
@@ -2552,7 +2588,8 @@
 }
 
 .govuk-header__navigation-item:last-child {
-    margin-right: 0
+    margin-right: 0;
+    border-bottom: 0
 }
 
 .govuk-inset-text {
@@ -2677,10 +2714,7 @@
     color: #003078
 }
 
-.govuk-notification-banner__link:active {
-    color: #0b0c0c
-}
-
+.govuk-notification-banner__link:active,
 .govuk-notification-banner__link:focus {
     color: #0b0c0c
 }
@@ -2784,10 +2818,6 @@
     padding: 5px 8px 4px
 }
 
-.govuk-tag--inactive {
-    background-color: #505a5f
-}
-
 .govuk-tag--grey {
     color: #383f43;
     background: #eeefef
@@ -2938,10 +2968,7 @@
     color: #003078
 }
 
-.govuk-tabs__tab:active {
-    color: #0b0c0c
-}
-
+.govuk-tabs__tab:active,
 .govuk-tabs__tab:focus {
     color: #0b0c0c
 }
@@ -3276,7 +3303,7 @@
 }
 
 .govuk-select--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-select--error:focus {
@@ -3347,6 +3374,10 @@
     background-color: #fd0
 }
 
+.govuk-skip-link-focused-element:focus {
+    outline: none
+}
+
 .govuk-table {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
@@ -3976,6 +4007,18 @@
     padding-left: 60px !important
 }
 
+.govuk-\!-text-align-left {
+    text-align: left !important
+}
+
+.govuk-\!-text-align-centre {
+    text-align: center !important
+}
+
+.govuk-\!-text-align-right {
+    text-align: right !important
+}
+
 .govuk-\!-font-size-80 {
     font-size: 53px !important;
     font-size: 3.3125rem !important;

@govuk-design-system-ci govuk-design-system-ci temporarily deployed to govuk-frontend-pr-2480 December 15, 2021 15:09 Inactive
@github-actions
Copy link

Changes to dist

diff --git a/dist/VERSION.txt b/dist/VERSION.txt
index 0d0e48dd..e74e2121 100644
--- a/dist/VERSION.txt
+++ b/dist/VERSION.txt
@@ -1 +1 @@
-3.13.1
+4.0.0
diff --git a/dist/govuk-frontend-3.13.1.min.css b/dist/govuk-frontend-4.0.0.min.css
similarity index 5%
rename from dist/govuk-frontend-3.13.1.min.css
rename to dist/govuk-frontend-4.0.0.min.css
index ffc0356d..5ad564e5 100644
--- a/dist/govuk-frontend-3.13.1.min.css
+++ b/dist/govuk-frontend-4.0.0.min.css
@@ -47,10 +47,7 @@
     color: #003078
 }
 
-.govuk-link:active {
-    color: #0b0c0c
-}
-
+.govuk-link:active,
 .govuk-link:focus {
     color: #0b0c0c
 }
@@ -72,14 +69,8 @@
 }
 
 .govuk-link--muted:active,
-.govuk-link--muted:hover {
-    color: #0b0c0c
-}
-
-.govuk-link--muted:focus {
-    color: #0b0c0c
-}
-
+.govuk-link--muted:focus,
+.govuk-link--muted:hover,
 .govuk-link--text-colour:link,
 .govuk-link--text-colour:visited {
     color: #0b0c0c
@@ -137,11 +128,9 @@
     color: #003078
 }
 
-.govuk-link--no-visited-state:active {
-    color: #0b0c0c
-}
-
-.govuk-link--no-visited-state:focus {
+.govuk-link--no-visited-state:active,
+.govuk-link--no-visited-state:focus,
+.govuk-list {
     color: #0b0c0c
 }
 
@@ -153,7 +142,6 @@
     font-size: 16px;
     font-size: 1rem;
     line-height: 1.25;
-    color: #0b0c0c;
     margin-top: 0;
     margin-bottom: 15px;
     padding-left: 0;
@@ -229,24 +217,6 @@
     }
 }
 
-.govuk-template {
-    background-color: #f3f2f1;
-    -webkit-text-size-adjust: 100%;
-    -ms-text-size-adjust: 100%;
-    text-size-adjust: 100%
-}
-
-@media screen {
-    .govuk-template {
-        overflow-y: scroll
-    }
-}
-
-.govuk-template__body {
-    margin: 0;
-    background-color: #fff
-}
-
 .govuk-heading-xl {
     color: #0b0c0c;
     font-family: GDS Transport, arial, sans-serif;
@@ -1111,6 +1081,24 @@
     }
 }
 
+.govuk-template {
+    background-color: #f3f2f1;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+    text-size-adjust: 100%
+}
+
+@media screen {
+    .govuk-template {
+        overflow-y: scroll
+    }
+}
+
+.govuk-template__body {
+    margin: 0;
+    background-color: #fff
+}
+
 .govuk-width-container {
     max-width: 960px;
     margin-right: 15px;
@@ -1166,65 +1154,44 @@
     padding-top: 15px
 }
 
-.govuk-accordion__section-header {
-    padding-top: 15px;
-    padding-bottom: 15px
-}
-
 .govuk-accordion__section-heading {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    font-weight: 400;
-    font-size: 18px;
-    font-size: 1.125rem;
-    line-height: 1.11111;
     margin-top: 0;
-    margin-bottom: 0
-}
-
-@media print {
-    .govuk-accordion__section-heading {
-        font-family: sans-serif
-    }
+    margin-bottom: 0;
+    padding-top: 15px;
+    padding-bottom: 15px
 }
 
-@media (min-width:40.0625em) {
-    .govuk-accordion__section-heading {
-        font-size: 24px;
-        font-size: 1.5rem;
-        line-height: 1.25
-    }
+.govuk-accordion__section-button {
+    color: #0b0c0c;
+    display: block;
+    margin-bottom: 0;
+    padding-top: 15px
 }
 
 @media print {
-    .govuk-accordion__section-heading {
-        font-size: 18pt;
-        line-height: 1.15
+    .govuk-accordion__section-button {
+        color: #000
     }
 }
 
-.govuk-accordion__section-button {
+.govuk-accordion__section-heading-text {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
     -moz-osx-font-smoothing: grayscale;
     font-weight: 700;
     font-size: 18px;
     font-size: 1.125rem;
-    line-height: 1.11111;
-    display: inline-block;
-    margin-bottom: 0;
-    padding-top: 15px
+    line-height: 1.11111
 }
 
 @media print {
-    .govuk-accordion__section-button {
+    .govuk-accordion__section-heading-text {
         font-family: sans-serif
     }
 }
 
 @media (min-width:40.0625em) {
-    .govuk-accordion__section-button {
+    .govuk-accordion__section-heading-text {
         font-size: 24px;
         font-size: 1.5rem;
         line-height: 1.25
@@ -1232,17 +1199,12 @@
 }
 
 @media print {
-    .govuk-accordion__section-button {
+    .govuk-accordion__section-heading-text {
         font-size: 18pt;
         line-height: 1.15
     }
 }
 
-.govuk-accordion__section-summary {
-    margin-top: 10px;
-    margin-bottom: 0
-}
-
 .govuk-accordion__section-content>:last-child {
     margin-bottom: 0
 }
@@ -1257,14 +1219,12 @@
 
 .js-enabled .govuk-accordion__section-content {
     display: none;
-    padding-top: 15px;
-    padding-bottom: 15px
+    padding-bottom: 30px
 }
 
 @media (min-width:40.0625em) {
     .js-enabled .govuk-accordion__section-content {
-        padding-top: 15px;
-        padding-bottom: 15px
+        padding-bottom: 50px
     }
 }
 
@@ -1272,104 +1232,178 @@
     display: block
 }
 
-.js-enabled .govuk-accordion__open-all {
+.js-enabled .govuk-accordion__show-all {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 400;
-    font-size: 14px;
-    font-size: .875rem;
-    line-height: 1.14286;
+    font-size: 16px;
+    font-size: 1rem;
+    line-height: 1.25;
     position: relative;
     z-index: 1;
-    margin: 0;
-    padding: 0;
+    margin-bottom: 9px;
+    padding: 5px 2px 5px 0;
     border-width: 0;
     color: #1d70b8;
     background: none;
     cursor: pointer;
-    -webkit-appearance: none;
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    text-decoration: underline
+    -webkit-appearance: none
+}
+
+@media print {
+    .js-enabled .govuk-accordion__show-all {
+        font-family: sans-serif
+    }
 }
 
 @media (min-width:40.0625em) {
-    .js-enabled .govuk-accordion__open-all {
-        font-size: 16px;
-        font-size: 1rem;
-        line-height: 1.25
+    .js-enabled .govuk-accordion__show-all {
+        font-size: 19px;
+        font-size: 1.1875rem;
+        line-height: 1.31579
     }
 }
 
 @media print {
-    .js-enabled .govuk-accordion__open-all {
+    .js-enabled .govuk-accordion__show-all {
         font-size: 14pt;
-        line-height: 1.2;
-        font-family: sans-serif
+        line-height: 1.15
     }
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
+@media (min-width:48.0625em) {
+    .js-enabled .govuk-accordion__show-all {
+        margin-bottom: 14px
+    }
+}
+
+.js-enabled .govuk-accordion__show-all::-moz-focus-inner {
+    padding: 0;
+    border: 0
+}
+
+.js-enabled .govuk-accordion__show-all:hover {
+    color: #0b0c0c;
+    background: #f3f2f1;
+    box-shadow: 0 -2px #f3f2f1, 0 4px #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:focus {
     outline: 3px solid rgba(0, 0, 0, 0);
+    color: #0b0c0c;
     background-color: #fd0;
     box-shadow: 0 -2px #fd0, 0 4px #0b0c0c;
     text-decoration: none
 }
 
-.js-enabled .govuk-accordion__open-all:link {
-    color: #1d70b8
-}
-
-.js-enabled .govuk-accordion__open-all:visited {
-    color: #4c2c92
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron {
+    background: #0b0c0c
 }
 
-.js-enabled .govuk-accordion__open-all:hover {
-    color: #003078
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
 }
 
-.js-enabled .govuk-accordion__open-all:active {
-    color: #0b0c0c
+.js-enabled .govuk-accordion__section-heading {
+    padding: 0
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
-    color: #0b0c0c
+.js-enabled .govuk-accordion-nav__chevron {
+    box-sizing: border-box;
+    display: inline-block;
+    position: relative;
+    width: 1.25rem;
+    height: 1.25rem;
+    border: .0625rem solid;
+    border-radius: 50%;
+    vertical-align: middle
 }
 
-.js-enabled .govuk-accordion__open-all::-moz-focus-inner {
-    padding: 0;
-    border: 0
+.js-enabled .govuk-accordion-nav__chevron:after {
+    content: "";
+    box-sizing: border-box;
+    display: block;
+    position: absolute;
+    bottom: .3125rem;
+    left: .375rem;
+    width: .375rem;
+    height: .375rem;
+    -webkit-transform: rotate(-45deg);
+    -ms-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+    border-top: .125rem solid;
+    border-right: .125rem solid
 }
 
-.js-enabled .govuk-accordion__section-header {
-    position: relative;
-    padding-right: 40px;
-    border-top: 1px solid #b1b4b6;
-    cursor: pointer
+.js-enabled .govuk-accordion-nav__chevron--down {
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg)
 }
 
 .js-enabled .govuk-accordion__section-button {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 0;
-    padding: 0;
-    border-width: 0;
-    color: #1d70b8;
+    width: 100%;
+    padding: 10px 0 0;
+    border: 0;
+    border-top: 1px solid #b1b4b6;
+    border-bottom: 10px solid rgba(0, 0, 0, 0);
+    color: #0b0c0c;
     background: none;
     text-align: left;
     cursor: pointer;
     -webkit-appearance: none
 }
 
-@media print {
+@media (min-width:40.0625em) {
     .js-enabled .govuk-accordion__section-button {
-        font-family: sans-serif
+        padding-bottom: 10px
     }
 }
 
+.js-enabled .govuk-accordion__section-button:active {
+    color: #0b0c0c;
+    background: none
+}
+
+.js-enabled .govuk-accordion__section-button:hover {
+    color: #0b0c0c;
+    background: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
+}
+
 .js-enabled .govuk-accordion__section-button:focus {
+    outline: 0
+}
+
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
     outline: 3px solid rgba(0, 0, 0, 0);
     color: #0b0c0c;
     background-color: #fd0;
@@ -1377,72 +1411,121 @@
     text-decoration: none
 }
 
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
+}
+
 .js-enabled .govuk-accordion__section-button::-moz-focus-inner {
     padding: 0;
     border: 0
 }
 
-.js-enabled .govuk-accordion__section-button:after {
-    content: "";
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0
+.js-enabled .govuk-accordion__section--expanded .govuk-accordion__section-button {
+    padding-bottom: 20px;
+    border-bottom: 0
 }
 
-.js-enabled .govuk-accordion__section-button:hover:not(:focus) {
-    color: #003078;
-    text-decoration: underline;
-    text-underline-offset: .1em
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
+    padding-bottom: 3px
 }
 
-@media (hover:none) {
-    .js-enabled .govuk-accordion__section-button:hover {
-        text-decoration: none
+@media (min-width:48.0625em) {
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
+        padding-bottom: 2px
     }
 }
 
-.js-enabled .govuk-accordion__controls {
-    text-align: right
+.js-enabled .govuk-accordion__section-heading-text,
+.js-enabled .govuk-accordion__section-summary,
+.js-enabled .govuk-accordion__section-toggle {
+    display: block;
+    margin-bottom: 13px
 }
 
-.js-enabled .govuk-accordion__icon {
-    position: absolute;
-    top: 50%;
-    right: 15px;
-    width: 16px;
-    height: 16px;
-    margin-top: -8px
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-toggle-focus {
+    display: inline
 }
 
-.js-enabled .govuk-accordion__icon:after,
-.js-enabled .govuk-accordion__icon:before {
-    content: "";
-    box-sizing: border-box;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    width: 25%;
-    height: 25%;
-    margin: auto;
-    border: 2px solid rgba(0, 0, 0, 0);
-    background-color: #0b0c0c
+.js-enabled .govuk-accordion__section-toggle {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    font-weight: 400;
+    font-size: 16px;
+    font-size: 1rem;
+    line-height: 1.25;
+    color: #1d70b8
 }
 
-.js-enabled .govuk-accordion__icon:before {
-    width: 100%
+@media print {
+    .js-enabled .govuk-accordion__section-toggle {
+        font-family: sans-serif
+    }
 }
 
-.js-enabled .govuk-accordion__icon:after {
-    height: 100%
+@media (min-width:40.0625em) {
+    .js-enabled .govuk-accordion__section-toggle {
+        font-size: 19px;
+        font-size: 1.1875rem;
+        line-height: 1.31579
+    }
 }
 
-.js-enabled .govuk-accordion__section--expanded .govuk-accordion__icon:after {
-    content: " ";
-    display: none
+@media print {
+    .js-enabled .govuk-accordion__section-toggle {
+        font-size: 14pt;
+        line-height: 1.15
+    }
+}
+
+.js-enabled .govuk-accordion__section-toggle-text,
+.js-enabled .govuk-accordion__show-all-text {
+    margin-left: 5px;
+    vertical-align: middle
+}
+
+@media screen and (forced-colors:active) {
+
+    .js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron,
+    .js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron {
+        background-color: rgba(0, 0, 0, 0)
+    }
+
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron,
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-heading-text-focus,
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-summary-focus,
+    .js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion__section-heading-text-focus,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion__section-summary-focus,
+    .js-enabled .govuk-accordion__show-all:focus .govuk-accordion__section-toggle-focus {
+        background: rgba(0, 0, 0, 0);
+        background-color: rgba(0, 0, 0, 0)
+    }
+}
+
+@media (hover:none) {
+    .js-enabled .govuk-accordion__section-header:hover {
+        border-top-color: #b1b4b6;
+        box-shadow: inset 0 3px 0 0 #1d70b8
+    }
+
+    .js-enabled .govuk-accordion__section-header:hover .govuk-accordion__section-button {
+        border-top-color: #b1b4b6
+    }
 }
 
 .govuk-back-link {
@@ -1925,6 +2008,7 @@
     font-size: 1rem;
     line-height: 1.25;
     display: block;
+    margin-top: 0;
     margin-bottom: 15px;
     clear: both;
     color: #d4351c
@@ -2152,7 +2236,6 @@
     font-size: 16px;
     font-size: 1rem;
     line-height: 1.25;
-    display: block;
     margin-bottom: 15px;
     color: #505a5f
 }
@@ -2666,7 +2749,7 @@ screen and (forced-colors:active) {
 }
 
 .govuk-textarea--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-textarea--error:focus {
@@ -2718,39 +2801,11 @@ screen and (forced-colors:active) {
 }
 
 .govuk-cookie-banner {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    font-weight: 400;
-    font-size: 16px;
-    font-size: 1rem;
-    line-height: 1.25;
     padding-top: 20px;
     border-bottom: 10px solid rgba(0, 0, 0, 0);
     background-color: #f3f2f1
 }
 
-@media print {
-    .govuk-cookie-banner {
-        font-family: sans-serif
-    }
-}
-
-@media (min-width:40.0625em) {
-    .govuk-cookie-banner {
-        font-size: 19px;
-        font-size: 1.1875rem;
-        line-height: 1.31579
-    }
-}
-
-@media print {
-    .govuk-cookie-banner {
-        font-size: 14pt;
-        line-height: 1.15
-    }
-}
-
 .govuk-cookie-banner[hidden] {
     display: none
 }
@@ -2806,14 +2861,18 @@ screen and (forced-colors:active) {
         display: table;
         width: 100%;
         table-layout: fixed;
+        border-collapse: collapse;
         margin-bottom: 30px
     }
 }
 
+.govuk-summary-list__row {
+    border-bottom: 1px solid #b1b4b6
+}
+
 @media (max-width:40.0525em) {
     .govuk-summary-list__row {
-        margin-bottom: 15px;
-        border-bottom: 1px solid #b1b4b6
+        margin-bottom: 15px
     }
 }
 
@@ -2823,6 +2882,11 @@ screen and (forced-colors:active) {
     }
 }
 
+.govuk-summary-list__row--no-actions:after {
+    content: "";
+    display: table-cell
+}
+
 .govuk-summary-list__actions,
 .govuk-summary-list__key,
 .govuk-summary-list__value {
@@ -2837,8 +2901,7 @@ screen and (forced-colors:active) {
         display: table-cell;
         padding-top: 10px;
         padding-right: 20px;
-        padding-bottom: 10px;
-        border-bottom: 1px solid #b1b4b6
+        padding-bottom: 10px
     }
 }
 
@@ -2877,18 +2940,6 @@ screen and (forced-colors:active) {
     }
 }
 
-@media (min-width:40.0625em) {
-    .govuk-summary-list__value {
-        width: 50%
-    }
-}
-
-@media (min-width:40.0625em) {
-    .govuk-summary-list__value:last-child {
-        width: 70%
-    }
-}
-
 .govuk-summary-list__value>p {
     margin-bottom: 10px
 }
@@ -2919,10 +2970,8 @@ screen and (forced-colors:active) {
     border: 0
 }
 
-@media (max-width:40.0525em) {
-    .govuk-summary-list--no-border .govuk-summary-list__row {
-        border: 0
-    }
+.govuk-summary-list--no-border .govuk-summary-list__row {
+    border: 0
 }
 
 @media (min-width:40.0625em) {
@@ -2930,15 +2979,12 @@ screen and (forced-colors:active) {
     .govuk-summary-list--no-border .govuk-summary-list__actions,
     .govuk-summary-list--no-border .govuk-summary-list__key,
     .govuk-summary-list--no-border .govuk-summary-list__value {
-        padding-bottom: 11px;
-        border: 0
+        padding-bottom: 11px
     }
 }
 
-@media (max-width:40.0525em) {
-    .govuk-summary-list__row--no-border {
-        border: 0
-    }
+.govuk-summary-list__row--no-border {
+    border: 0
 }
 
 @media (min-width:40.0625em) {
@@ -2946,8 +2992,7 @@ screen and (forced-colors:active) {
     .govuk-summary-list__row--no-border .govuk-summary-list__actions,
     .govuk-summary-list__row--no-border .govuk-summary-list__key,
     .govuk-summary-list__row--no-border .govuk-summary-list__value {
-        padding-bottom: 11px;
-        border: 0
+        padding-bottom: 11px
     }
 }
 
@@ -3010,7 +3055,7 @@ screen and (forced-colors:active) {
 }
 
 .govuk-input--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-input--error:focus {
@@ -3714,17 +3759,11 @@ only screen and (min-resolution:192dpi) {
 }
 
 .govuk-footer__heading {
-    margin-bottom: 25px;
+    margin-bottom: 30px;
     padding-bottom: 20px;
     border-bottom: 1px solid #b1b4b6
 }
 
-@media (min-width:40.0625em) {
-    .govuk-footer__heading {
-        margin-bottom: 40px
-    }
-}
-
 @media (max-width:40.0525em) {
     .govuk-footer__heading {
         padding-bottom: 10px
@@ -3732,47 +3771,20 @@ only screen and (min-resolution:192dpi) {
 }
 
 .govuk-footer__navigation {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
     margin-right: -15px;
-    margin-left: -15px;
-    -webkit-flex-wrap: wrap;
-    -ms-flex-wrap: wrap;
-    flex-wrap: wrap
+    margin-left: -15px
+}
+
+.govuk-footer__navigation:after {
+    content: "";
+    display: block;
+    clear: both
 }
 
 .govuk-footer__section {
     display: inline-block;
-    margin-right: 15px;
     margin-bottom: 30px;
-    margin-left: 15px;
-    vertical-align: top;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    -webkit-flex-shrink: 1;
-    -ms-flex-negative: 1;
-    flex-shrink: 1
-}
-
-@media (max-width:48.0525em) {
-    .govuk-footer__section {
-        -webkit-flex-basis: 200px;
-        -ms-flex-preferred-size: 200px;
-        flex-basis: 200px
-    }
-}
-
-@media (min-width:48.0625em) {
-    .govuk-footer__section:first-child:nth-last-child(2) {
-        -webkit-box-flex: 2;
-        -webkit-flex-grow: 2;
-        -ms-flex-positive: 2;
-        flex-grow: 2
-    }
+    vertical-align: top
 }
 
 .govuk-footer__list {
@@ -4155,19 +4167,18 @@ only screen and (min-resolution:192dpi) {
     border-bottom-color: inherit
 }
 
-.govuk-header__navigation {
-    display: block;
-    margin: 0;
-    padding: 0;
-    list-style: none
-}
-
-@media (min-width:40.0625em) {
+@media (min-width:48.0625em) {
     .govuk-header__navigation {
         margin-bottom: 10px
     }
 }
 
+.govuk-header__navigation-list {
+    margin: 0;
+    padding: 0;
+    list-style: none
+}
+
 .js-enabled .govuk-header__menu-button {
     display: block
 }
@@ -4178,17 +4189,17 @@ only screen and (min-resolution:192dpi) {
     }
 }
 
-.js-enabled .govuk-header__navigation {
+.js-enabled .govuk-header__navigation-list {
     display: none
 }
 
 @media (min-width:48.0625em) {
-    .js-enabled .govuk-header__navigation {
+    .js-enabled .govuk-header__navigation-list {
         display: block
     }
 }
 
-.js-enabled .govuk-header__navigation--open {
+.js-enabled .govuk-header__navigation-list--open {
     display: block
 }
 
@@ -4261,7 +4272,8 @@ only screen and (min-resolution:192dpi) {
 }
 
 .govuk-header__navigation-item:last-child {
-    margin-right: 0
+    margin-right: 0;
+    border-bottom: 0
 }
 
 @media print {
@@ -4517,10 +4529,7 @@ only screen and (min-resolution:192dpi) {
     color: #003078
 }
 
-.govuk-notification-banner__link:active {
-    color: #0b0c0c
-}
-
+.govuk-notification-banner__link:active,
 .govuk-notification-banner__link:focus {
     color: #0b0c0c
 }
@@ -4585,7 +4594,9 @@ only screen and (min-resolution:192dpi) {
 
 @media (max-width:40.0525em) {
     .govuk-panel {
-        padding: 25px
+        padding: 10px;
+        overflow-wrap: break-word;
+        word-wrap: break-word
     }
 }
 
@@ -4710,10 +4721,6 @@ only screen and (min-resolution:192dpi) {
     }
 }
 
-.govuk-tag--inactive {
-    background-color: #505a5f
-}
-
 .govuk-tag--grey {
     color: #383f43;
     background: #eeefef
@@ -4946,10 +4953,7 @@ only screen and (min-resolution:192dpi) {
     color: #003078
 }
 
-.govuk-tabs__tab:active {
-    color: #0b0c0c
-}
-
+.govuk-tabs__tab:active,
 .govuk-tabs__tab:focus {
     color: #0b0c0c
 }
@@ -5406,7 +5410,7 @@ screen and (forced-colors:active) {
 }
 
 .govuk-select--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-select--error:focus {
@@ -5511,6 +5515,10 @@ screen and (forced-colors:active) {
     background-color: #fd0
 }
 
+.govuk-skip-link-focused-element:focus {
+    outline: none
+}
+
 .govuk-table {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
@@ -6897,6 +6905,18 @@ screen and (forced-colors:active) {
     }
 }
 
+.govuk-\!-text-align-left {
+    text-align: left !important
+}
+
+.govuk-\!-text-align-centre {
+    text-align: center !important
+}
+
+.govuk-\!-text-align-right {
+    text-align: right !important
+}
+
 .govuk-\!-font-size-80 {
     font-size: 53px !important;
     font-size: 3.3125rem !important;
diff --git a/dist/govuk-frontend-3.13.1.min.js b/dist/govuk-frontend-4.0.0.min.js
similarity index 11%
rename from dist/govuk-frontend-3.13.1.min.js
rename to dist/govuk-frontend-4.0.0.min.js
index e9366b04..56ea78f8 100644
--- a/dist/govuk-frontend-3.13.1.min.js
+++ b/dist/govuk-frontend-4.0.0.min.js
@@ -3,15 +3,15 @@
 }(this, function(t) {
     "use strict";
 
-    function r(t, e) {
+    function s(t, e) {
         if (window.NodeList.prototype.forEach) return t.forEach(e);
         for (var n = 0; n < t.length; n++) e.call(window, t[n], n, t)
     }
 
     function n(t) {
-        this.$module = t, this.moduleId = t.getAttribute("id"), this.$sections = t.querySelectorAll(".govuk-accordion__section"), this.$openAllButton = "", this.browserSupportsSessionStorage = e.checkForSessionStorage(), this.controlsClass = "govuk-accordion__controls", this.openAllClass = "govuk-accordion__open-all", this.iconClass = "govuk-accordion__icon", this.sectionHeaderClass = "govuk-accordion__section-header", this.sectionHeaderFocusedClass = "govuk-accordion__section-header--focused", this.sectionHeadingClass = "govuk-accordion__section-heading", this.sectionSummaryClass = "govuk-accordion__section-summary", this.sectionButtonClass = "govuk-accordion__section-button", this.sectionExpandedClass = "govuk-accordion__section--expanded"
+        this.$module = t, this.moduleId = t.getAttribute("id"), this.$sections = t.querySelectorAll(".govuk-accordion__section"), this.$showAllButton = "", this.browserSupportsSessionStorage = e.checkForSessionStorage(), this.controlsClass = "govuk-accordion__controls", this.showAllClass = "govuk-accordion__show-all", this.showAllTextClass = "govuk-accordion__show-all-text", this.sectionExpandedClass = "govuk-accordion__section--expanded", this.sectionButtonClass = "govuk-accordion__section-button", this.sectionHeaderClass = "govuk-accordion__section-header", this.sectionHeadingClass = "govuk-accordion__section-heading", this.sectionHeadingTextClass = "govuk-accordion__section-heading-text", this.sectionHeadingTextFocusClass = "govuk-accordion__section-heading-text-focus", this.sectionShowHideToggleClass = "govuk-accordion__section-toggle", this.sectionShowHideToggleFocusClass = "govuk-accordion__section-toggle-focus", this.sectionShowHideTextClass = "govuk-accordion__section-toggle-text", this.upChevronIconClass = "govuk-accordion-nav__chevron", this.downChevronIconClass = "govuk-accordion-nav__chevron--down", this.sectionSummaryClass = "govuk-accordion__section-summary", this.sectionSummaryFocusClass = "govuk-accordion__section-summary-focus"
     }(function(t) {
-        var a, c, l, u;
+        var a, l, c, u;
         "defineProperty" in Object && function() {
             try {
                 return Object.defineProperty({}, "test", {
@@ -20,23 +20,23 @@
             } catch (t) {
                 return !1
             }
-        }() || (a = Object.defineProperty, c = Object.prototype.hasOwnProperty("__defineGetter__"), l = "Getters & setters cannot be defined on this javascript engine", u = "A property cannot both have accessors and be writable or have a value", Object.defineProperty = function(t, e, n) {
+        }() || (a = Object.defineProperty, l = Object.prototype.hasOwnProperty("__defineGetter__"), c = "Getters & setters cannot be defined on this javascript engine", u = "A property cannot both have accessors and be writable or have a value", Object.defineProperty = function(t, e, n) {
             if (a && (t === window || t === document || t === Element.prototype || t instanceof Element)) return a(t, e, n);
             if (null === t || !(t instanceof Object || "object" == typeof t)) throw new TypeError("Object.defineProperty called on non-object");
             if (!(n instanceof Object)) throw new TypeError("Property description must be an object");
             var o = String(e),
                 i = "value" in n || "writable" in n,
-                r = "get" in n && typeof n.get,
-                s = "set" in n && typeof n.set;
-            if (r) {
-                if ("function" !== r) throw new TypeError("Getter must be a function");
-                if (!c) throw new TypeError(l);
+                s = "get" in n && typeof n.get,
+                r = "set" in n && typeof n.set;
+            if (s) {
+                if ("function" !== s) throw new TypeError("Getter must be a function");
+                if (!l) throw new TypeError(c);
                 if (i) throw new TypeError(u);
                 Object.__defineGetter__.call(t, o, n.get)
             } else t[o] = n.value;
-            if (s) {
-                if ("function" !== s) throw new TypeError("Setter must be a function");
-                if (!c) throw new TypeError(l);
+            if (r) {
+                if ("function" !== r) throw new TypeError("Setter must be a function");
+                if (!l) throw new TypeError(c);
                 if (i) throw new TypeError(u);
                 Object.__defineSetter__.call(t, o, n.set)
             }
@@ -49,38 +49,38 @@
                     var n, t = Array,
                         o = Object,
                         i = o.prototype,
-                        r = t.prototype,
-                        s = function s() {},
+                        s = t.prototype,
+                        r = function r() {},
                         a = i.toString,
-                        c = "function" == typeof Symbol && "symbol" == typeof Symbol.toStringTag,
-                        l = Function.prototype.toString,
+                        l = "function" == typeof Symbol && "symbol" == typeof Symbol.toStringTag,
+                        c = Function.prototype.toString,
                         u = function u(t) {
                             try {
-                                return l.call(t), !0
+                                return c.call(t), !0
                             } catch (e) {
                                 return !1
                             }
                         };
                     n = function n(t) {
                         if ("function" != typeof t) return !1;
-                        if (c) return u(t);
+                        if (l) return u(t);
                         var e = a.call(t);
                         return "[object Function]" === e || "[object GeneratorFunction]" === e
                     };
-                    var d = r.slice,
-                        h = r.concat,
-                        p = r.push,
+                    var d = s.slice,
+                        h = s.concat,
+                        p = s.push,
                         f = Math.max,
-                        b = this;
-                    if (!n(b)) throw new TypeError("Function.prototype.bind called on incompatible " + b);
-                    for (var m, y = d.call(arguments, 1), v = f(0, b.length - y.length), g = [], w = 0; w < v; w++) p.call(g, "$" + w);
-                    return m = Function("binder", "return function (" + g.join(",") + "){ return binder.apply(this, arguments); }")(function() {
-                        if (this instanceof m) {
-                            var t = b.apply(this, h.call(y, d.call(arguments)));
+                        m = this;
+                    if (!n(m)) throw new TypeError("Function.prototype.bind called on incompatible " + m);
+                    for (var b, v = d.call(arguments, 1), y = f(0, m.length - v.length), g = [], w = 0; w < y; w++) p.call(g, "$" + w);
+                    return b = Function("binder", "return function (" + g.join(",") + "){ return binder.apply(this, arguments); }")(function() {
+                        if (this instanceof b) {
+                            var t = m.apply(this, h.call(v, d.call(arguments)));
                             return o(t) === t ? t : this
                         }
-                        return b.apply(e, h.call(y, d.call(arguments)))
-                    }), b.prototype && (s.prototype = b.prototype, m.prototype = new s, s.prototype = null), m
+                        return m.apply(e, h.call(v, d.call(arguments)))
+                    }), m.prototype && (r.prototype = m.prototype, b.prototype = new r, r.prototype = null), b
                 }
             })
         }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}),
@@ -99,20 +99,20 @@
                 } catch (t) {
                     i = !1
                 }
-                return function(i, r) {
-                    var s = this,
+                return function(i, s) {
+                    var r = this,
                         a = [],
-                        c = {},
-                        l = 0,
+                        l = {},
+                        c = 0,
                         t = 0,
                         e = function(t) {
-                            n(s, t, function() {
+                            n(r, t, function() {
                                 return d(), a[t]
                             }, !1)
                         },
                         u = function() {
-                            if (t <= l)
-                                for (; t < l; ++t) e(t)
+                            if (t <= c)
+                                for (; t < c; ++t) e(t)
                         },
                         d = function() {
                             var t, e, n = arguments,
@@ -120,29 +120,29 @@
                             if (n.length)
                                 for (e = 0; e < n.length; ++e)
                                     if (o.test(n[e])) throw (t = new SyntaxError('String "' + n[e] + '" contains an invalid character')).code = 5, t.name = "InvalidCharacterError", t;
-                            for ("" === (a = "object" == typeof i[r] ? ("" + i[r].baseVal).replace(/^\s+|\s+$/g, "").split(o) : ("" + i[r]).replace(/^\s+|\s+$/g, "").split(o))[0] && (a = []), c = {}, e = 0; e < a.length; ++e) c[a[e]] = !0;
-                            l = a.length, u()
+                            for ("" === (a = "object" == typeof i[s] ? ("" + i[s].baseVal).replace(/^\s+|\s+$/g, "").split(o) : ("" + i[s]).replace(/^\s+|\s+$/g, "").split(o))[0] && (a = []), l = {}, e = 0; e < a.length; ++e) l[a[e]] = !0;
+                            c = a.length, u()
                         };
-                    return d(), n(s, "length", function() {
-                        return d(), l
-                    }), s.toLocaleString = s.toString = function() {
+                    return d(), n(r, "length", function() {
+                        return d(), c
+                    }), r.toLocaleString = r.toString = function() {
                         return d(), a.join(" ")
-                    }, s.item = function(t) {
+                    }, r.item = function(t) {
                         return d(), a[t]
-                    }, s.contains = function(t) {
-                        return d(), !!c[t]
-                    }, s.add = function() {
-                        d.apply(s, t = arguments);
-                        for (var t, e, n = 0, o = t.length; n < o; ++n) c[e = t[n]] || (a.push(e), c[e] = !0);
-                        l !== a.length && (l = a.length >>> 0, "object" == typeof i[r] ? i[r].baseVal = a.join(" ") : i[r] = a.join(" "), u())
-                    }, s.remove = function() {
-                        d.apply(s, t = arguments);
-                        for (var t, e = {}, n = 0, o = []; n < t.length; ++n) e[t[n]] = !0, delete c[t[n]];
+                    }, r.contains = function(t) {
+                        return d(), !!l[t]
+                    }, r.add = function() {
+                        d.apply(r, t = arguments);
+                        for (var t, e, n = 0, o = t.length; n < o; ++n) l[e = t[n]] || (a.push(e), l[e] = !0);
+                        c !== a.length && (c = a.length >>> 0, "object" == typeof i[s] ? i[s].baseVal = a.join(" ") : i[s] = a.join(" "), u())
+                    }, r.remove = function() {
+                        d.apply(r, t = arguments);
+                        for (var t, e = {}, n = 0, o = []; n < t.length; ++n) e[t[n]] = !0, delete l[t[n]];
                         for (n = 0; n < a.length; ++n) e[a[n]] || o.push(a[n]);
-                        l = (a = o).length >>> 0, "object" == typeof i[r] ? i[r].baseVal = a.join(" ") : i[r] = a.join(" "), u()
-                    }, s.toggle = function(t, e) {
-                        return d.apply(s, [t]), o !== e ? e ? (s.add(t), !0) : (s.remove(t), !1) : c[t] ? (s.remove(t), !1) : (s.add(t), !0)
-                    }, s
+                        c = (a = o).length >>> 0, "object" == typeof i[s] ? i[s].baseVal = a.join(" ") : i[s] = a.join(" "), u()
+                    }, r.toggle = function(t, e) {
+                        return d.apply(r, [t]), o !== e ? e ? (r.add(t), !0) : (r.remove(t), !1) : l[t] ? (r.remove(t), !1) : (r.add(t), !0)
+                    }, r
                 }
             }()), "classList" in (n = document.createElement("span")) && (n.classList.toggle("x", !1), n.classList.contains("x") && (n.classList.constructor.prototype.toggle = function(t) {
                 var e = arguments[1];
@@ -177,31 +177,31 @@
                     var t, e = document.appendChild(document.createElement("body")),
                         n = e.appendChild(document.createElement("iframe")).contentWindow.document,
                         a = Element.prototype = n.appendChild(n.createElement("*")),
-                        c = {},
-                        l = function(t, e) {
-                            var n, o, i, r = t.childNodes || [],
-                                s = -1;
+                        l = {},
+                        c = function(t, e) {
+                            var n, o, i, s = t.childNodes || [],
+                                r = -1;
                             if (1 === t.nodeType && t.constructor !== Element)
-                                for (n in t.constructor = Element, c) o = c[n], t[n] = o;
-                            for (; i = e && r[++s];) l(i, e);
+                                for (n in t.constructor = Element, l) o = l[n], t[n] = o;
+                            for (; i = e && s[++r];) c(i, e);
                             return t
                         },
                         u = document.getElementsByTagName("*"),
                         o = document.createElement,
                         i = 100;
                     a.attachEvent("onpropertychange", function(t) {
-                        for (var e, n = t.propertyName, o = !c.hasOwnProperty(n), i = a[n], r = c[n], s = -1; e = u[++s];) 1 === e.nodeType && (!o && e[n] !== r || (e[n] = i));
-                        c[n] = i
+                        for (var e, n = t.propertyName, o = !l.hasOwnProperty(n), i = a[n], s = l[n], r = -1; e = u[++r];) 1 === e.nodeType && (!o && e[n] !== s || (e[n] = i));
+                        l[n] = i
                     }), a.constructor = Element, a.hasAttribute || (a.hasAttribute = function(t) {
                         return null !== this.getAttribute(t)
-                    }), r() || (document.onreadystatechange = r, t = setInterval(r, 25)), document.createElement = function(t) {
+                    }), s() || (document.onreadystatechange = s, t = setInterval(s, 25)), document.createElement = function(t) {
                         var e = o(String(t).toLowerCase());
-                        return l(e)
+                        return c(e)
                     }, document.removeChild(e)
                 } else window.HTMLElement = window.Element;
 
-                function r() {
-                    return i-- || clearTimeout(t), !(!document.body || document.body.prototype || !/(complete|interactive)/.test(document.readyState)) && (l(document, !0), t && document.body.prototype && clearTimeout(t), !!document.body.prototype)
+                function s() {
+                    return i-- || clearTimeout(t), !(!document.body || document.body.prototype || !/(complete|interactive)/.test(document.readyState)) && (c(document, !0), t && document.body.prototype && clearTimeout(t), !!document.body.prototype)
                 }
             }()
         }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}),
@@ -220,19 +220,19 @@
                 } catch (e) {
                     u = !1
                 }
-                var h = function(t, c, l) {
-                    d(t.prototype, c, function() {
+                var h = function(t, l, c) {
+                    d(t.prototype, l, function() {
                         var t, e = this,
-                            n = "__defineGetter__DEFINE_PROPERTY" + c;
+                            n = "__defineGetter__DEFINE_PROPERTY" + l;
                         if (e[n]) return t;
                         if (!(e[n] = !0) === u) {
-                            for (var o, i = h.mirror || document.createElement("div"), r = i.childNodes, s = r.length, a = 0; a < s; ++a)
-                                if (r[a]._R === e) {
-                                    o = r[a];
+                            for (var o, i = h.mirror || document.createElement("div"), s = i.childNodes, r = s.length, a = 0; a < r; ++a)
+                                if (s[a]._R === e) {
+                                    o = s[a];
                                     break
-                                } o = o || i.appendChild(document.createElement("div")), t = DOMTokenList.call(o, e, l)
-                        } else t = new DOMTokenList(e, l);
-                        return d(e, c, function() {
+                                } o = o || i.appendChild(document.createElement("div")), t = DOMTokenList.call(o, e, c)
+                        } else t = new DOMTokenList(e, c);
+                        return d(e, l, function() {
                             return t
                         }), delete e[n], t
                     }, !0)
@@ -243,56 +243,81 @@
             if (this.$module) {
                 this.initControls(), this.initSectionHeaders();
                 var t = this.checkIfAllSectionsOpen();
-                this.updateOpenAllButton(t)
+                this.updateShowAllButton(t)
             }
         }, n.prototype.initControls = function() {
-            this.$openAllButton = document.createElement("button"), this.$openAllButton.setAttribute("type", "button"), this.$openAllButton.innerHTML = 'Open all <span class="govuk-visually-hidden">sections</span>', this.$openAllButton.setAttribute("class", this.openAllClass), this.$openAllButton.setAttribute("aria-expanded", "false"), this.$openAllButton.setAttribute("type", "button");
-            var t = document.createElement("div");
-            t.setAttribute("class", this.controlsClass), t.appendChild(this.$openAllButton), this.$module.insertBefore(t, this.$module.firstChild), this.$openAllButton.addEventListener("click", this.onOpenOrCloseAllToggle.bind(this))
+            this.$showAllButton = document.createElement("button"), this.$showAllButton.setAttribute("type", "button"), this.$showAllButton.setAttribute("class", this.showAllClass), this.$showAllButton.setAttribute("aria-expanded", "false");
+            var t = document.createElement("span");
+            t.classList.add(this.upChevronIconClass), this.$showAllButton.appendChild(t);
+            var e = document.createElement("div");
+            e.setAttribute("class", this.controlsClass), e.appendChild(this.$showAllButton), this.$module.insertBefore(e, this.$module.firstChild);
+            var n = document.createElement("span");
+            n.classList.add(this.showAllTextClass), this.$showAllButton.appendChild(n), this.$showAllButton.addEventListener("click", this.onShowOrHideAllToggle.bind(this))
         }, n.prototype.initSectionHeaders = function() {
-            r(this.$sections, function(t, e) {
+            s(this.$sections, function(t, e) {
                 var n = t.querySelector("." + this.sectionHeaderClass);
-                this.initHeaderAttributes(n, e), this.setExpanded(this.isExpanded(t), t), n.addEventListener("click", this.onSectionToggle.bind(this, t)), this.setInitialState(t)
+                this.constructHeaderMarkup(n, e), this.setExpanded(this.isExpanded(t), t), n.addEventListener("click", this.onSectionToggle.bind(this, t)), this.setInitialState(t)
             }.bind(this))
-        }, n.prototype.initHeaderAttributes = function(e, t) {
-            var n = this,
-                o = e.querySelector("." + this.sectionButtonClass),
-                i = e.querySelector("." + this.sectionHeadingClass),
-                r = e.querySelector("." + this.sectionSummaryClass),
+        }, n.prototype.constructHeaderMarkup = function(t, e) {
+            var n = t.querySelector("." + this.sectionButtonClass),
+                o = t.querySelector("." + this.sectionHeadingClass),
+                i = t.querySelector("." + this.sectionSummaryClass),
                 s = document.createElement("button");
-            s.setAttribute("type", "button"), s.setAttribute("id", this.moduleId + "-heading-" + (t + 1)), s.setAttribute("aria-controls", this.moduleId + "-content-" + (t + 1));
-            for (var a = 0; a < o.attributes.length; a++) {
-                var c = o.attributes.item(a);
-                s.setAttribute(c.nodeName, c.nodeValue)
+            s.setAttribute("type", "button"), s.setAttribute("aria-controls", this.moduleId + "-content-" + (e + 1));
+            for (var r = 0; r < n.attributes.length; r++) {
+                var a = n.attributes.item(r);
+                "id" !== a.nodeName && s.setAttribute(a.nodeName, a.nodeValue)
             }
-            s.addEventListener("focusin", function(t) {
-                e.classList.contains(n.sectionHeaderFocusedClass) || (e.className += " " + n.sectionHeaderFocusedClass)
-            }), s.addEventListener("blur", function(t) {
-                e.classList.remove(n.sectionHeaderFocusedClass)
-            }), null != r && s.setAttribute("aria-describedby", this.moduleId + "-summary-" + (t + 1)), s.innerHTML = o.innerHTML, i.removeChild(o), i.appendChild(s);
             var l = document.createElement("span");
-            l.className = this.iconClass, l.setAttribute("aria-hidden", "true"), s.appendChild(l)
+            l.classList.add(this.sectionHeadingTextClass), l.id = n.id;
+            var c = document.createElement("span");
+            c.classList.add(this.sectionHeadingTextFocusClass), l.appendChild(c), c.innerHTML = n.innerHTML;
+            var u = document.createElement("span");
+            u.classList.add(this.sectionShowHideToggleClass), u.setAttribute("data-nosnippet", "");
+            var d = document.createElement("span");
+            d.classList.add(this.sectionShowHideToggleFocusClass), u.appendChild(d);
+            var h = document.createElement("span"),
+                p = document.createElement("span");
+            if (p.classList.add(this.upChevronIconClass), d.appendChild(p), h.classList.add(this.sectionShowHideTextClass), d.appendChild(h), s.appendChild(l), s.appendChild(this.getButtonPunctuationEl()), null != i) {
+                var f = document.createElement("span"),
+                    m = document.createElement("span");
+                m.classList.add(this.sectionSummaryFocusClass), f.appendChild(m);
+                for (var b = 0, v = i.attributes.length; b < v; ++b) {
+                    var y = i.attributes.item(b).nodeName,
+                        g = i.attributes.item(b).nodeValue;
+                    f.setAttribute(y, g)
+                }
+                m.innerHTML = i.innerHTML, i.parentNode.replaceChild(f, i), s.appendChild(f), s.appendChild(this.getButtonPunctuationEl())
+            }
+            s.appendChild(u), o.removeChild(n), o.appendChild(s)
         }, n.prototype.onSectionToggle = function(t) {
             var e = this.isExpanded(t);
             this.setExpanded(!e, t), this.storeState(t)
-        }, n.prototype.onOpenOrCloseAllToggle = function() {
+        }, n.prototype.onShowOrHideAllToggle = function() {
             var e = this,
                 t = this.$sections,
                 n = !this.checkIfAllSectionsOpen();
-            r(t, function(t) {
+            s(t, function(t) {
                 e.setExpanded(n, t), e.storeState(t)
-            }), e.updateOpenAllButton(n)
+            }), e.updateShowAllButton(n)
         }, n.prototype.setExpanded = function(t, e) {
-            e.querySelector("." + this.sectionButtonClass).setAttribute("aria-expanded", t), t ? e.classList.add(this.sectionExpandedClass) : e.classList.remove(this.sectionExpandedClass);
-            var n = this.checkIfAllSectionsOpen();
-            this.updateOpenAllButton(n)
+            var n = e.querySelector("." + this.upChevronIconClass),
+                o = e.querySelector("." + this.sectionShowHideTextClass),
+                i = e.querySelector("." + this.sectionButtonClass),
+                s = t ? "Hide" : "Show",
+                r = document.createElement("span");
+            r.classList.add("govuk-visually-hidden"), r.innerHTML = " this section", o.innerHTML = s, o.appendChild(r), i.setAttribute("aria-expanded", t), t ? (e.classList.add(this.sectionExpandedClass), n.classList.remove(this.downChevronIconClass)) : (e.classList.remove(this.sectionExpandedClass), n.classList.add(this.downChevronIconClass));
+            var a = this.checkIfAllSectionsOpen();
+            this.updateShowAllButton(a)
         }, n.prototype.isExpanded = function(t) {
             return t.classList.contains(this.sectionExpandedClass)
         }, n.prototype.checkIfAllSectionsOpen = function() {
             return this.$sections.length === this.$module.querySelectorAll("." + this.sectionExpandedClass).length
-        }, n.prototype.updateOpenAllButton = function(t) {
-            var e = t ? "Close all" : "Open all";
-            e += '<span class="govuk-visually-hidden"> sections</span>', this.$openAllButton.setAttribute("aria-expanded", t), this.$openAllButton.innerHTML = e
+        }, n.prototype.updateShowAllButton = function(t) {
+            var e = this.$showAllButton.querySelector("." + this.upChevronIconClass),
+                n = this.$showAllButton.querySelector("." + this.showAllTextClass),
+                o = t ? "Hide all sections" : "Show all sections";
+            this.$showAllButton.setAttribute("aria-expanded", t), n.innerHTML = o, t ? e.classList.remove(this.downChevronIconClass) : e.classList.add(this.downChevronIconClass)
         };
     var e = {
         checkForSessionStorage: function() {
@@ -322,13 +347,16 @@
                     null !== o && this.setExpanded("true" === o, t)
                 }
             }
+        }, n.prototype.getButtonPunctuationEl = function() {
+            var t = document.createElement("span");
+            return t.classList.add("govuk-visually-hidden", "govuk-accordion__section-heading-divider"), t.innerHTML = ", ", t
         },
         function(t) {
             "Window" in this || "undefined" == typeof WorkerGlobalScope && "function" != typeof importScripts && function(t) {
                 t.constructor ? t.Window = t.constructor : (t.Window = t.constructor = new Function("return function Window() {}")()).prototype = this
             }(this)
         }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}),
-        function(r) {
+        function(s) {
             ! function(t) {
                 if (!("Event" in t)) return !1;
                 if ("function" == typeof t.Event) return !0;
@@ -362,34 +390,34 @@
                         var n;
                         if ("createEvent" in document) {
                             n = document.createEvent("Event");
-                            var o = !(!e || e.bubbles === r) && e.bubbles,
-                                i = !(!e || e.cancelable === r) && e.cancelable;
+                            var o = !(!e || e.bubbles === s) && e.bubbles,
+                                i = !(!e || e.cancelable === s) && e.cancelable;
                             return n.initEvent(t, o, i), n
                         }
-                        return (n = document.createEventObject()).type = t, n.bubbles = !(!e || e.bubbles === r) && e.bubbles, n.cancelable = !(!e || e.cancelable === r) && e.cancelable, n
+                        return (n = document.createEventObject()).type = t, n.bubbles = !(!e || e.bubbles === s) && e.bubbles, n.cancelable = !(!e || e.cancelable === s) && e.cancelable, n
                     }, t && Object.defineProperty(window.Event, "prototype", {
                         configurable: !1,
                         enumerable: !1,
                         writable: !0,
                         value: t
                     }), "createEvent" in document || (window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function() {
-                        var s = this,
+                        var r = this,
                             t = arguments[0],
                             e = arguments[1];
-                        if (s === window && t in n) throw new Error("In IE8 the event: " + t + " is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.");
-                        s._events || (s._events = {}), s._events[t] || (s._events[t] = function(t) {
-                            var e, n = s._events[t.type].list,
+                        if (r === window && t in n) throw new Error("In IE8 the event: " + t + " is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.");
+                        r._events || (r._events = {}), r._events[t] || (r._events[t] = function(t) {
+                            var e, n = r._events[t.type].list,
                                 o = n.slice(),
                                 i = -1,
-                                r = o.length;
+                                s = o.length;
                             for (t.preventDefault = function() {
                                     !1 !== t.cancelable && (t.returnValue = !1)
                                 }, t.stopPropagation = function() {
                                     t.cancelBubble = !0
                                 }, t.stopImmediatePropagation = function() {
                                     t.cancelBubble = !0, t.cancelImmediate = !0
-                                }, t.currentTarget = s, t.relatedTarget = t.fromElement || null, t.target = t.target || t.srcElement || s, t.timeStamp = (new Date).getTime(), t.clientX && (t.pageX = t.clientX + document.documentElement.scrollLeft, t.pageY = t.clientY + document.documentElement.scrollTop); ++i < r && !t.cancelImmediate;) i in o && -1 !== a(n, e = o[i]) && "function" == typeof e && e.call(s, t)
-                        }, s._events[t].list = [], s.attachEvent && s.attachEvent("on" + t, s._events[t])), s._events[t].list.push(e)
+                                }, t.currentTarget = r, t.relatedTarget = t.fromElement || null, t.target = t.target || t.srcElement || r, t.timeStamp = (new Date).getTime(), t.clientX && (t.pageX = t.clientX + document.documentElement.scrollLeft, t.pageY = t.clientY + document.documentElement.scrollTop); ++i < s && !t.cancelImmediate;) i in o && -1 !== a(n, e = o[i]) && "function" == typeof e && e.call(r, t)
+                        }, r._events[t].list = [], r.attachEvent && r.attachEvent("on" + t, r._events[t])), r._events[t].list.push(e)
                     }, window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function() {
                         var t, e = this,
                             n = arguments[0],
@@ -447,19 +475,19 @@
         this.$module = t
     }
 
-    function s(t) {
-        this.$module = t, this.$textarea = t.querySelector(".govuk-js-character-count"), this.$textarea && (this.$countMessage = t.querySelector('[id="' + this.$textarea.id + '-info"]'))
+    function r(t) {
+        this.$module = t, this.$textarea = t.querySelector(".govuk-js-character-count"), this.$textarea && (this.$countMessage = document.getElementById(this.$textarea.id + "-info"))
     }
 
     function a(t) {
         this.$module = t, this.$inputs = t.querySelectorAll('input[type="checkbox"]')
     }
 
-    function c(t) {
+    function l(t) {
         this.$module = t
     }
 
-    function l(t) {
+    function c(t) {
         this.$module = t
     }
 
@@ -472,6 +500,10 @@
     }
 
     function h(t) {
+        this.$module = t, this.$linkedElement = null, this.linkedElementListener = !1
+    }
+
+    function p(t) {
         this.$module = t, this.$tabs = t.querySelectorAll(".govuk-tabs__tab"), this.keys = {
             left: 37,
             right: 39,
@@ -507,10 +539,10 @@
                 var e = t.target;
                 32 === t.keyCode && "summary" === e.nodeName.toLowerCase() && t.preventDefault()
             }), t.addEventListener("click", n)
-        }, s.prototype.defaults = {
+        }, r.prototype.defaults = {
             characterCountAttribute: "data-maxlength",
             wordCountAttribute: "data-maxwords"
-        }, s.prototype.init = function() {
+        }, r.prototype.init = function() {
             var t = this.$module,
                 e = this.$textarea,
                 n = this.$countMessage;
@@ -519,63 +551,63 @@
                 var o = this.defaults.characterCountAttribute;
                 this.options.maxwords && (o = this.defaults.wordCountAttribute), this.maxLength = t.getAttribute(o), this.maxLength && (t.removeAttribute("maxlength"), "onpageshow" in window ? window.addEventListener("pageshow", this.sync.bind(this)) : window.addEventListener("DOMContentLoaded", this.sync.bind(this)), this.sync())
             }
-        }, s.prototype.sync = function() {
+        }, r.prototype.sync = function() {
             this.bindChangeEvents(), this.updateCountMessage()
-        }, s.prototype.getDataset = function(t) {
+        }, r.prototype.getDataset = function(t) {
             var e = {},
                 n = t.attributes;
             if (n)
                 for (var o = 0; o < n.length; o++) {
                     var i = n[o],
-                        r = i.name.match(/^data-(.+)/);
-                    r && (e[r[1]] = i.value)
+                        s = i.name.match(/^data-(.+)/);
+                    s && (e[s[1]] = i.value)
                 }
             return e
-        }, s.prototype.count = function(t) {
+        }, r.prototype.count = function(t) {
             var e;
             this.options.maxwords ? e = (t.match(/\S+/g) || []).length : e = t.length;
             return e
-        }, s.prototype.bindChangeEvents = function() {
+        }, r.prototype.bindChangeEvents = function() {
             var t = this.$textarea;
             t.addEventListener("keyup", this.checkIfValueChanged.bind(this)), t.addEventListener("focus", this.handleFocus.bind(this)), t.addEventListener("blur", this.handleBlur.bind(this))
-        }, s.prototype.checkIfValueChanged = function() {
+        }, r.prototype.checkIfValueChanged = function() {
             this.$textarea.oldValue || (this.$textarea.oldValue = ""), this.$textarea.value !== this.$textarea.oldValue && (this.$textarea.oldValue = this.$textarea.value, this.updateCountMessage())
-        }, s.prototype.updateCountMessage = function() {
+        }, r.prototype.updateCountMessage = function() {
             var t = this.$textarea,
                 e = this.options,
                 n = this.$countMessage,
                 o = this.count(t.value),
                 i = this.maxLength,
-                r = i - o;
-            o < i * (e.threshold ? e.threshold : 0) / 100 ? (n.classList.add("govuk-character-count__message--disabled"), n.setAttribute("aria-hidden", !0)) : (n.classList.remove("govuk-character-count__message--disabled"), n.removeAttribute("aria-hidden")), r < 0 ? (t.classList.add("govuk-textarea--error"), n.classList.remove("govuk-hint"), n.classList.add("govuk-error-message")) : (t.classList.remove("govuk-textarea--error"), n.classList.remove("govuk-error-message"), n.classList.add("govuk-hint"));
-            var s, a, c = "character";
-            e.maxwords && (c = "word"), c += -1 == r || 1 == r ? "" : "s", s = r < 0 ? "too many" : "remaining", a = Math.abs(r), n.innerHTML = "You have " + a + " " + c + " " + s
-        }, s.prototype.handleFocus = function() {
+                s = i - o;
+            o < i * (e.threshold ? e.threshold : 0) / 100 ? (n.classList.add("govuk-character-count__message--disabled"), n.setAttribute("aria-hidden", !0)) : (n.classList.remove("govuk-character-count__message--disabled"), n.removeAttribute("aria-hidden")), s < 0 ? (t.classList.add("govuk-textarea--error"), n.classList.remove("govuk-hint"), n.classList.add("govuk-error-message")) : (t.classList.remove("govuk-textarea--error"), n.classList.remove("govuk-error-message"), n.classList.add("govuk-hint"));
+            var r, a, l = "character";
+            e.maxwords && (l = "word"), l += -1 == s || 1 == s ? "" : "s", r = s < 0 ? "too many" : "remaining", a = Math.abs(s), n.innerHTML = "You have " + a + " " + l + " " + r
+        }, r.prototype.handleFocus = function() {
             this.valueChecker = setInterval(this.checkIfValueChanged.bind(this), 1e3)
-        }, s.prototype.handleBlur = function() {
+        }, r.prototype.handleBlur = function() {
             clearInterval(this.valueChecker)
         }, a.prototype.init = function() {
-            var n = this.$module;
-            r(this.$inputs, function(t) {
+            var t = this.$module;
+            s(this.$inputs, function(t) {
                 var e = t.getAttribute("data-aria-controls");
-                e && n.querySelector("#" + e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
-            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), n.addEventListener("click", this.handleClick.bind(this))
+                e && document.getElementById(e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
+            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), t.addEventListener("click", this.handleClick.bind(this))
         }, a.prototype.syncAllConditionalReveals = function() {
-            r(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
+            s(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
         }, a.prototype.syncConditionalRevealWithInputState = function(t) {
-            var e = this.$module.querySelector("#" + t.getAttribute("aria-controls"));
+            var e = document.getElementById(t.getAttribute("aria-controls"));
             if (e && e.classList.contains("govuk-checkboxes__conditional")) {
                 var n = t.checked;
                 t.setAttribute("aria-expanded", n), e.classList.toggle("govuk-checkboxes__conditional--hidden", !n)
             }
         }, a.prototype.unCheckAllInputsExcept = function(e) {
-            r(document.querySelectorAll('input[type="checkbox"][name="' + e.name + '"]'), function(t) {
-                e.form === t.form && t !== e && (t.checked = !1)
-            }), this.syncAllConditionalReveals()
+            s(document.querySelectorAll('input[type="checkbox"][name="' + e.name + '"]'), function(t) {
+                e.form === t.form && t !== e && (t.checked = !1, this.syncConditionalRevealWithInputState(t))
+            }.bind(this))
         }, a.prototype.unCheckExclusiveInputs = function(e) {
-            r(document.querySelectorAll('input[data-behaviour="exclusive"][type="checkbox"][name="' + e.name + '"]'), function(t) {
-                e.form === t.form && (t.checked = !1)
-            }), this.syncAllConditionalReveals()
+            s(document.querySelectorAll('input[data-behaviour="exclusive"][type="checkbox"][name="' + e.name + '"]'), function(t) {
+                e.form === t.form && (t.checked = !1, this.syncConditionalRevealWithInputState(t))
+            }.bind(this))
         }, a.prototype.handleClick = function(t) {
             var e = t.target;
             "checkbox" === e.type && (e.getAttribute("aria-controls") && this.syncConditionalRevealWithInputState(e), e.checked && ("exclusive" === e.getAttribute("data-behaviour") ? this.unCheckAllInputsExcept(e) : this.unCheckExclusiveInputs(e)))
@@ -594,13 +626,13 @@
                 }
                 return null
             })
-        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), c.prototype.init = function() {
+        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), l.prototype.init = function() {
             var t = this.$module;
             t && (t.focus(), t.addEventListener("click", this.handleClick.bind(this)))
-        }, c.prototype.handleClick = function(t) {
+        }, l.prototype.handleClick = function(t) {
             var e = t.target;
             this.focusTarget(e) && t.preventDefault()
-        }, c.prototype.focusTarget = function(t) {
+        }, l.prototype.focusTarget = function(t) {
             if ("A" !== t.tagName || !1 === t.href) return !1;
             var e = this.getFragmentFromUrl(t.href),
                 n = document.getElementById(e);
@@ -609,9 +641,9 @@
             return !!o && (o.scrollIntoView(), n.focus({
                 preventScroll: !0
             }), !0)
-        }, c.prototype.getFragmentFromUrl = function(t) {
+        }, l.prototype.getFragmentFromUrl = function(t) {
             return -1 !== t.indexOf("#") && t.split("#").pop()
-        }, c.prototype.getAssociatedLegendOrLabel = function(t) {
+        }, l.prototype.getAssociatedLegendOrLabel = function(t) {
             var e = t.closest("fieldset");
             if (e) {
                 var n = e.getElementsByTagName("legend");
@@ -619,46 +651,58 @@
                     var o = n[0];
                     if ("checkbox" === t.type || "radio" === t.type) return o;
                     var i = o.getBoundingClientRect().top,
-                        r = t.getBoundingClientRect();
-                    if (r.height && window.innerHeight)
-                        if (r.top + r.height - i < window.innerHeight / 2) return o
+                        s = t.getBoundingClientRect();
+                    if (s.height && window.innerHeight)
+                        if (s.top + s.height - i < window.innerHeight / 2) return o
                 }
             }
             return document.querySelector("label[for='" + t.getAttribute("id") + "']") || t.closest("label")
-        }, l.prototype.init = function() {
+        }, c.prototype.init = function() {
             this.$module && this.setFocus()
-        }, l.prototype.setFocus = function() {
+        }, c.prototype.setFocus = function() {
             var t = this.$module;
             "true" !== t.getAttribute("data-disable-auto-focus") && "alert" === t.getAttribute("role") && (t.getAttribute("tabindex") || (t.setAttribute("tabindex", "-1"), t.addEventListener("blur", function() {
                 t.removeAttribute("tabindex")
             })), t.focus())
         }, u.prototype.init = function() {
-            this.$module && this.$menuButton && this.$menu && (this.syncState(this.$menu.classList.contains("govuk-header__navigation--open")), this.$menuButton.addEventListener("click", this.handleMenuButtonClick.bind(this)))
+            this.$module && this.$menuButton && this.$menu && (this.syncState(this.$menu.classList.contains("govuk-header__navigation-list--open")), this.$menuButton.addEventListener("click", this.handleMenuButtonClick.bind(this)))
         }, u.prototype.syncState = function(t) {
             this.$menuButton.classList.toggle("govuk-header__menu-button--open", t), this.$menuButton.setAttribute("aria-expanded", t)
         }, u.prototype.handleMenuButtonClick = function() {
-            var t = this.$menu.classList.toggle("govuk-header__navigation--open");
+            var t = this.$menu.classList.toggle("govuk-header__navigation-list--open");
             this.syncState(t)
         }, d.prototype.init = function() {
-            var n = this.$module;
-            r(this.$inputs, function(t) {
+            var t = this.$module;
+            s(this.$inputs, function(t) {
                 var e = t.getAttribute("data-aria-controls");
-                e && n.querySelector("#" + e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
-            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), n.addEventListener("click", this.handleClick.bind(this))
+                e && document.getElementById(e) && (t.setAttribute("aria-controls", e), t.removeAttribute("data-aria-controls"))
+            }), "onpageshow" in window ? window.addEventListener("pageshow", this.syncAllConditionalReveals.bind(this)) : window.addEventListener("DOMContentLoaded", this.syncAllConditionalReveals.bind(this)), this.syncAllConditionalReveals(), t.addEventListener("click", this.handleClick.bind(this))
         }, d.prototype.syncAllConditionalReveals = function() {
-            r(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
+            s(this.$inputs, this.syncConditionalRevealWithInputState.bind(this))
         }, d.prototype.syncConditionalRevealWithInputState = function(t) {
-            var e = document.querySelector("#" + t.getAttribute("aria-controls"));
+            var e = document.getElementById(t.getAttribute("aria-controls"));
             if (e && e.classList.contains("govuk-radios__conditional")) {
                 var n = t.checked;
                 t.setAttribute("aria-expanded", n), e.classList.toggle("govuk-radios__conditional--hidden", !n)
             }
         }, d.prototype.handleClick = function(t) {
             var n = t.target;
-            "radio" === n.type && r(document.querySelectorAll('input[type="radio"][aria-controls]'), function(t) {
+            "radio" === n.type && s(document.querySelectorAll('input[type="radio"][aria-controls]'), function(t) {
                 var e = t.form === n.form;
                 t.name === n.name && e && this.syncConditionalRevealWithInputState(t)
             }.bind(this))
+        }, h.prototype.init = function() {
+            this.$module && (this.$linkedElement = this.getLinkedElement(), this.$linkedElement && this.$module.addEventListener("click", this.focusLinkedElement.bind(this)))
+        }, h.prototype.getLinkedElement = function() {
+            var t = this.getFragmentFromUrl();
+            return !!t && document.getElementById(t)
+        }, h.prototype.focusLinkedElement = function() {
+            var t = this.$linkedElement;
+            t.getAttribute("tabindex") || (t.setAttribute("tabindex", "-1"), t.classList.add("govuk-skip-link-focused-element"), this.linkedElementListener || (this.$linkedElement.addEventListener("blur", this.removeFocusProperties.bind(this)), this.linkedElementListener = !0)), t.focus()
+        }, h.prototype.removeFocusProperties = function() {
+            this.$linkedElement.removeAttribute("tabindex"), this.$linkedElement.classList.remove("govuk-skip-link-focused-element")
+        }, h.prototype.getFragmentFromUrl = function() {
+            return !!this.$module.hash && this.$module.hash.split("#").pop()
         },
         function(t) {
             "document" in this && "nextElementSibling" in document.documentElement || Object.defineProperty(Element.prototype, "nextElementSibling", {
@@ -675,37 +719,37 @@
                     return t
                 }
             })
-        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), h.prototype.init = function() {
+        }.call("object" == typeof window && window || "object" == typeof self && self || "object" == typeof global && global || {}), p.prototype.init = function() {
             "function" == typeof window.matchMedia ? this.setupResponsiveChecks() : this.setup()
-        }, h.prototype.setupResponsiveChecks = function() {
+        }, p.prototype.setupResponsiveChecks = function() {
             this.mql = window.matchMedia("(min-width: 40.0625em)"), this.mql.addListener(this.checkMode.bind(this)), this.checkMode()
-        }, h.prototype.checkMode = function() {
+        }, p.prototype.checkMode = function() {
             this.mql.matches ? this.setup() : this.teardown()
-        }, h.prototype.setup = function() {
+        }, p.prototype.setup = function() {
             var t = this.$module,
                 e = this.$tabs,
                 n = t.querySelector(".govuk-tabs__list"),
                 o = t.querySelectorAll(".govuk-tabs__list-item");
             if (e && n && o) {
-                n.setAttribute("role", "tablist"), r(o, function(t) {
+                n.setAttribute("role", "tablist"), s(o, function(t) {
                     t.setAttribute("role", "presentation")
-                }), r(e, function(t) {
+                }), s(e, function(t) {
                     this.setAttributes(t), t.boundTabClick = this.onTabClick.bind(this), t.boundTabKeydown = this.onTabKeydown.bind(this), t.addEventListener("click", t.boundTabClick, !0), t.addEventListener("keydown", t.boundTabKeydown, !0), this.hideTab(t)
                 }.bind(this));
                 var i = this.getTab(window.location.hash) || this.$tabs[0];
                 this.showTab(i), t.boundOnHashChange = this.onHashChange.bind(this), window.addEventListener("hashchange", t.boundOnHashChange, !0)
             }
-        }, h.prototype.teardown = function() {
+        }, p.prototype.teardown = function() {
             var t = this.$module,
                 e = this.$tabs,
                 n = t.querySelector(".govuk-tabs__list"),
                 o = t.querySelectorAll(".govuk-tabs__list-item");
-            e && n && o && (n.removeAttribute("role"), r(o, function(t) {
+            e && n && o && (n.removeAttribute("role"), s(o, function(t) {
                 t.removeAttribute("role", "presentation")
-            }), r(e, function(t) {
+            }), s(e, function(t) {
                 t.removeEventListener("click", t.boundTabClick, !0), t.removeEventListener("keydown", t.boundTabKeydown, !0), this.unsetAttributes(t)
             }.bind(this)), window.removeEventListener("hashchange", t.boundOnHashChange, !0))
-        }, h.prototype.onHashChange = function(t) {
+        }, p.prototype.onHashChange = function(t) {
             var e = window.location.hash,
                 n = this.getTab(e);
             if (n)
@@ -714,32 +758,32 @@
                     var o = this.getCurrentTab();
                     this.hideTab(o), this.showTab(n), n.focus()
                 }
-        }, h.prototype.hideTab = function(t) {
+        }, p.prototype.hideTab = function(t) {
             this.unhighlightTab(t), this.hidePanel(t)
-        }, h.prototype.showTab = function(t) {
+        }, p.prototype.showTab = function(t) {
             this.highlightTab(t), this.showPanel(t)
-        }, h.prototype.getTab = function(t) {
+        }, p.prototype.getTab = function(t) {
             return this.$module.querySelector('.govuk-tabs__tab[href="' + t + '"]')
-        }, h.prototype.setAttributes = function(t) {
+        }, p.prototype.setAttributes = function(t) {
             var e = this.getHref(t).slice(1);
             t.setAttribute("id", "tab_" + e), t.setAttribute("role", "tab"), t.setAttribute("aria-controls", e), t.setAttribute("aria-selected", "false"), t.setAttribute("tabindex", "-1");
             var n = this.getPanel(t);
             n.setAttribute("role", "tabpanel"), n.setAttribute("aria-labelledby", t.id), n.classList.add(this.jsHiddenClass)
-        }, h.prototype.unsetAttributes = function(t) {
+        }, p.prototype.unsetAttributes = function(t) {
             t.removeAttribute("id"), t.removeAttribute("role"), t.removeAttribute("aria-controls"), t.removeAttribute("aria-selected"), t.removeAttribute("tabindex");
             var e = this.getPanel(t);
             e.removeAttribute("role"), e.removeAttribute("aria-labelledby"), e.classList.remove(this.jsHiddenClass)
-        }, h.prototype.onTabClick = function(t) {
+        }, p.prototype.onTabClick = function(t) {
             if (!t.target.classList.contains("govuk-tabs__tab")) return !1;
             t.preventDefault();
             var e = t.target,
                 n = this.getCurrentTab();
             this.hideTab(n), this.showTab(e), this.createHistoryEntry(e)
-        }, h.prototype.createHistoryEntry = function(t) {
+        }, p.prototype.createHistoryEntry = function(t) {
             var e = this.getPanel(t),
                 n = e.id;
             e.id = "", this.changingHash = !0, window.location.hash = this.getHref(t).slice(1), e.id = n
-        }, h.prototype.onTabKeydown = function(t) {
+        }, p.prototype.onTabKeydown = function(t) {
             switch (t.keyCode) {
                 case this.keys.left:
                 case this.keys.up:
@@ -749,49 +793,49 @@
                 case this.keys.down:
                     this.activateNextTab(), t.preventDefault()
             }
-        }, h.prototype.activateNextTab = function() {
+        }, p.prototype.activateNextTab = function() {
             var t = this.getCurrentTab(),
                 e = t.parentNode.nextElementSibling;
             if (e) var n = e.querySelector(".govuk-tabs__tab");
             n && (this.hideTab(t), this.showTab(n), n.focus(), this.createHistoryEntry(n))
-        }, h.prototype.activatePreviousTab = function() {
+        }, p.prototype.activatePreviousTab = function() {
             var t = this.getCurrentTab(),
                 e = t.parentNode.previousElementSibling;
             if (e) var n = e.querySelector(".govuk-tabs__tab");
             n && (this.hideTab(t), this.showTab(n), n.focus(), this.createHistoryEntry(n))
-        }, h.prototype.getPanel = function(t) {
+        }, p.prototype.getPanel = function(t) {
             return this.$module.querySelector(this.getHref(t))
-        }, h.prototype.showPanel = function(t) {
+        }, p.prototype.showPanel = function(t) {
             this.getPanel(t).classList.remove(this.jsHiddenClass)
-        }, h.prototype.hidePanel = function(t) {
+        }, p.prototype.hidePanel = function(t) {
             this.getPanel(t).classList.add(this.jsHiddenClass)
-        }, h.prototype.unhighlightTab = function(t) {
+        }, p.prototype.unhighlightTab = function(t) {
             t.setAttribute("aria-selected", "false"), t.parentNode.classList.remove("govuk-tabs__list-item--selected"), t.setAttribute("tabindex", "-1")
-        }, h.prototype.highlightTab = function(t) {
+        }, p.prototype.highlightTab = function(t) {
             t.setAttribute("aria-selected", "true"), t.parentNode.classList.add("govuk-tabs__list-item--selected"), t.setAttribute("tabindex", "0")
-        }, h.prototype.getCurrentTab = function() {
+        }, p.prototype.getCurrentTab = function() {
             return this.$module.querySelector(".govuk-tabs__list-item--selected .govuk-tabs__tab")
-        }, h.prototype.getHref = function(t) {
+        }, p.prototype.getHref = function(t) {
             var e = t.getAttribute("href");
             return e.slice(e.indexOf("#"), e.length)
-        }, t.initAll = function p(t) {
+        }, t.initAll = function f(t) {
             var e = "undefined" != typeof(t = void 0 !== t ? t : {}).scope ? t.scope : document;
-            r(e.querySelectorAll('[data-module="govuk-button"]'), function(t) {
+            s(e.querySelectorAll('[data-module="govuk-button"]'), function(t) {
                 new o(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-accordion"]'), function(t) {
+            }), s(e.querySelectorAll('[data-module="govuk-accordion"]'), function(t) {
                 new n(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-details"]'), function(t) {
+            }), s(e.querySelectorAll('[data-module="govuk-details"]'), function(t) {
                 new i(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-character-count"]'), function(t) {
-                new s(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-checkboxes"]'), function(t) {
+            }), s(e.querySelectorAll('[data-module="govuk-character-count"]'), function(t) {
+                new r(t).init()
+            }), s(e.querySelectorAll('[data-module="govuk-checkboxes"]'), function(t) {
                 new a(t).init()
-            }), new c(e.querySelector('[data-module="govuk-error-summary"]')).init(), new u(e.querySelector('[data-module="govuk-header"]')).init(), r(e.querySelectorAll('[data-module="govuk-notification-banner"]'), function(t) {
-                new l(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-radios"]'), function(t) {
+            }), new l(e.querySelector('[data-module="govuk-error-summary"]')).init(), new u(e.querySelector('[data-module="govuk-header"]')).init(), s(e.querySelectorAll('[data-module="govuk-notification-banner"]'), function(t) {
+                new c(t).init()
+            }), s(e.querySelectorAll('[data-module="govuk-radios"]'), function(t) {
                 new d(t).init()
-            }), r(e.querySelectorAll('[data-module="govuk-tabs"]'), function(t) {
-                new h(t).init()
+            }), new h(e.querySelector('[data-module="govuk-skip-link"]')).init(), s(e.querySelectorAll('[data-module="govuk-tabs"]'), function(t) {
+                new p(t).init()
             })
-        }, t.Accordion = n, t.Button = o, t.Details = i, t.CharacterCount = s, t.Checkboxes = a, t.ErrorSummary = c, t.Header = u, t.Radios = d, t.Tabs = h
+        }, t.Accordion = n, t.Button = o, t.Details = i, t.CharacterCount = r, t.Checkboxes = a, t.ErrorSummary = l, t.Header = u, t.NotificationBanner = c, t.Radios = d, t.SkipLink = h, t.Tabs = p
 });
\ No newline at end of file
diff --git a/dist/govuk-frontend-ie8-3.13.1.min.css b/dist/govuk-frontend-ie8-4.0.0.min.css
similarity index 5%
rename from dist/govuk-frontend-ie8-3.13.1.min.css
rename to dist/govuk-frontend-ie8-4.0.0.min.css
index ee0ca6f6..fb7224dd 100644
--- a/dist/govuk-frontend-ie8-3.13.1.min.css
+++ b/dist/govuk-frontend-ie8-4.0.0.min.css
@@ -23,10 +23,7 @@
     color: #003078
 }
 
-.govuk-link:active {
-    color: #0b0c0c
-}
-
+.govuk-link:active,
 .govuk-link:focus {
     color: #0b0c0c
 }
@@ -37,14 +34,8 @@
 }
 
 .govuk-link--muted:active,
-.govuk-link--muted:hover {
-    color: #0b0c0c
-}
-
-.govuk-link--muted:focus {
-    color: #0b0c0c
-}
-
+.govuk-link--muted:focus,
+.govuk-link--muted:hover,
 .govuk-link--text-colour:link,
 .govuk-link--text-colour:visited {
     color: #0b0c0c
@@ -86,11 +77,9 @@
     color: #003078
 }
 
-.govuk-link--no-visited-state:active {
-    color: #0b0c0c
-}
-
-.govuk-link--no-visited-state:focus {
+.govuk-link--no-visited-state:active,
+.govuk-link--no-visited-state:focus,
+.govuk-list {
     color: #0b0c0c
 }
 
@@ -105,7 +94,6 @@
     font-size: 19px;
     font-size: 1.1875rem;
     line-height: 1.31579;
-    color: #0b0c0c;
     margin-top: 0;
     margin-bottom: 20px;
     padding-left: 0;
@@ -139,19 +127,6 @@
     margin-bottom: 15px
 }
 
-.govuk-template {
-    background-color: #f3f2f1;
-    -webkit-text-size-adjust: 100%;
-    -ms-text-size-adjust: 100%;
-    text-size-adjust: 100%;
-    overflow-y: scroll
-}
-
-.govuk-template__body {
-    margin: 0;
-    background-color: #fff
-}
-
 .govuk-heading-xl {
     color: #0b0c0c;
     font-family: GDS Transport, arial, sans-serif;
@@ -564,6 +539,19 @@
     padding-top: 50px
 }
 
+.govuk-template {
+    background-color: #f3f2f1;
+    -webkit-text-size-adjust: 100%;
+    -ms-text-size-adjust: 100%;
+    text-size-adjust: 100%;
+    overflow-y: scroll
+}
+
+.govuk-template__body {
+    margin: 0;
+    background-color: #fff
+}
+
 .govuk-width-container {
     max-width: 960px;
     width: 960px;
@@ -588,39 +576,31 @@
     padding-top: 15px
 }
 
-.govuk-accordion__section-header {
+.govuk-accordion__section-heading {
+    margin-top: 0;
+    margin-bottom: 0;
     padding-top: 15px;
     padding-bottom: 15px
 }
 
-.govuk-accordion__section-heading {
-    font-weight: 400;
-    margin-top: 0
+.govuk-accordion__section-button {
+    color: #0b0c0c;
+    display: block;
+    margin-bottom: 0;
+    padding-top: 15px
 }
 
-.govuk-accordion__section-button,
-.govuk-accordion__section-heading {
+.govuk-accordion__section-heading-text {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
     -moz-osx-font-smoothing: grayscale;
+    font-weight: 700;
     font-size: 18px;
     font-size: 1.125rem;
     line-height: 1.11111;
     font-size: 24px;
     font-size: 1.5rem;
-    line-height: 1.25;
-    margin-bottom: 0
-}
-
-.govuk-accordion__section-button {
-    font-weight: 700;
-    display: inline-block;
-    padding-top: 15px
-}
-
-.govuk-accordion__section-summary {
-    margin-top: 10px;
-    margin-bottom: 0
+    line-height: 1.25
 }
 
 .govuk-accordion__section-content>:last-child {
@@ -637,158 +617,230 @@
 
 .js-enabled .govuk-accordion__section-content {
     display: none;
-    padding-top: 15px;
-    padding-bottom: 15px
+    padding-bottom: 50px
 }
 
 .js-enabled .govuk-accordion__section--expanded .govuk-accordion__section-content {
     display: block
 }
 
-.js-enabled .govuk-accordion__open-all {
+.js-enabled .govuk-accordion__show-all {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 400;
-    font-size: 14px;
-    font-size: .875rem;
-    line-height: 1.14286;
     font-size: 16px;
     font-size: 1rem;
     line-height: 1.25;
+    font-size: 19px;
+    font-size: 1.1875rem;
+    line-height: 1.31579;
     position: relative;
     z-index: 1;
-    margin: 0;
-    padding: 0;
+    padding: 5px 2px 5px 0;
     border-width: 0;
     color: #1d70b8;
     background: none;
     cursor: pointer;
     -webkit-appearance: none;
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    text-decoration: underline
+    margin-bottom: 14px
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
+.js-enabled .govuk-accordion__show-all::-moz-focus-inner {
+    padding: 0;
+    border: 0
+}
+
+.js-enabled .govuk-accordion__show-all:hover {
+    color: #0b0c0c;
+    background: #f3f2f1;
+    box-shadow: 0 -2px #f3f2f1, 0 4px #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__show-all:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__show-all:focus {
+    color: #0b0c0c;
     background-color: #fd0;
     box-shadow: 0 -2px #fd0, 0 4px #0b0c0c;
     text-decoration: none
 }
 
-.js-enabled .govuk-accordion__open-all:link {
-    color: #1d70b8
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron {
+    background: #0b0c0c
 }
 
-.js-enabled .govuk-accordion__open-all:visited {
-    color: #4c2c92
+.js-enabled .govuk-accordion__show-all:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
 }
 
-.js-enabled .govuk-accordion__open-all:hover {
-    color: #003078
+.js-enabled .govuk-accordion__section-heading {
+    padding: 0
 }
 
-.js-enabled .govuk-accordion__open-all:active {
-    color: #0b0c0c
+.js-enabled .govuk-accordion-nav__chevron {
+    box-sizing: border-box;
+    position: relative;
+    width: 1.25rem;
+    height: 1.25rem;
+    border: .0625rem solid;
+    border-radius: 50%;
+    vertical-align: middle;
+    display: inline-block;
+    max-height: 20px;
+    line-height: 1
 }
 
-.js-enabled .govuk-accordion__open-all:focus {
-    color: #0b0c0c
+.js-enabled .govuk-accordion-nav__chevron:after {
+    content: "";
+    box-sizing: border-box;
+    display: block;
+    position: absolute;
+    bottom: .3125rem;
+    left: .375rem;
+    width: .375rem;
+    height: .375rem;
+    -webkit-transform: rotate(-45deg);
+    -ms-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+    content: "\25B2";
+    position: relative;
+    border: 0
 }
 
-.js-enabled .govuk-accordion__open-all::-moz-focus-inner {
-    padding: 0;
-    border: 0
+.js-enabled .govuk-accordion-nav__chevron--down {
+    -webkit-transform: rotate(180deg);
+    -ms-transform: rotate(180deg);
+    transform: rotate(180deg)
 }
 
-.js-enabled .govuk-accordion__section-header {
-    position: relative;
-    padding-right: 40px;
-    border-top: 1px solid #b1b4b6;
-    cursor: pointer
+.js-enabled .govuk-accordion-nav__chevron--down:after {
+    content: "\25BC";
+    -webkit-transform: none;
+    -ms-transform: none;
+    transform: none
 }
 
 .js-enabled .govuk-accordion__section-button {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 0;
-    padding: 0;
-    border-width: 0;
-    color: #1d70b8;
+    width: 100%;
+    border: 0;
+    border-top: 1px solid #b1b4b6;
+    border-bottom: 10px solid transparent;
+    color: #0b0c0c;
     background: none;
     text-align: left;
     cursor: pointer;
-    -webkit-appearance: none
+    -webkit-appearance: none;
+    padding: 10px 0
+}
+
+.js-enabled .govuk-accordion__section-button:active {
+    color: #0b0c0c;
+    background: none
+}
+
+.js-enabled .govuk-accordion__section-button:hover {
+    color: #0b0c0c;
+    background: #f3f2f1
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion__section-toggle-text {
+    color: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
+}
+
+.js-enabled .govuk-accordion__section-button:hover .govuk-accordion-nav__chevron:after {
+    color: #f3f2f1
 }
 
 .js-enabled .govuk-accordion__section-button:focus {
+    outline: 0
+}
+
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
     color: #0b0c0c;
     background-color: #fd0;
     box-shadow: 0 -2px #fd0, 0 4px #0b0c0c;
     text-decoration: none
 }
 
-.js-enabled .govuk-accordion__section-button::-moz-focus-inner {
-    padding: 0;
-    border: 0
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron {
+    color: #0b0c0c;
+    background: #0b0c0c
 }
 
-.js-enabled .govuk-accordion__section-button:after {
-    content: "";
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion-nav__chevron:after {
+    color: #fd0
 }
 
-    {
-    color: #003078;
-    text-decoration: underline;
-    text-underline-offset: .1em
+.js-enabled .govuk-accordion__section-button::-moz-focus-inner {
+    padding: 0;
+    border: 0
 }
 
-.js-enabled .govuk-accordion__controls {
-    text-align: right
+.js-enabled .govuk-accordion__section--expanded .govuk-accordion__section-button {
+    padding-bottom: 20px;
+    border-bottom: 0
 }
 
-.js-enabled .govuk-accordion__icon {
-    position: absolute;
-    top: 50%;
-    right: 15px;
-    width: 16px;
-    height: 16px;
-    margin-top: -8px
+.js-enabled .govuk-accordion__section-button:focus .govuk-accordion__section-toggle-focus {
+    padding-bottom: 2px
 }
 
-.js-enabled .govuk-accordion__icon:after,
-.js-enabled .govuk-accordion__icon:before {
-    content: "";
-    box-sizing: border-box;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    width: 25%;
-    height: 25%;
-    margin: auto;
-    border: 2px solid transparent;
-    background-color: #0b0c0c
+.js-enabled .govuk-accordion__section-heading-text,
+.js-enabled .govuk-accordion__section-summary,
+.js-enabled .govuk-accordion__section-toggle {
+    display: block;
+    margin-bottom: 13px
 }
 
-.js-enabled .govuk-accordion__icon:before {
-    width: 100%
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-heading-text .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-summary .govuk-accordion__section-toggle-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-heading-text-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-summary-focus,
+.js-enabled .govuk-accordion__section-toggle .govuk-accordion__section-toggle-focus {
+    display: inline
 }
 
-.js-enabled .govuk-accordion__icon:after {
-    height: 100%
+.js-enabled .govuk-accordion__section-toggle {
+    font-family: GDS Transport, arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    font-weight: 400;
+    font-size: 16px;
+    font-size: 1rem;
+    line-height: 1.25;
+    font-size: 19px;
+    font-size: 1.1875rem;
+    line-height: 1.31579;
+    color: #1d70b8
 }
 
-.js-enabled .govuk-accordion__section--expanded .govuk-accordion__icon:after {
-    content: " ";
-    display: none
+.js-enabled .govuk-accordion__section-toggle-text,
+.js-enabled .govuk-accordion__show-all-text {
+    margin-left: 5px;
+    vertical-align: middle
 }
 
 .govuk-back-link {
@@ -1147,6 +1199,7 @@
     font-size: 1.1875rem;
     line-height: 1.31579;
     display: block;
+    margin-top: 0;
     margin-bottom: 15px;
     clear: both;
     color: #d4351c
@@ -1262,7 +1315,6 @@
     font-size: 19px;
     font-size: 1.1875rem;
     line-height: 1.31579;
-    display: block;
     margin-bottom: 15px;
     color: #505a5f
 }
@@ -1540,7 +1592,7 @@
 }
 
 .govuk-textarea--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-textarea--error:focus {
@@ -1580,16 +1632,6 @@
 }
 
 .govuk-cookie-banner {
-    font-family: GDS Transport, arial, sans-serif;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-    font-weight: 400;
-    font-size: 16px;
-    font-size: 1rem;
-    line-height: 1.25;
-    font-size: 19px;
-    font-size: 1.1875rem;
-    line-height: 1.31579;
     padding-top: 20px;
     border-bottom: 10px solid transparent;
     background-color: #f3f2f1
@@ -1626,13 +1668,20 @@
     display: table;
     width: 100%;
     table-layout: fixed;
+    border-collapse: collapse;
     margin: 0 0 30px
 }
 
 .govuk-summary-list__row {
+    border-bottom: 1px solid #b1b4b6;
     display: table-row
 }
 
+.govuk-summary-list__row--no-actions:after {
+    content: "";
+    display: table-cell
+}
+
 .govuk-summary-list__actions,
 .govuk-summary-list__key,
 .govuk-summary-list__value {
@@ -1640,8 +1689,7 @@
     display: table-cell;
     padding-top: 10px;
     padding-right: 20px;
-    padding-bottom: 10px;
-    border-bottom: 1px solid #b1b4b6
+    padding-bottom: 10px
 }
 
 .govuk-summary-list__actions {
@@ -1663,14 +1711,6 @@
     width: 30%
 }
 
-.govuk-summary-list__value {
-    width: 50%
-}
-
-.govuk-summary-list__value:last-child {
-    width: 70%
-}
-
 .govuk-summary-list__value>p {
     margin-bottom: 10px
 }
@@ -1701,14 +1741,24 @@
     border: 0
 }
 
+.govuk-summary-list--no-border .govuk-summary-list__row {
+    border: 0
+}
+
 .govuk-summary-list--no-border .govuk-summary-list__actions,
 .govuk-summary-list--no-border .govuk-summary-list__key,
-.govuk-summary-list--no-border .govuk-summary-list__value,
+.govuk-summary-list--no-border .govuk-summary-list__value {
+    padding-bottom: 11px
+}
+
+.govuk-summary-list__row--no-border {
+    border: 0
+}
+
 .govuk-summary-list__row--no-border .govuk-summary-list__actions,
 .govuk-summary-list__row--no-border .govuk-summary-list__key,
 .govuk-summary-list__row--no-border .govuk-summary-list__value {
-    padding-bottom: 11px;
-    border: 0
+    padding-bottom: 11px
 }
 
 .govuk-input {
@@ -1753,7 +1803,7 @@
 }
 
 .govuk-input--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-input--error:focus {
@@ -2194,43 +2244,26 @@
 }
 
 .govuk-footer__heading {
-    margin-bottom: 40px;
+    margin-bottom: 30px;
     padding-bottom: 20px;
     border-bottom: 1px solid #b1b4b6
 }
 
 .govuk-footer__navigation {
-    display: -webkit-box;
-    display: -webkit-flex;
-    display: -ms-flexbox;
-    display: flex;
     margin-right: -15px;
-    margin-left: -15px;
-    -webkit-flex-wrap: wrap;
-    -ms-flex-wrap: wrap;
-    flex-wrap: wrap
+    margin-left: -15px
+}
+
+.govuk-footer__navigation:after {
+    content: "";
+    display: block;
+    clear: both
 }
 
 .govuk-footer__section {
     display: inline-block;
-    margin-right: 15px;
     margin-bottom: 30px;
-    margin-left: 15px;
-    vertical-align: top;
-    -webkit-box-flex: 1;
-    -webkit-flex-grow: 1;
-    -ms-flex-positive: 1;
-    flex-grow: 1;
-    -webkit-flex-shrink: 1;
-    -ms-flex-negative: 1;
-    flex-shrink: 1
-}
-
-.govuk-footer__section:first-child:nth-last-child(2) {
-    -webkit-box-flex: 2;
-    -webkit-flex-grow: 2;
-    -ms-flex-positive: 2;
-    flex-grow: 2
+    vertical-align: top
 }
 
 .govuk-footer__list {
@@ -2494,19 +2527,22 @@
 }
 
 .govuk-header__navigation {
-    display: block;
+    margin-bottom: 10px
+}
+
+.govuk-header__navigation-list {
     margin: 0;
     padding: 0;
     list-style: none
 }
 
 .js-enabled .govuk-header__menu-button,
-.js-enabled .govuk-header__navigation {
+.js-enabled .govuk-header__navigation-list {
     display: block;
     display: none
 }
 
-.js-enabled .govuk-header__navigation--open {
+.js-enabled .govuk-header__navigation-list--open {
     display: block
 }
 
@@ -2552,7 +2588,8 @@
 }
 
 .govuk-header__navigation-item:last-child {
-    margin-right: 0
+    margin-right: 0;
+    border-bottom: 0
 }
 
 .govuk-inset-text {
@@ -2677,10 +2714,7 @@
     color: #003078
 }
 
-.govuk-notification-banner__link:active {
-    color: #0b0c0c
-}
-
+.govuk-notification-banner__link:active,
 .govuk-notification-banner__link:focus {
     color: #0b0c0c
 }
@@ -2784,10 +2818,6 @@
     padding: 5px 8px 4px
 }
 
-.govuk-tag--inactive {
-    background-color: #505a5f
-}
-
 .govuk-tag--grey {
     color: #383f43;
     background: #eeefef
@@ -2938,10 +2968,7 @@
     color: #003078
 }
 
-.govuk-tabs__tab:active {
-    color: #0b0c0c
-}
-
+.govuk-tabs__tab:active,
 .govuk-tabs__tab:focus {
     color: #0b0c0c
 }
@@ -3276,7 +3303,7 @@
 }
 
 .govuk-select--error {
-    border: 2px solid #d4351c
+    border-color: #d4351c
 }
 
 .govuk-select--error:focus {
@@ -3347,6 +3374,10 @@
     background-color: #fd0
 }
 
+.govuk-skip-link-focused-element:focus {
+    outline: none
+}
+
 .govuk-table {
     font-family: GDS Transport, arial, sans-serif;
     -webkit-font-smoothing: antialiased;
@@ -3976,6 +4007,18 @@
     padding-left: 60px !important
 }
 
+.govuk-\!-text-align-left {
+    text-align: left !important
+}
+
+.govuk-\!-text-align-centre {
+    text-align: center !important
+}
+
+.govuk-\!-text-align-right {
+    text-align: right !important
+}
+
 .govuk-\!-font-size-80 {
     font-size: 53px !important;
     font-size: 3.3125rem !important;

@vanitabarrett vanitabarrett merged commit 2695c08 into main Dec 15, 2021
@vanitabarrett vanitabarrett deleted the release-4.0.0 branch December 15, 2021 15:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants