diff --git a/currency.info.yml b/currency.info.yml
index f833ebf..9c7cd80 100755
--- a/currency.info.yml
+++ b/currency.info.yml
@@ -1,7 +1,5 @@
 name: Currency
 description: Provides currency metadata and exchange rates, and amount formatting.
 core: 8.x
-configure: currency.currency.list
+configure: entity.currency.collection
 type: module
-dependencies:
-  - plugin
diff --git a/currency.links.action.yml b/currency.links.action.yml
index 69a6d83..b4b60b5 100644
--- a/currency.links.action.yml
+++ b/currency.links.action.yml
@@ -1,27 +1,27 @@
-currency.currency.add:
-  route_name: currency.currency.add
+entity.currency.add:
+  route_name: entity.currency.add
   title: 'Add a custom currency'
   appears_on:
-    - currency.currency.list
-currency.currency.import:
-  route_name: currency.currency.import
+    - entity.currency.collection
+entity.currency.import:
+  route_name: entity.currency.import
   title: 'Import a currency'
   appears_on:
-    - currency.currency.list
+    - entity.currency.collection
   weight: -1
-currency.currency_locale.add:
-  route_name: currency.currency_locale.add
+entity.currency_locale.add:
+  route_name: entity.currency_locale.add
   title: 'Add a currency locale'
   appears_on:
-    - currency.currency_locale.list
-currency.currency_locale.import:
-  route_name: currency.currency_locale.import
+    - entity.currency_locale.collection
+entity.currency_locale.import:
+  route_name: entity.currency_locale.import
   title: 'Import a currency locale'
   appears_on:
-    - currency.currency_locale.list
+    - entity.currency_locale.collection
   weight: -1
-currency.exchange_rate_provider.fixed_rates.add:
-  route_name: currency.exchange_rate_provider.fixed_rates.add
+entity.exchange_rate_provider.fixed_rates.add:
+  route_name: entity.exchange_rate_provider.fixed_rates.add
   title: 'Add an exchange rate'
   appears_on:
-    - currency.exchange_rate_provider.fixed_rates.overview
+    - entity.exchange_rate_provider.fixed_rates.overview
diff --git a/currency.links.menu.yml b/currency.links.menu.yml
index 73650b0..f285d24 100644
--- a/currency.links.menu.yml
+++ b/currency.links.menu.yml
@@ -1,14 +1,14 @@
-currency.currency.list:
+entity.currency.collection:
   title: Currencies
   parent: system.admin_config_regional
-  route_name: currency.currency.list
-currency.amount_formatting:
+  route_name: entity.currency.collection
+entity.amount_formatting:
   title: Currency amount formatting
   description: Configure amount formatting for different locales.
   parent: system.admin_config_regional
-  route_name: currency.amount_formatting
-currency.exchange_rate_provider.config:
+  route_name: entity.amount_formatting
+entity.exchange_rate_provider.config:
   title: Currency exchange
   description: Configure how currency exchange rates should be retrieved.
   parent: system.admin_config_regional
-  route_name: currency.exchange_rate_provider.config
+  route_name: entity.exchange_rate_provider.config
diff --git a/currency.links.task.yml b/currency.links.task.yml
index 311d9da..b99b47e 100644
--- a/currency.links.task.yml
+++ b/currency.links.task.yml
@@ -1,9 +1,9 @@
-currency.amount_formatting:
-  base_route: currency.amount_formatting
-  route_name: currency.amount_formatting
+entity.amount_formatting:
+  base_route: entity.amount_formatting
+  route_name: entity.amount_formatting
   title: Formatting
 
-currency.currency_locale.list:
-  base_route: currency.amount_formatting
-  route_name: currency.currency_locale.list
+entity.currency_locale.collection:
+  base_route: entity.amount_formatting
+  route_name: entity.currency_locale.collection
   title: Locales
diff --git a/currency.routing.yml b/currency.routing.yml
index f087806..1cc6541 100644
--- a/currency.routing.yml
+++ b/currency.routing.yml
@@ -1,5 +1,5 @@
 # Currency exchangers.
-currency.exchange_rate_provider.config:
+entity.exchange_rate_provider.config:
   path: '/admin/config/regional/currency-exchange'
   defaults:
     _form: '\Drupal\currency\Controller\PluginBasedExchangeRateProviderForm'
@@ -7,7 +7,7 @@ currency.exchange_rate_provider.config:
   requirements:
     _permission: 'currency.exchange_rate_provider.administer'
 
-currency.exchange_rate_provider.fixed_rates.overview:
+entity.exchange_rate_provider.fixed_rates.overview:
   path: '/admin/config/regional/currency-exchange/fixed'
   defaults:
     _controller: '\Drupal\currency\Controller\FixedRatesOverview::overview'
@@ -15,7 +15,7 @@ currency.exchange_rate_provider.fixed_rates.overview:
   requirements:
     _permission: 'currency.exchange_rate_provider.fixed_rates.administer'
 
-currency.exchange_rate_provider.fixed_rates.add:
+entity.exchange_rate_provider.fixed_rates.add:
   path: '/admin/config/regional/currency-exchange/fixed/add'
   defaults:
     _form: '\Drupal\currency\Controller\FixedRatesForm'
@@ -23,7 +23,7 @@ currency.exchange_rate_provider.fixed_rates.add:
   requirements:
     _permission: 'currency.exchange_rate_provider.fixed_rates.administer'
 
-currency.exchange_rate_provider.fixed_rates.edit:
+entity.exchange_rate_provider.fixed_rates.edit:
   path: '/admin/config/regional/currency-exchange/fixed/{currency_code_from}/{currency_code_to}'
   defaults:
     _form: '\Drupal\currency\Controller\FixedRatesForm'
@@ -32,7 +32,7 @@ currency.exchange_rate_provider.fixed_rates.edit:
     _permission: 'currency.exchange_rate_provider.fixed_rates.administer'
 
 # Currency entities.
-currency.currency.list:
+entity.currency.collection:
   path: '/admin/config/regional/currency'
   defaults:
     _entity_list: 'currency'
@@ -41,7 +41,7 @@ currency.currency.list:
   requirements:
     _permission: 'currency.currency.view'
 
-currency.currency.add:
+entity.currency.add:
   path: '/admin/config/regional/currency/add'
   defaults:
     _controller: '\Drupal\currency\Controller\AddCurrency::execute'
@@ -49,7 +49,7 @@ currency.currency.add:
   requirements:
     _entity_create_access: 'currency'
 
-currency.currency.import:
+entity.currency.import:
   path: '/admin/config/regional/currency/import'
   defaults:
     _form: '\Drupal\currency\Controller\CurrencyImportForm'
@@ -57,6 +57,14 @@ currency.currency.import:
   requirements:
     _entity_create_access: 'currency'
 
+entity.currency.canonical:
+  path: '/admin/config/regional/currency/{currency}'
+  defaults:
+    _entity_form: 'currency.default'
+    _title_callback: \Drupal\currency\Controller\EditCurrency::title
+  requirements:
+    _entity_access: 'currency.update'
+
 entity.currency.edit_form:
   path: '/admin/config/regional/currency/{currency}'
   defaults:
@@ -87,7 +95,7 @@ entity.currency.disable:
     _entity_access: 'currency.disable'
 
 # Currency currency locale entities.
-currency.currency_locale.list:
+entity.currency_locale.collection:
   path: '/admin/config/regional/currency-formatting/locale'
   defaults:
     _entity_list: 'currency_locale'
@@ -95,7 +103,7 @@ currency.currency_locale.list:
   requirements:
     _permission: 'currency.currency_locale.view'
 
-currency.currency_locale.add:
+entity.currency_locale.add:
   path: '/admin/config/regional/currency-formatting/locale/add'
   defaults:
     _controller: '\Drupal\currency\Controller\AddCurrencyLocale::execute'
@@ -103,7 +111,7 @@ currency.currency_locale.add:
   requirements:
     _entity_create_access: 'currency_locale'
 
-currency.currency_locale.import:
+entity.currency_locale.import:
   path: '/admin/config/regional/currency-formatting/locale/import'
   defaults:
     _form: '\Drupal\currency\Controller\CurrencyLocaleImportForm'
@@ -111,6 +119,14 @@ currency.currency_locale.import:
   requirements:
     _entity_create_access: 'currency_locale'
 
+entity.currency_locale.canonical:
+  path: '/admin/config/regional/currency-formatting/locale/{currency_locale}'
+  defaults:
+    _entity_form: 'currency_locale.default'
+    _title_callback: \Drupal\currency\Controller\EditCurrencyLocale::title
+  requirements:
+    _entity_access: 'currency_locale.update'
+
 entity.currency_locale.edit_form:
   path: '/admin/config/regional/currency-formatting/locale/{currency_locale}'
   defaults:
@@ -127,7 +143,7 @@ entity.currency_locale.delete_form:
     _entity_access: 'currency_locale.delete'
 
 # Currency amount formatting.
-currency.amount_formatting:
+entity.amount_formatting:
   path: '/admin/config/regional/currency-formatting'
   defaults:
     _form: '\Drupal\currency\Controller\AmountFormattingForm'
diff --git a/src/Annotation/CurrencyExchangeRateProvider.php b/src/Annotation/CurrencyExchangeRateProvider.php
index e86ba9f..992ebed 100644
--- a/src/Annotation/CurrencyExchangeRateProvider.php
+++ b/src/Annotation/CurrencyExchangeRateProvider.php
@@ -40,7 +40,9 @@ class CurrencyExchangeRateProvider extends Plugin {
   /**
    * The name of the class that provides plugin operations.
    *
-   * The class must implement \Drupal\plugin\PluginOperationsProviderInterface.
+   * The class must implement
+   * \Drupal\currency\Plugin\Currency\OperationsProviderInterface and may
+   * implement \Drupal\Core\DependencyInjection\ContainerInjectionInterface.
    *
    * @var string
    */
diff --git a/src/Controller/CurrencyImportForm.php b/src/Controller/CurrencyImportForm.php
index ffd7916..d67592a 100644
--- a/src/Controller/CurrencyImportForm.php
+++ b/src/Controller/CurrencyImportForm.php
@@ -115,7 +115,7 @@ class CurrencyImportForm extends FormBase implements ContainerInjectionInterface
       $form_state->setRedirectUrl($currency->urlInfo('edit-form'));
     }
     else {
-      $form_state->setRedirectUrl(new Url('currency.currency.list'));
+      $form_state->setRedirectUrl(new Url('entity.currency.collection'));
     }
   }
 
diff --git a/src/Controller/CurrencyLocaleImportForm.php b/src/Controller/CurrencyLocaleImportForm.php
index d6f9aa6..c846ae3 100644
--- a/src/Controller/CurrencyLocaleImportForm.php
+++ b/src/Controller/CurrencyLocaleImportForm.php
@@ -115,7 +115,7 @@ class CurrencyLocaleImportForm extends FormBase implements ContainerInjectionInt
       $form_state->setRedirectUrl($currency_locale->urlInfo('edit-form'));
     }
     else {
-      $form_state->setRedirectUrl(new Url('currency.currency_locale.list'));
+      $form_state->setRedirectUrl(new Url('entity.currency_locale.collection'));
     }
   }
 
diff --git a/src/Controller/DisableCurrency.php b/src/Controller/DisableCurrency.php
index 4d3c6ba..0dbf300 100644
--- a/src/Controller/DisableCurrency.php
+++ b/src/Controller/DisableCurrency.php
@@ -47,7 +47,7 @@ class DisableCurrency extends ControllerBase implements ContainerInjectionInterf
     $currency->disable();
     $currency->save();
 
-    return new RedirectResponse($this->urlGenerator->generateFromRoute('currency.currency.list', array(
+    return new RedirectResponse($this->urlGenerator->generateFromRoute('entity.currency.collection', array(
       'absolute' => TRUE,
     )));
   }
diff --git a/src/Controller/EnableCurrency.php b/src/Controller/EnableCurrency.php
index 1966233..8c33b12 100644
--- a/src/Controller/EnableCurrency.php
+++ b/src/Controller/EnableCurrency.php
@@ -49,7 +49,7 @@ class EnableCurrency extends ControllerBase implements ContainerInjectionInterfa
     $currency->enable();
     $currency->save();
 
-    return new RedirectResponse($this->urlGenerator->generateFromRoute('currency.currency.list', array(
+    return new RedirectResponse($this->urlGenerator->generateFromRoute('entity.currency.collection', array(
       'absolute' => TRUE,
     )));
   }
diff --git a/src/Controller/FixedRatesForm.php b/src/Controller/FixedRatesForm.php
index a714cbe..dbcb6f8 100644
--- a/src/Controller/FixedRatesForm.php
+++ b/src/Controller/FixedRatesForm.php
@@ -177,6 +177,6 @@ class FixedRatesForm extends FormBase implements ContainerInjectionInterface {
         )));
         break;
     }
-    $form_state->setRedirect('currency.exchange_rate_provider.fixed_rates.overview');
+    $form_state->setRedirect('entity.exchange_rate_provider.fixed_rates.overview');
   }
 }
diff --git a/src/Controller/FixedRatesOverview.php b/src/Controller/FixedRatesOverview.php
index 32b87a3..01a2dbb 100644
--- a/src/Controller/FixedRatesOverview.php
+++ b/src/Controller/FixedRatesOverview.php
@@ -94,7 +94,7 @@ class FixedRatesOverview extends ControllerBase implements ContainerInjectionInt
 
     $form['rates'] = array(
       '#empty' => $this->t('There are no exchange rates yet. <a href="@path">Add an exchange rate</a>.', array(
-        '@path' => $this->urlGenerator->generateFromRoute('currency.exchange_rate_provider.fixed_rates.add'),
+        '@path' => $this->urlGenerator->generateFromRoute('entity.exchange_rate_provider.fixed_rates.add'),
       )),
       '#header' => array($this->t('From'), $this->t('To'), $this->t('Exchange rate'), $this->t('Operations')),
       '#type' => 'table',
diff --git a/src/Entity/Currency.php b/src/Entity/Currency.php
index a885bfc..8bbef2e 100644
--- a/src/Entity/Currency.php
+++ b/src/Entity/Currency.php
@@ -35,10 +35,10 @@ use Drupal\currency\Usage;
  *   id = "currency",
  *   label = @Translation("Currency"),
  *   links = {
- *     "canonical" = "currency.currency.edit",
- *     "create-form" = "currency.currency.add",
- *     "edit-form" = "currency.currency.edit",
- *     "delete-form" = "currency.currency.delete"
+ *     "canonical" = "entity.currency.collection",
+ *     "create-form" = "entity.currency.add",
+ *     "edit-form" = "entity.currency.edit_form",
+ *     "delete-form" = "entity.currency.delete_form"
  *   }
  * )
  */
diff --git a/src/Entity/Currency/CurrencyDeleteForm.php b/src/Entity/Currency/CurrencyDeleteForm.php
index b9f4956..d6011e0 100644
--- a/src/Entity/Currency/CurrencyDeleteForm.php
+++ b/src/Entity/Currency/CurrencyDeleteForm.php
@@ -57,7 +57,7 @@ class CurrencyDeleteForm extends EntityConfirmFormBase {
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return new Url('currency.currency.list');
+    return new Url('entity.currency.collection');
   }
 
   /**
diff --git a/src/Entity/Currency/CurrencyForm.php b/src/Entity/Currency/CurrencyForm.php
index 13156d4..acff283 100644
--- a/src/Entity/Currency/CurrencyForm.php
+++ b/src/Entity/Currency/CurrencyForm.php
@@ -167,7 +167,7 @@ class CurrencyForm extends EntityForm {
     drupal_set_message($this->t('The currency %label has been saved.', array(
       '%label' => $currency->label(),
     )));
-    $form_state->setRedirect('currency.currency.list');
+    $form_state->setRedirect('entity.currency.collection');
   }
 
   /**
diff --git a/src/Entity/CurrencyLocale.php b/src/Entity/CurrencyLocale.php
index e640ded..ecdbded 100644
--- a/src/Entity/CurrencyLocale.php
+++ b/src/Entity/CurrencyLocale.php
@@ -34,10 +34,10 @@ use Drupal\Core\StringTranslation\StringTranslationTrait;
  *   id = "currency_locale",
  *   label = @Translation("Currency currency locale"),
  *   links = {
- *     "canonical" = "currency.currency_locale.edit",
- *     "create-form" = "currency.currency_locale.add",
- *     "edit-form" = "currency.currency_locale.edit",
- *     "delete-form" = "currency.currency_locale.delete"
+ *     "canonical" = "entity.currency_locale.collection",
+ *     "create-form" = "entity.currency_locale.add",
+ *     "edit-form" = "entity.currency_locale.edit_form",
+ *     "delete-form" = "entity.currency_locale.delete_form"
  *   }
  * )
  */
diff --git a/src/Entity/CurrencyLocale/CurrencyLocaleDeleteForm.php b/src/Entity/CurrencyLocale/CurrencyLocaleDeleteForm.php
index 12efdf5..180df9c 100644
--- a/src/Entity/CurrencyLocale/CurrencyLocaleDeleteForm.php
+++ b/src/Entity/CurrencyLocale/CurrencyLocaleDeleteForm.php
@@ -48,7 +48,7 @@ class CurrencyLocaleDeleteForm extends EntityConfirmFormBase {
    * {@inheritdoc}
    */
   public function getCancelUrl() {
-    return new Url('currency.currency_locale.list');
+    return new Url('entity.currency_locale.collection');
   }
 
   /**
diff --git a/src/Entity/CurrencyLocale/CurrencyLocaleForm.php b/src/Entity/CurrencyLocale/CurrencyLocaleForm.php
index d93fb9c..51346d0 100644
--- a/src/Entity/CurrencyLocale/CurrencyLocaleForm.php
+++ b/src/Entity/CurrencyLocale/CurrencyLocaleForm.php
@@ -147,7 +147,7 @@ class CurrencyLocaleForm extends EntityForm {
   /**
    * {@inheritdoc}
    */
-  function validateForm(array &$form, FormStateInterface $form_state) {
+  public function validateForm(array &$form, FormStateInterface $form_state) {
     parent::validateForm($form, $form_state);
     $currency_locale = $this->getEntity();
     if ($currency_locale->isNew()) {
@@ -169,7 +169,7 @@ class CurrencyLocaleForm extends EntityForm {
     drupal_set_message($this->t('The currency locale %label has been saved.', array(
       '%label' => $currency_locale->label(),
     )));
-    $form_state->setRedirect('currency.currency_locale.list');
+    $form_state->setRedirect('entity.currency_locale.collection');
   }
 
 }
diff --git a/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManager.php b/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManager.php
index 743aa3d..8fbe01f 100644
--- a/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManager.php
+++ b/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManager.php
@@ -11,7 +11,7 @@ use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
-use Drupal\plugin\Plugin\PluginOperationsProviderPluginManagerTrait;
+use Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerTrait;
 
 /**
  * Manages currency exchange rate provider plugins.
@@ -20,7 +20,7 @@ use Drupal\plugin\Plugin\PluginOperationsProviderPluginManagerTrait;
  */
 class ExchangeRateProviderManager extends DefaultPluginManager implements ExchangeRateProviderManagerInterface {
 
-  use PluginOperationsProviderPluginManagerTrait;
+  use OperationsProviderPluginManagerTrait;
 
   /**
    * {@inheritdoc}
diff --git a/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManagerInterface.php b/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManagerInterface.php
index 2fe3aef..67964ce 100644
--- a/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManagerInterface.php
+++ b/src/Plugin/Currency/ExchangeRateProvider/ExchangeRateProviderManagerInterface.php
@@ -8,12 +8,12 @@
 namespace Drupal\currency\Plugin\Currency\ExchangeRateProvider;
 
 use Drupal\Component\Plugin\PluginManagerInterface;
-use Drupal\plugin\PluginOperationsProviderProviderInterface;
+use Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerInterface;
 
 /**
  * Defines an amount formatter plugin manager.
  */
-interface ExchangeRateProviderManagerInterface extends PluginManagerInterface, PluginOperationsProviderProviderInterface {
+interface ExchangeRateProviderManagerInterface extends PluginManagerInterface, OperationsProviderPluginManagerInterface {
 
   /**
    * Creates an exchange rate provider.
diff --git a/src/Plugin/Currency/ExchangeRateProvider/FixedRatesOperationsProvider.php b/src/Plugin/Currency/ExchangeRateProvider/FixedRatesOperationsProvider.php
index 43a0d29..c8469e6 100644
--- a/src/Plugin/Currency/ExchangeRateProvider/FixedRatesOperationsProvider.php
+++ b/src/Plugin/Currency/ExchangeRateProvider/FixedRatesOperationsProvider.php
@@ -11,13 +11,13 @@ use Drupal\Core\Routing\RedirectDestinationInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\Core\StringTranslation\TranslationInterface;
 use Drupal\Core\Url;
-use Drupal\plugin\PluginOperationsProviderInterface;
+use Drupal\currency\Plugin\Currency\OperationsProviderInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides operations for the fixed rates exchange rate provider.
  */
-class FixedRatesOperationsProvider implements PluginOperationsProviderInterface, ContainerInjectionInterface {
+class FixedRatesOperationsProvider implements OperationsProviderInterface, ContainerInjectionInterface {
 
   use StringTranslationTrait;
 
@@ -55,7 +55,7 @@ class FixedRatesOperationsProvider implements PluginOperationsProviderInterface,
     $operations['configure'] = array(
       'title' => $this->t('Configure'),
       'query' => $this->redirectDestination->getAsArray(),
-      'url' => new Url('currency.exchange_rate_provider.fixed_rates.overview'),
+      'url' => new Url('entity.exchange_rate_provider.fixed_rates.overview'),
     );
 
     return $operations;
diff --git a/src/Plugin/Currency/OperationsProviderInterface.php b/src/Plugin/Currency/OperationsProviderInterface.php
new file mode 100644
index 0000000..7c2e079
--- /dev/null
+++ b/src/Plugin/Currency/OperationsProviderInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\currency\Plugin\Currency\OperationsProviderInterface.
+ */
+
+namespace Drupal\currency\Plugin\Currency;
+
+/**
+ * Defines a plugin operations provider.
+ *
+ * Classes may also implement any of the following interfaces:
+ * - \Drupal\Core\DependencyInjection\ContainerInjectionInterface
+ */
+interface OperationsProviderInterface {
+
+  /**
+   * Gets plugin operations.
+   *
+   * @param string $plugin_id
+   *   The ID of the plugin the operations are for.
+   *
+   * @return array[]
+   *   An array with the same structure as
+   *   \Drupal\Core\Entity\EntityListBuilderInterface::getOperations()' return
+   *   value.
+   */
+  public function getOperations($plugin_id);
+
+}
diff --git a/src/Plugin/Currency/OperationsProviderPluginManagerInterface.php b/src/Plugin/Currency/OperationsProviderPluginManagerInterface.php
new file mode 100644
index 0000000..afdc03e
--- /dev/null
+++ b/src/Plugin/Currency/OperationsProviderPluginManagerInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Contains \Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerInterface.
+ */
+
+namespace Drupal\currency\Plugin\Currency;
+
+/**
+ * Defines a plugin manager that can get operations providers for plugins.
+ */
+interface OperationsProviderPluginManagerInterface {
+
+  /**
+   * Gets a plugin's operations provider.
+   *
+   * @param string $plugin_id
+   *
+   * @return \Drupal\currency\Plugin\Currency\OperationsProviderInterface|null
+   *   The operations provider or NULL if none is available.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
+   */
+  public function getOperationsProvider($plugin_id);
+
+}
diff --git a/src/Plugin/Currency/OperationsProviderPluginManagerTrait.php b/src/Plugin/Currency/OperationsProviderPluginManagerTrait.php
new file mode 100644
index 0000000..9b9d55c
--- /dev/null
+++ b/src/Plugin/Currency/OperationsProviderPluginManagerTrait.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Contains \Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerTrait.
+ */
+
+namespace Drupal\currency\Plugin\Currency;
+
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+
+/**
+ * Implements \Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerInterface.
+ */
+trait OperationsProviderPluginManagerTrait {
+
+  /**
+   * The class resolver.
+   *
+   * @var \Drupal\Core\DependencyInjection\ClassResolverInterface
+   */
+  protected $classResolver;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOperationsProvider($plugin_id) {
+    /** @var \Drupal\Component\Plugin\PluginManagerInterface|\Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerTrait $this */
+    $definition = $this->getDefinition($plugin_id);
+    if ($definition) {
+      if (isset($definition['operations_provider'])) {
+        return $this->classResolver->getInstanceFromDefinition($definition['operations_provider']);
+      }
+      return NULL;
+    }
+    else {
+      throw new PluginNotFoundException($plugin_id);
+    }
+  }
+
+}
diff --git a/src/Tests/Controller/CurrencyLocaleWebTest.php b/src/Tests/Controller/CurrencyLocaleWebTest.php
index 031b259..4799aa6 100644
--- a/src/Tests/Controller/CurrencyLocaleWebTest.php
+++ b/src/Tests/Controller/CurrencyLocaleWebTest.php
@@ -33,9 +33,9 @@ class CurrencyLocaleWebTest extends WebTestBase {
    * Tests the user interface.
    */
   function testUserInterface() {
-    $currency_locale_overview_path = 'admin/config/regional/currency-formatting/locale';
-    $currency_formatting_path = 'admin/config/regional/currency-formatting';
-    $regional_path = 'admin/config/regional';
+    $currency_locale_overview_path = '/admin/config/regional/currency-formatting/locale';
+    $currency_formatting_path = '/admin/config/regional/currency-formatting';
+    $regional_path = '/admin/config/regional';
 
     // Test the appearance of the link on the "Regional and language" page.
     $account = $this->drupalCreateUser(array('access administration pages'));
diff --git a/tests/src/Unit/Controller/DisableCurrencyUnitTest.php b/tests/src/Unit/Controller/DisableCurrencyUnitTest.php
index 59b65a4..6c741c5 100644
--- a/tests/src/Unit/Controller/DisableCurrencyUnitTest.php
+++ b/tests/src/Unit/Controller/DisableCurrencyUnitTest.php
@@ -74,7 +74,7 @@ class DisableCurrencyUnitTest extends UnitTestCase {
 
     $this->urlGenerator->expects($this->once())
       ->method('generateFromRoute')
-      ->with('currency.currency.list')
+      ->with('entity.currency.collection')
       ->will($this->returnValue($url));
 
     $response = $this->controller->execute($currency);
diff --git a/tests/src/Unit/Controller/EnableCurrencyUnitTest.php b/tests/src/Unit/Controller/EnableCurrencyUnitTest.php
index 38f44ab..beabc32 100644
--- a/tests/src/Unit/Controller/EnableCurrencyUnitTest.php
+++ b/tests/src/Unit/Controller/EnableCurrencyUnitTest.php
@@ -74,7 +74,7 @@ class EnableCurrencyUnitTest extends UnitTestCase {
 
     $this->urlGenerator->expects($this->once())
       ->method('generateFromRoute')
-      ->with('currency.currency.list')
+      ->with('entity.currency.collection')
       ->will($this->returnValue($url));
 
     $response = $this->controller->execute($currency);
diff --git a/tests/src/Unit/Controller/FixedRatesFormUnitTest.php b/tests/src/Unit/Controller/FixedRatesFormUnitTest.php
index f2a184e..9a25e5a 100644
--- a/tests/src/Unit/Controller/FixedRatesFormUnitTest.php
+++ b/tests/src/Unit/Controller/FixedRatesFormUnitTest.php
@@ -260,7 +260,7 @@ class FixedRatesFormUnitTest extends UnitTestCase {
       ->willReturn($values);
     $form_state->expects($this->atLeastOnce())
       ->method('setRedirect')
-      ->with('currency.exchange_rate_provider.fixed_rates.overview');
+      ->with('entity.exchange_rate_provider.fixed_rates.overview');
 
     $exchange_rate_provider = $this->getMockBuilder('\Drupal\currency\Plugin\Currency\ExchangeRateProvider\FixedRates')
       ->disableOriginalConstructor()
@@ -322,7 +322,7 @@ class FixedRatesFormUnitTest extends UnitTestCase {
       ->willReturn($values);
     $form_state->expects($this->atLeastOnce())
       ->method('setRedirect')
-      ->with('currency.exchange_rate_provider.fixed_rates.overview');
+      ->with('entity.exchange_rate_provider.fixed_rates.overview');
 
     $exchange_rate_provider = $this->getMockBuilder('\Drupal\currency\Plugin\Currency\ExchangeRateProvider\FixedRates')
       ->disableOriginalConstructor()
diff --git a/tests/src/Unit/Controller/FixedRatesOverviewUnitTest.php b/tests/src/Unit/Controller/FixedRatesOverviewUnitTest.php
index c6bca6c..3a0dded 100644
--- a/tests/src/Unit/Controller/FixedRatesOverviewUnitTest.php
+++ b/tests/src/Unit/Controller/FixedRatesOverviewUnitTest.php
@@ -147,7 +147,7 @@ class FixedRatesOverviewUnitTest extends UnitTestCase {
 
     $this->urlGenerator->expects($this->once())
       ->method('generateFromRoute')
-      ->with('currency.exchange_rate_provider.fixed_rates.add');
+      ->with('entity.exchange_rate_provider.fixed_rates.add');
 
     $amount_formatter = $this->getMock('\Drupal\currency\Plugin\Currency\AmountFormatter\AmountFormatterInterface');
     $amount_formatter->expects($this->once())
diff --git a/tests/src/Unit/Entity/Currency/CurrencyDeleteFormUnitTest.php b/tests/src/Unit/Entity/Currency/CurrencyDeleteFormUnitTest.php
index 5ee3db6..b31c7b6 100644
--- a/tests/src/Unit/Entity/Currency/CurrencyDeleteFormUnitTest.php
+++ b/tests/src/Unit/Entity/Currency/CurrencyDeleteFormUnitTest.php
@@ -109,7 +109,7 @@ class CurrencyDeleteFormUnitTest extends UnitTestCase {
   function testGetCancelUrl() {
     $url = $this->form->getCancelUrl();
     $this->assertInstanceOf('\Drupal\Core\Url', $url);
-    $this->assertSame('currency.currency.list', $url->getRouteName());
+    $this->assertSame('entity.currency.collection', $url->getRouteName());
   }
 
   /**
diff --git a/tests/src/Unit/Entity/Currency/CurrencyFormUnitTest.php b/tests/src/Unit/Entity/Currency/CurrencyFormUnitTest.php
index 307ace5..daf690f 100644
--- a/tests/src/Unit/Entity/Currency/CurrencyFormUnitTest.php
+++ b/tests/src/Unit/Entity/Currency/CurrencyFormUnitTest.php
@@ -284,7 +284,7 @@ class CurrencyFormUnitTest extends UnitTestCase {
     $form_state = $this->getMock('\Drupal\Core\Form\FormStateInterface');
     $form_state->expects($this->once())
       ->method('setRedirect')
-      ->with('currency.currency.list');
+      ->with('entity.currency.collection');
 
     $this->form->save($form, $form_state);
   }
diff --git a/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleDeleteFormUnitTest.php b/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleDeleteFormUnitTest.php
index f493567..72a5b06 100644
--- a/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleDeleteFormUnitTest.php
+++ b/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleDeleteFormUnitTest.php
@@ -109,7 +109,7 @@ class CurrencyLocaleDeleteFormUnitTest extends UnitTestCase {
   function testGetCancelUrl() {
     $url = $this->form->getCancelUrl();
     $this->assertInstanceOf('\Drupal\Core\Url', $url);
-    $this->assertSame('currency.currency_locale.list', $url->getRouteName());
+    $this->assertSame('entity.currency_locale.collection', $url->getRouteName());
   }
 
   /**
diff --git a/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleFormUnitTest.php b/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleFormUnitTest.php
index 3ac338f..44d86f9 100644
--- a/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleFormUnitTest.php
+++ b/tests/src/Unit/Entity/CurrencyLocale/CurrencyLocaleFormUnitTest.php
@@ -367,16 +367,16 @@ class CurrencyLocaleFormUnitTest extends UnitTestCase {
     $form_state = $this->getMock('\Drupal\Core\Form\FormStateInterface');
     $form_state->expects($this->once())
       ->method('setRedirect')
-      ->with('currency.currency_locale.list');
+      ->with('entity.currency_locale.collection');
 
     $this->form->save($form, $form_state);
   }
 
   /**
-   * @covers ::validateForm
+   * @covers ::validate
    * @dataProvider providerTestValidate
    */
-  public function testValidateForm($input_value_language_code, $input_value_country_code, $locale, $currency_locale_is_new, $locale_is_used) {
+  public function testValidate($input_value_language_code, $input_value_country_code, $locale, $currency_locale_is_new, $locale_is_used) {
     $form = array(
       'locale' => array(
         '#foo' => $this->randomMachineName(),
@@ -427,7 +427,7 @@ class CurrencyLocaleFormUnitTest extends UnitTestCase {
         ->method('setError');
     }
 
-    $this->form->validateForm($form, $form_state);
+    $this->form->validate($form, $form_state);
   }
 
   /**
diff --git a/tests/src/Unit/Plugin/Currency/OperationsProviderPluginManagerTraitUnitTest.php b/tests/src/Unit/Plugin/Currency/OperationsProviderPluginManagerTraitUnitTest.php
new file mode 100644
index 0000000..2d8fb6a
--- /dev/null
+++ b/tests/src/Unit/Plugin/Currency/OperationsProviderPluginManagerTraitUnitTest.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\currency\Unit\Plugin\Currency\Status\OperationsProviderPluginManagerTraitUnitTest.
+ */
+
+namespace Drupal\Tests\currency\Unit\Plugin\Currency;
+
+use Drupal\Core\DependencyInjection\ClassResolverInterface;
+use Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerTrait;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerTrait
+ *
+ * @group Currency
+ */
+class OperationsProviderPluginManagerTraitUnitTest extends UnitTestCase {
+
+  /**
+   * The class resolver.
+   *
+   * @var \Drupal\Core\DependencyInjection\ClassResolverInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $classResolver;
+
+  /**
+   * The trait under test.
+   *
+   * @var \Drupal\currency\Plugin\Currency\OperationsProviderPluginManagerTrait
+   */
+  public $trait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    $this->classResolver = $this->getMock('\Drupal\Core\DependencyInjection\ClassResolverInterface');
+  }
+
+  /**
+   * @covers ::getOperationsProvider
+   */
+  public function testGetOperationsProvider() {
+    $plugin_definitions = [
+      'foo' => [
+        'id' => 'foo',
+        'operations_provider' => '\Drupal\Tests\currency\Unit\Plugin\Currency\OperationsProviderPluginManagerTraitUnitTestOperationsProvider',
+      ],
+      'bar' => [
+        'id' => 'bar',
+      ],
+    ];
+
+    $operations_provider = new \stdClass();
+
+    $this->trait = new OperationsProviderPluginManagerTraitUnitTestPluginManager($this->classResolver, $plugin_definitions);
+
+    $this->classResolver->expects($this->atLeastOnce())
+      ->method('getInstanceFromDefinition')
+      ->with($plugin_definitions['foo']['operations_provider'])
+      ->willReturn($operations_provider);
+
+    $this->assertSame($operations_provider, $this->trait->getOperationsProvider('foo'));
+    $this->assertNull($this->trait->getOperationsProvider('bar'));
+  }
+
+}
+
+class OperationsProviderPluginManagerTraitUnitTestPluginManager {
+
+  use OperationsProviderPluginManagerTrait;
+
+  /**
+   * The plugin definitions.
+   *
+   * @var array
+   */
+  protected $pluginDefinitions = [];
+
+  /**
+   * Creates a new class instance.
+   */
+  public function __construct(ClassResolverInterface $class_resolver, array $plugin_definitions) {
+    $this->classResolver = $class_resolver;
+    $this->pluginDefinitions = $plugin_definitions;
+  }
+
+  /**
+   * Returns a plugin definition.
+   */
+  protected function getDefinition($plugin_id) {
+    return $this->pluginDefinitions[$plugin_id];
+  }
+}
