diff --git a/pathauto.routing.yml b/pathauto.routing.yml
index e55063c..1cb56f9 100644
--- a/pathauto.routing.yml
+++ b/pathauto.routing.yml
@@ -15,6 +15,15 @@ entity.pathauto_pattern.add_form:
   requirements:
     _permission: 'administer pathauto'
 
+entity.pathauto_pattern.duplicate_form:
+  path: '/admin/config/search/path/patterns/{pathauto_pattern}/duplicate'
+  defaults:
+    _entity_form: 'pathauto_pattern.duplicate'
+    _title: 'Duplicate Pathauto pattern'
+    tempstore_id: 'pathauto.pattern'
+  requirements:
+    _permission: 'administer pathauto'
+
 pathauto.settings.form:
   path: '/admin/config/search/path/settings'
   defaults:
diff --git a/src/Entity/PathautoPattern.php b/src/Entity/PathautoPattern.php
index e297f2a..1f894bd 100644
--- a/src/Entity/PathautoPattern.php
+++ b/src/Entity/PathautoPattern.php
@@ -21,6 +21,7 @@ use Drupal\pathauto\PathautoPatternInterface;
  *     "list_builder" = "Drupal\pathauto\PathautoPatternListBuilder",
  *     "form" = {
  *       "default" = "Drupal\pathauto\Form\PatternEditForm",
+ *       "duplicate" = "Drupal\pathauto\Form\PatternDuplicateForm",
  *       "delete" = "Drupal\Core\Entity\EntityDeleteForm",
  *       "enable" = "Drupal\pathauto\Form\PatternEnableForm",
  *       "disable" = "Drupal\pathauto\Form\PatternDisableForm"
@@ -57,7 +58,8 @@ use Drupal\pathauto\PathautoPatternInterface;
  *     "edit-form" = "/admin/config/search/path/patterns/{pathauto_pattern}",
  *     "delete-form" = "/admin/config/search/path/patterns/{pathauto_pattern}/delete",
  *     "enable" = "/admin/config/search/path/patterns/{pathauto_pattern}/enable",
- *     "disable" = "/admin/config/search/path/patterns/{pathauto_pattern}/disable"
+ *     "disable" = "/admin/config/search/path/patterns/{pathauto_pattern}/disable",
+ *     "duplicate-form" = "/admin/config/search/path/patterns/{pathauto_pattern}/duplicate"
  *   }
  * )
  */
diff --git a/src/Form/PatternDuplicateForm.php b/src/Form/PatternDuplicateForm.php
new file mode 100644
index 0000000..ef78a4b
--- /dev/null
+++ b/src/Form/PatternDuplicateForm.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Drupal\pathauto\Form;
+
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Provides the pathauto pattern duplicate form.
+ */
+class PatternDuplicateForm extends PatternEditForm {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setEntity(EntityInterface $entity) {
+    $this->entity = $entity->createDuplicate();
+    return $this;
+  }
+
+}
diff --git a/src/PathautoPatternListBuilder.php b/src/PathautoPatternListBuilder.php
index 85c9533..6c51a82 100644
--- a/src/PathautoPatternListBuilder.php
+++ b/src/PathautoPatternListBuilder.php
@@ -48,4 +48,24 @@ class PathautoPatternListBuilder extends DraggableListBuilder {
     return $row + parent::buildRow($entity);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultOperations(EntityInterface $entity) {
+    /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */
+    $operations = parent::getDefaultOperations($entity);
+
+    if (!$entity->hasLinkTemplate('duplicate-form')) {
+      return $operations;
+    }
+
+    $operations['duplicate'] = [
+      'title' => t('Duplicate'),
+      'weight' => 0,
+      'url' => $this->ensureDestination($entity->toUrl('duplicate-form')),
+    ];
+
+    return $operations;
+  }
+
 }
diff --git a/src/Tests/PathautoUiTest.php b/src/Tests/PathautoUiTest.php
index b6b9e66..c075e84 100644
--- a/src/Tests/PathautoUiTest.php
+++ b/src/Tests/PathautoUiTest.php
@@ -146,6 +146,10 @@ class PathautoUiTest extends WebTestBase {
     // Check that the pattern weight did not change.
     $this->assertOptionSelected('edit-entities-page-pattern-weight', '4');
 
+    $edit = array('label' => 'Test Duplicate', 'id' => 'page_pattern_test_duplicate');
+    $this->drupalPostForm('/admin/config/search/path/patterns/page_pattern/duplicate', $edit, t('Save'));
+    $this->assertText('Pattern Test Duplicate saved.');
+
     // Disable workflow.
     $this->drupalGet('/admin/config/search/path/patterns');
     $this->assertNoLink(t('Enable'));
