diff --git a/recurring_events.module b/recurring_events.module
index e2704dbd5c32810e7613d01f988f1ec250967183..31285b70d4c44a3d6538820db9dd6a1a21da61a5 100644
--- a/recurring_events.module
+++ b/recurring_events.module
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Entity\EntityInterface;
 
 /**
  * Implements hook_help().
@@ -22,3 +23,19 @@ function recurring_events_help($route_name, RouteMatchInterface $route_match) {
     default:
   }
 }
+
+/**
+ * Implements hook_entity_operation().
+ */
+function recurring_events_entity_operation(EntityInterface $entity) {
+  $operations = [];
+  if ($entity->getEntityTypeId() == 'eventseries' || $entity->getEntityTypeId() == 'eventinstance') {
+    $operations['clone'] = [
+      'title' => t('Clone'),
+      'weight' => 50,
+      'url' => $entity->toUrl('clone-form'),
+    ];
+  }
+
+  return $operations;
+}
diff --git a/recurring_events.permissions.yml b/recurring_events.permissions.yml
index 28af1d21d40ed250a88b93af80c7cffde8a69f84..fa37cd704bdf12ee13d3293fa3144628c6cfefac 100644
--- a/recurring_events.permissions.yml
+++ b/recurring_events.permissions.yml
@@ -19,6 +19,27 @@ administer eventseries entity:
   description: 'Make changes to the event series entity type.'
   restrict access: true
 
+# Event Instance Entities.
+view eventinstance entity:
+  title: 'View eventinstance entity'
+  description: 'View existing event instance entities'
+view unpublished eventinstance entity:
+  title: 'View unpublished eventinstance entity'
+  description: 'View exisiting unpublished event instance entities'
+edit eventinstance entity:
+  title: 'Edit eventinstance entity'
+  description: 'Modify existing event instance entities'
+delete eventinstance entity:
+  title: 'Delete eventinstance entity'
+  description: 'Delete existing event instance entities'
+clone eventinstance entity:
+  title: 'Clone eventinstance entity'
+  description: 'Clone existing event instance entities'
+administer eventinstance entity:
+  title: 'Administer eventinstance entity'
+  description: 'Make changes to the event instance entity type.'
+  restrict access: true
+
 # Event Series Administration.
 administer eventseries:
   title: 'Administer eventseries'
diff --git a/recurring_events.routing.yml b/recurring_events.routing.yml
index 185ce19f87c1cc40884a510796c7d6bf67c67442..e6920792b25a814512c8bb13e6c73b17b8a4aad7 100644
--- a/recurring_events.routing.yml
+++ b/recurring_events.routing.yml
@@ -54,7 +54,7 @@ entity.eventseries.clone_form:
   path: '/events/series/{eventseries}/clone'
   defaults:
     _entity_form: eventseries.clone
-    _title_callback: '\Drupal\recurring_events\Controller\EventSeriesController::getCloneTitle'
+    _title: 'Clone Event Series'
   requirements:
     _entity_access: 'eventseries.clone'
     eventseries: \d+
@@ -116,6 +116,20 @@ entity.eventinstance.delete_form:
       eventinstance:
         type: entity:eventinstance
 
+# Clone an EventInstance.
+entity.eventinstance.clone_form:
+  path: '/events/{eventinstance}/clone'
+  defaults:
+    # Calls the form.clone controller, defined in the Event Instance entity.
+    _entity_form: eventinstance.clone
+    _title: Clone Event Instance
+  requirements:
+    _entity_access: 'eventinstance.clone'
+  options:
+    parameters:
+      eventinstance:
+        type: entity:eventinstance
+
 # Event Instance table list route.
 entity.eventinstance.collection:
   path: '/events'
diff --git a/src/Entity/EventInstance.php b/src/Entity/EventInstance.php
index 90b37361a4b9c737c887b473aa36de14c267fab5..3b2491656f88927bbc92394502d84cefda28cb68 100644
--- a/src/Entity/EventInstance.php
+++ b/src/Entity/EventInstance.php
@@ -81,7 +81,6 @@ use Drupal\user\UserInterface;
  *       "delete" = "Drupal\recurring_events\Form\EventInstanceDeleteForm",
  *       "default" = "Drupal\recurring_events\Form\EventInstanceForm",
  *       "clone" = "Drupal\recurring_events\Form\EventInstanceCloneForm",
- *       "contact" = "Drupal\recurring_events\Form\EventInstanceContactRegistrationsForm",
  *     },
  *     "access" = "Drupal\recurring_events\EventInstanceAccessControlHandler",
  *   },
@@ -113,7 +112,6 @@ use Drupal\user\UserInterface;
  *     "version-history" = "/events/{eventinstance}/revisions",
  *     "revision" = "/events/{eventinstance}/revisions/{eventinstance_revision}/view",
  *     "clone-form" = "/events/{eventinstance}/clone",
- *     "contact-form" = "/events/{eventinstance}/registration/contact",
  *   },
  *   field_ui_base_route = "eventinstance.settings",
  * )
diff --git a/src/EventInstanceAccessControlHandler.php b/src/EventInstanceAccessControlHandler.php
index 23f21b5637808a368b930adbdd08bd166c2a1997..9a8ecabb6dbf312e1d501504355e619891fed726 100644
--- a/src/EventInstanceAccessControlHandler.php
+++ b/src/EventInstanceAccessControlHandler.php
@@ -37,9 +37,6 @@ class EventInstanceAccessControlHandler extends EntityAccessControlHandler {
 
       case 'clone':
         return AccessResult::allowedIfHasPermission($account, 'clone eventinstance entity');
-
-      case 'contact':
-        return AccessResult::allowedIfHasPermission($account, 'contact eventinstance registration entities');
     }
     return AccessResult::allowed();
   }