diff --git a/css/views-slideshow-pager-bullets.css b/css/views-slideshow-pager-bullets.css
new file mode 100644
index 0000000..4f5fda8
--- /dev/null
+++ b/css/views-slideshow-pager-bullets.css
@@ -0,0 +1,18 @@
+.views-slideshow-controls-bottom .views-slideshow-pager-bullets {
+  text-align: center;
+}
+
+.views-slideshow-controls-bottom .views-slideshow-pager-bullets li {
+  text-indent: -9999px;
+  cursor: pointer;
+  display: inline-block;
+  border-radius: 6px;
+  padding: 0 6px;
+  background: #222;
+  margin: 0.4em;
+  line-height: 12px;
+}
+
+.views-slideshow-controls-bottom .views-slideshow-pager-bullets li.active {
+  background: #AAA;
+}
diff --git a/js/views_slideshow.js b/js/views_slideshow.js
index 3376811..3c50b3e 100644
--- a/js/views_slideshow.js
+++ b/js/views_slideshow.js
@@ -380,6 +380,8 @@
     }
   };
 
+  // Copy the pager hooks from fields pager to the bullets one.
+  Drupal.viewsSlideshowPagerBullets = Drupal.viewsSlideshowPagerFields || {};
 
   /**
    * Views Slideshow Slide Counter
diff --git a/src/Plugin/ViewsSlideshowWidget/PagerBullets.php b/src/Plugin/ViewsSlideshowWidget/PagerBullets.php
new file mode 100644
index 0000000..505cb5d
--- /dev/null
+++ b/src/Plugin/ViewsSlideshowWidget/PagerBullets.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\views_slideshow\Plugin\ViewsSlideshowWidget;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views_slideshow\ViewsSlideshowWidgetBase;
+
+/**
+ * Provides a pager using bullets.
+ *
+ * @ViewsSlideshowWidget(
+ *   id = "views_slideshow_pager_bullets",
+ *   type = "views_slideshow_pager",
+ *   label = @Translation("Bullets"),
+ * )
+ */
+class PagerBullets extends ViewsSlideshowWidgetBase {
+}
diff --git a/templates/views-slideshow-pager-bullets.html.twig b/templates/views-slideshow-pager-bullets.html.twig
new file mode 100644
index 0000000..34d79bf
--- /dev/null
+++ b/templates/views-slideshow-pager-bullets.html.twig
@@ -0,0 +1,13 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a views slideshow bullets pager.
+ *
+ * Available variables:
+ * - bullet_items: Renderable array of pager items
+ *
+ * @ingroup vss_templates
+ */
+#}
+
+{{ bullet_items }}
diff --git a/views_slideshow.libraries.yml b/views_slideshow.libraries.yml
index 08c5784..baf5421 100644
--- a/views_slideshow.libraries.yml
+++ b/views_slideshow.libraries.yml
@@ -18,6 +18,12 @@ controls_text:
   css:
     css/controls_text.css: {}
 
+pager_bullets:
+  version: VERSION
+  css:
+    component:
+      css/views-slideshow-pager-bullets.css: {}
+
 jquery_hoverIntent:
   remote: https://github.com/briancherne/jquery-hoverIntent
   version: 1.9
diff --git a/views_slideshow.module b/views_slideshow.module
index 292ed0c..b8894ce 100644
--- a/views_slideshow.module
+++ b/views_slideshow.module
@@ -74,6 +74,16 @@ function views_slideshow_theme() {
         'length' => NULL,
       ],
     ],
+    'views_slideshow_pager_bullets' => [
+      'variables' => [
+        'vss_id' => NULL,
+        'view' => NULL,
+        'settings' => [],
+        'location' => NULL,
+        'attributes' => [],
+      ],
+      'file' => 'views_slideshow.theme.inc',
+    ],
     'views_slideshow_controls_widget_render' => [
       'variables' => [
         'vss_id' => NULL,
diff --git a/views_slideshow.theme.inc b/views_slideshow.theme.inc
index 0f9aef2..837402b 100644
--- a/views_slideshow.theme.inc
+++ b/views_slideshow.theme.inc
@@ -285,6 +285,36 @@ function template_preprocess_views_slideshow_pager_field_item(&$vars) {
 }
 
 /**
+ * Views Slideshow: Bullets pager.
+ */
+function template_preprocess_views_slideshow_pager_bullets(&$vars) {
+  $vars['#attached']['library'][] = 'views_slideshow/widget_info';
+  $vars['#attached']['library'][] = 'views_slideshow/pager_bullets';
+  $vars['#attached']['drupalSettings']['viewsSlideshowPagerFields'][$vars['vss_id']] = [
+    $vars['location'] => [
+      'activatePauseOnHover' => $vars['settings']['views_slideshow_pager_bullets']['views_slideshow_pager_bullets_hover'],
+    ],
+  ];
+
+  $vars['bullet_items'] = [
+    '#theme' => 'item_list',
+    '#items' => [],
+    '#attributes' => $vars['attributes'],
+  ];
+  $vars['bullet_items']['#attributes']['class'][] = 'views-slideshow-pager-bullets';
+  $vars['bullet_items']['#attributes']['class'][] = 'views_slideshow_pager_field';
+
+  for ($i = 0; $i < count($vars['view']->result); $i++) {
+    $vars['bullet_items']['#items'][] = [
+      '#markup' => $i,
+      '#wrapper_attributes' => [
+        'id' => 'views_slideshow_pager_field_item_' . $vars['location'] . '_' . $vars['vss_id'] . '_' . $i,
+      ],
+    ];
+  }
+}
+
+/**
  * Views Slideshow: Controls.
  */
 function template_preprocess_views_slideshow_controls_widget_render(&$vars) {
