diff --git a/css/webform.progress.tracker.css b/css/webform.progress.tracker.css
new file mode 100644
index 00000000..2c0867be
--- /dev/null
+++ b/css/webform.progress.tracker.css
@@ -0,0 +1,57 @@
+/**
+ * @file
+ * Wizard progress tracker styles.
+ *
+ * @see http://nigelotoole.github.io/progress-tracker/
+ */
+
+/**
+ * Reduce top/bottom margins around progress tracker.
+ */
+.webform-progress-tracker.progress-tracker {
+  margin-top: 20px;
+  margin-bottom: 20px;
+}
+
+/**
+ * Update progress text to show completed and active.
+ */
+.webform-progress-tracker .progress-step .progress-text {
+  color: #B6B6B6;
+}
+
+.webform-progress-tracker .progress-step.is-active .progress-text {
+  color: #333;
+}
+
+.webform-progress-tracker .progress-step.is-active .progress-title {
+  font-weight: bold;
+}
+
+.webform-progress-tracker .progress-step.is-complete .progress-text  {
+  color: #333;
+}
+
+/**
+ * Disable hover state because webform wizard progress markers are not clickable.
+ */
+.webform-progress-tracker .progress-step:hover .progress-marker {
+  background-color: #b6b6b6;
+}
+
+.webform-progress-tracker .progress-step.is-complete:hover .progress-marker {
+  background-color: #1976D2;
+}
+
+.webform-progress-tracker .progress-step.is-active:hover .progress-marker {
+  background-color: #2196F3;
+}
+
+/**
+ * Hide progress text on mobile.
+ */
+@media screen and (max-width: 600px) {
+  .webform-progress-tracker .progress-text {
+    display: none;
+  }
+}
diff --git a/includes/webform.theme.inc b/includes/webform.theme.inc
index 6e1109b1..25fe277f 100644
--- a/includes/webform.theme.inc
+++ b/includes/webform.theme.inc
@@ -528,6 +528,9 @@ function template_preprocess_webform_container_base_text(array &$variables) {
  *   - current_page: The current wizard page.
  */
 function template_preprocess_webform_progress(array &$variables) {
+  /** @var \Drupal\webform\WebformLibrariesManagerInterface $libaries_manager */
+  $libaries_manager = \Drupal::service('webform.libraries_manager');
+
   /** @var \Drupal\webform\WebformInterface $webform */
   $webform = $variables['webform'];
   $current_page = $variables['current_page'];
@@ -541,8 +544,9 @@ function template_preprocess_webform_progress(array &$variables) {
   $total = count($page_keys);
 
   if ($webform->getSetting('wizard_progress_bar')) {
+
     $variables['bar'] = [
-      '#theme' => 'webform_progress_bar',
+      '#theme' => ($libaries_manager->isIncluded('progress-tracker')) ? 'webform_progress_tracker' : 'webform_progress_bar',
       '#webform' => $variables['webform'],
       '#current_page' => $variables['current_page'],
     ];
@@ -568,6 +572,32 @@ function template_preprocess_webform_progress(array &$variables) {
  *   - current_page: The current wizard page.
  */
 function template_preprocess_webform_progress_bar(array &$variables) {
+  _template_preprocess_webform_progress($variables);
+}
+
+/**
+ * Prepares variables for webform 'wizard' progress tracker template.
+ *
+ * Default template: webform-progress-tracker.html.twig.
+ *
+ * @param array $variables
+ *   An associative array containing the following key:
+ *   - webform: A webform.
+ *   - current_page: The current wizard page.
+ */
+function template_preprocess_webform_progress_tracker(array &$variables) {
+  _template_preprocess_webform_progress($variables);
+}
+
+/**
+ * Prepares variables for webform 'wizard' progress bar & tracker template.
+ *
+ * @param array $variables
+ *   An associative array containing the following key:
+ *   - webform: A webform.
+ *   - current_page: The current wizard page.
+ */
+function _template_preprocess_webform_progress(array &$variables) {
   /** @var \Drupal\webform\WebformInterface $webform */
   $webform = $variables['webform'];
   $current_page = $variables['current_page'];
@@ -585,7 +615,6 @@ function template_preprocess_webform_progress_bar(array &$variables) {
     $variables['progress'][] = (isset($page['#title'])) ? $page['#title'] : '';
   }
 }
-
 /******************************************************************************/
 // Element templates
 /******************************************************************************/
diff --git a/src/Tests/WebformSubmissionFormSettingsTest.php b/src/Tests/WebformSubmissionFormSettingsTest.php
index 015139d0..0ed7ee38 100644
--- a/src/Tests/WebformSubmissionFormSettingsTest.php
+++ b/src/Tests/WebformSubmissionFormSettingsTest.php
@@ -51,8 +51,13 @@ class WebformSubmissionFormSettingsTest extends WebformTestBase {
 
     // Create users.
     $this->createUsers();
-  }
 
+    // Exclude Progress tracker so that the default progress bar is displayed.
+    // The default progress bar is most likely never going to change.
+    \Drupal::configFactory()->getEditable('webform.settings')
+      ->set('libraries.excluded_libraries', ['progress-tracker'])
+      ->save();
+  }
   /**
    * Tests webform setting including confirmation.
    */
diff --git a/src/Tests/WebformWizardTest.php b/src/Tests/WebformWizardTest.php
index 7e80135f..d19ce8c9 100644
--- a/src/Tests/WebformWizardTest.php
+++ b/src/Tests/WebformWizardTest.php
@@ -27,6 +27,19 @@ class WebformWizardTest extends WebformTestBase {
   protected static $testWebforms = ['test_form_wizard_basic', 'test_form_wizard_advanced', 'test_form_wizard_custom'];
 
   /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    // Exclude Progress tracker so that the default progress bar is displayed.
+    // The default progress bar is most likely never going to change.
+    \Drupal::configFactory()->getEditable('webform.settings')
+      ->set('libraries.excluded_libraries', ['progress-tracker'])
+      ->save();
+  }
+
+  /**
    * Test webform advanced wizard.
    */
   public function testBasicWizard() {
diff --git a/src/WebformLibrariesManager.php b/src/WebformLibrariesManager.php
index d5874c46..0560c13c 100644
--- a/src/WebformLibrariesManager.php
+++ b/src/WebformLibrariesManager.php
@@ -349,6 +349,15 @@ class WebformLibrariesManager implements WebformLibrariesManagerInterface {
       'version' => '2.3.5',
       'optional' => TRUE,
     ];
+    $libraries['progress-tracker'] = [
+      'title' => $this->t('Progress Tracker'),
+      'description' => $this->t("A flexible SASS component to illustrate the steps in a multi step process e.g. a multi step form, a timeline or a quiz."),
+      'notes' => $this->t('Progress Tracker is used by multi-step wizard forms.'),
+      'homepage_url' => Url::fromUri('http://nigelotoole.github.io/progress-tracker/'),
+      'download_url' => Url::fromUri('https://github.com/NigelOToole/progress-tracker/archive/v1.4.0.zip'),
+      'version' => '1.4.0',
+      'optional' => TRUE,
+    ];
     $libraries['signature_pad'] = [
       'title' => $this->t('Signature Pad'),
       'description' => $this->t("Signature Pad is a JavaScript library for drawing smooth signatures. It is HTML5 canvas based and uses variable width Bézier curve interpolation. It works in all modern desktop and mobile browsers and doesn't depend on any external libraries."),
diff --git a/templates/webform-progress-tracker.html.twig b/templates/webform-progress-tracker.html.twig
new file mode 100644
index 00000000..2258ae8f
--- /dev/null
+++ b/templates/webform-progress-tracker.html.twig
@@ -0,0 +1,38 @@
+{#
+/**
+ * @file
+ * Default theme implementation from webform wizard progress tracker.
+ *
+ * Available variables:
+ * - webform: A webform.
+ * - pages: Associatve array of wizard pages.
+ * - progress: Array of wizard progress containing page titles.
+ * - current_page: Current wizard page key.
+ * - current_index: The current wizard page index.
+ * - max_pages: Maximum number of pages to be displayed.
+ *
+ * @see template_preprocess_webform_progress_bar()
+ *
+ * @ingroup themeable
+ */
+#}
+{{ attach_library('webform/webform.progress.tracker') }}
+
+{% if progress|length < max_pages %}
+<ul class="webform-progress-tracker progress-tracker progress-tracker--center">
+{% for index, title in progress %}{%
+  set classes = [
+    'progress-step',
+    index < current_index ? 'is-complete',
+    index == current_index ? 'is-active',
+  ]
+%}
+<li{{ attributes.setAttribute('class', '').addClass(classes) }}>
+  <span class="progress-marker">{{ index + 1 }}</span>
+  <span class="progress-text">
+    <div class="progress-title">{{ title }}</div>
+  </span>
+</li>
+{% endfor %}
+</ul>
+{% endif %}
diff --git a/webform.libraries.yml b/webform.libraries.yml
index e1a9add9..5c6d383c 100644
--- a/webform.libraries.yml
+++ b/webform.libraries.yml
@@ -154,6 +154,15 @@ webform.progress.bar:
     theme:
       css/webform.progress.bar.css: {}
 
+webform.progress.tracker:
+  version: VERSION
+  css:
+    theme:
+      css/webform.progress.tracker.css: {}
+  dependencies:
+    - webform/libraries.progress-tracker
+
+
 webform.states:
   version: VERSION
   js:
@@ -875,6 +884,19 @@ libraries.jquery.toggles:
   dependencies:
     - core/jquery
 
+libraries.progress-tracker:
+  remote: https://github.com/NigelOToole/progress-tracker
+  version: '1.4.0'
+  license:
+    name: MIT
+    url: https://github.com/NigelOToole/progress-tracker/blob/master/LICENSE
+    gpl-compatible: true
+  cdn:
+    /libraries/progress-tracker/: https://cdn.rawgit.com/NigelOToole/progress-tracker/v1.4.0/
+  css:
+    theme:
+      /libraries/progress-tracker/app/styles/progress-tracker.css: {}
+
 libraries.signature_pad:
   remote: https://github.com/szimek/signature_pad
   version: '1.5.3'
diff --git a/webform.module b/webform.module
index 510fcc2b..af65b3c6 100644
--- a/webform.module
+++ b/webform.module
@@ -620,6 +620,14 @@ function webform_theme() {
         'max_pages' => 10,
       ],
     ],
+
+    'webform_progress_tracker' => [
+      'variables' => [
+        'webform' => NULL,
+        'current_page' => NULL,
+        'max_pages' => 10,
+      ],
+    ],
   ];
 
   // Since any rendering of a webform is going to require 'webform.theme.inc'
