diff --git a/config/install/workspace.content_repository.local.yml b/config/install/workspace.content_repository.local.yml
new file mode 100644
index 0000000..c1c40c3
--- /dev/null
+++ b/config/install/workspace.content_repository.local.yml
@@ -0,0 +1,9 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - workspace
+id: local
+label: 'Local workspace'
+type: local_workspace
+type_settings: {  }
diff --git a/src/ContentRepositoryInterface.php b/src/ContentRepositoryInterface.php
new file mode 100644
index 0000000..5b04781
--- /dev/null
+++ b/src/ContentRepositoryInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Drupal\workspace;
+
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
+
+/**
+ * Provides an interface for defining content_repository entities.
+ */
+interface ContentRepositoryInterface extends ConfigEntityInterface {
+
+  /**
+   * Gets the repository handler plugin.
+   *
+   * @return \Drupal\workspace\RepositoryHandlerInterface
+   *   The repository handler plugin.
+   */
+  public function getRepositoryHandlerPlugin();
+
+}
diff --git a/src/Entity/ContentRepository.php b/src/Entity/ContentRepository.php
new file mode 100644
index 0000000..01b9da7
--- /dev/null
+++ b/src/Entity/ContentRepository.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Drupal\workspace\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Entity\EntityWithPluginCollectionInterface;
+use Drupal\Core\Plugin\DefaultSingleLazyPluginCollection;
+use Drupal\workspace\ContentRepositoryInterface;
+
+/**
+ * Defines the content_repository entity.
+ *
+ * @ConfigEntityType(
+ *   id = "content_repository",
+ *   label = @Translation("Content repository"),
+ *   label_collection = @Translation("Content repositories"),
+ *   config_prefix = "content_repository",
+ *   admin_permission = "administer workspaces",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *     "uuid" = "uuid",
+ *   },
+ *   config_export = {
+ *     "id",
+ *     "label",
+ *     "handler",
+ *     "handler_settings",
+ *   },
+ * )
+ */
+class ContentRepository extends ConfigEntityBase implements ContentRepositoryInterface, EntityWithPluginCollectionInterface {
+
+  /**
+   * The content repository ID.
+   *
+   * @var string
+   */
+  protected $id;
+
+  /**
+   * The content repository label.
+   *
+   * @var string
+   */
+  protected $label;
+
+  /**
+   * The repository handler plugin ID.
+   *
+   * @see \Drupal\workspace\RepositoryHandlerInterface
+   * @see \Drupal\workspace\RepositoryHandlerManager
+   *
+   * @var string
+   */
+  protected $handler;
+
+  /**
+   * The configuration for the repository handler plugin.
+   *
+   * @var array
+   */
+  protected $handler_settings = [];
+
+  /**
+   * The repository handler plugin collection.
+   *
+   * @var \Drupal\Component\Plugin\LazyPluginCollection
+   */
+  protected $pluginCollection;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRepositoryHandlerPlugin() {
+    return $this->getPluginCollection()->get($this->handler);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPluginCollections() {
+    return ['handler_settings' => $this->getPluginCollection()];
+  }
+
+  /**
+   * Encapsulates the creation of the content repository plugin collection.
+   *
+   * @return \Drupal\Core\Plugin\DefaultSingleLazyPluginCollection
+   *   The content repository plugin collection.
+   */
+  protected function getPluginCollection() {
+    if (!$this->pluginCollection && $this->handler) {
+      $this->pluginCollection = new DefaultSingleLazyPluginCollection(\Drupal::service('plugin.manager.workspace.repository_handler'), $this->handler, $this->handler_settings);
+    }
+    return $this->pluginCollection;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function onDependencyRemoval(array $dependencies) {
+    // Give the parent method and the repository handler plugin a chance to
+    // react to removed dependencies and report if either of these two made a
+    // change.
+    $parent_changed_entity = parent::onDependencyRemoval($dependencies);
+    $plugin_changed_entity = $this->getRepositoryHandlerPlugin()->onDependencyRemoval($dependencies);
+    return $plugin_changed_entity || $parent_changed_entity;
+  }
+
+}
diff --git a/src/Entity/Workspace.php b/src/Entity/Workspace.php
index 8c0e482..2866970 100644
--- a/src/Entity/Workspace.php
+++ b/src/Entity/Workspace.php
@@ -127,7 +127,19 @@ class Workspace extends ContentEntityBase implements WorkspaceInterface {
    */
   public function getRepositoryHandlerPlugin() {
     if (($upstream = $this->upstream->value) && $upstream !== RepositoryHandlerInterface::EMPTY_VALUE) {
-      return \Drupal::service('plugin.manager.workspace.repository_handler')->createInstance($upstream);
+      // The upstream value is composed of an 'content_repository' entity ID and
+      // a potential target for it.
+      list($content_repository_id, $target) = explode(':', $upstream);
+
+      /** @var \Drupal\workspace\RepositoryHandlerInterface $repository_handler */
+      $repository_handler = $this->entityTypeManager()->getStorage('content_repository')->load($content_repository_id);
+      if (isset($target)) {
+        $configuration = $repository_handler->getConfiguration();
+        $configuration['target'] = $target;
+        $repository_handler->setConfiguration($configuration);
+      }
+
+      return $repository_handler;
     }
   }
 
diff --git a/src/Plugin/Deriver/LocalWorkspaceRepositoryHandlerDeriver.php b/src/Plugin/Deriver/LocalWorkspaceRepositoryHandlerDeriver.php
deleted file mode 100644
index 4674f8a..0000000
--- a/src/Plugin/Deriver/LocalWorkspaceRepositoryHandlerDeriver.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-namespace Drupal\workspace\Plugin\Deriver;
-
-use Drupal\Component\Plugin\Derivative\DeriverBase;
-use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Provides a local repository handler plugin for each workspace.
- */
-class LocalWorkspaceRepositoryHandlerDeriver extends DeriverBase implements ContainerDeriverInterface {
-
-  /**
-   * The workspace entity storage handler.
-   *
-   * @var \Drupal\Core\Entity\EntityStorageInterface
-   */
-  protected $workspaceStorage;
-
-  /**
-   * Constructs a new LocalWorkspaceRepositoryHandlerDeriver..
-   *
-   * @param \Drupal\Core\Entity\EntityStorageInterface $workspace_storage
-   *   The workspace entity storage handler.
-   */
-  public function __construct(EntityStorageInterface $workspace_storage) {
-    $this->workspaceStorage = $workspace_storage;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, $base_plugin_id) {
-    return new static(
-      $container->get('entity_type.manager')->getStorage('workspace')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getDerivativeDefinitions($base_plugin_definition) {
-    $this->derivatives = [];
-
-    // Provide a local repository handler plugin for each workspace.
-    foreach ($this->workspaceStorage->loadMultiple() as $workspace_id => $workspace) {
-      $this->derivatives[$workspace_id] = $base_plugin_definition;
-      $this->derivatives[$workspace_id]['label'] = $workspace->label();
-      $this->derivatives[$workspace_id]['category'] = $base_plugin_definition['label'];
-    }
-    return $this->derivatives;
-  }
-
-}
diff --git a/src/Plugin/RepositoryHandler/LocalWorkspaceRepositoryHandler.php b/src/Plugin/RepositoryHandler/LocalWorkspaceRepositoryHandler.php
index 5232e57..9ad5c67 100644
--- a/src/Plugin/RepositoryHandler/LocalWorkspaceRepositoryHandler.php
+++ b/src/Plugin/RepositoryHandler/LocalWorkspaceRepositoryHandler.php
@@ -25,17 +25,16 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  *   label = @Translation("Local workspace"),
  *   description = @Translation("A workspace that is defined in the local Drupal installation."),
  *   remote = FALSE,
- *   deriver = "Drupal\workspace\Plugin\Deriver\LocalWorkspaceRepositoryHandlerDeriver",
  * )
  */
 class LocalWorkspaceRepositoryHandler extends RepositoryHandlerBase implements RepositoryHandlerInterface, ContainerFactoryPluginInterface {
 
   /**
-   * The local workspace entity for the upstream.
+   * The local workspace entity where this plugin can replicate to.
    *
    * @var \Drupal\workspace\Entity\WorkspaceInterface
    */
-  protected $upstreamWorkspace;
+  protected $targetWorkspace;
 
   /**
    * The entity type manager.
@@ -79,7 +78,7 @@ class LocalWorkspaceRepositoryHandler extends RepositoryHandlerBase implements R
     $this->entityTypeManager = $entity_type_manager;
     $this->workspaceManager = $workspace_manager;
     $this->database = $database;
-    $this->upstreamWorkspace = $this->entityTypeManager->getStorage('workspace')->load($this->getDerivativeId());
+    $this->targetWorkspace = $this->entityTypeManager->getStorage('workspace')->load($configuration['target']);
   }
 
   /**
@@ -99,8 +98,20 @@ class LocalWorkspaceRepositoryHandler extends RepositoryHandlerBase implements R
   /**
    * {@inheritdoc}
    */
+  public function getReplicationTargets() {
+    $branches = [];
+    foreach ($this->entityTypeManager->getStorage('workspace')->loadMultiple() as $workspace) {
+      $branches[$workspace->id()] = $workspace->label();
+    }
+
+    return $branches;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getLabel() {
-    return $this->upstreamWorkspace->label();
+    return $this->targetWorkspace->label();
   }
 
   /**
@@ -108,7 +119,7 @@ class LocalWorkspaceRepositoryHandler extends RepositoryHandlerBase implements R
    */
   public function calculateDependencies() {
     $this->dependencies = parent::calculateDependencies();
-    $this->addDependency($this->upstreamWorkspace->getConfigDependencyKey(), $this->upstreamWorkspace->getConfigDependencyName());
+    $this->addDependency($this->targetWorkspace->getConfigDependencyKey(), $this->targetWorkspace->getConfigDependencyName());
 
     return $this->dependencies;
   }
diff --git a/src/RepositoryHandlerBase.php b/src/RepositoryHandlerBase.php
index 3cadec0..58aad06 100644
--- a/src/RepositoryHandlerBase.php
+++ b/src/RepositoryHandlerBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\workspace;
 
+use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Entity\DependencyTrait;
 use Drupal\Core\Plugin\PluginBase;
 
@@ -20,6 +21,15 @@ abstract class RepositoryHandlerBase extends PluginBase implements RepositoryHan
   /**
    * {@inheritdoc}
    */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->setConfiguration($configuration);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getLabel() {
     return $this->getPluginDefinition()['label'];
   }
@@ -41,6 +51,27 @@ abstract class RepositoryHandlerBase extends PluginBase implements RepositoryHan
   /**
    * {@inheritdoc}
    */
+  public function getConfiguration() {
+    return $this->configuration;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function calculateDependencies() {
     return [];
   }
diff --git a/src/RepositoryHandlerInterface.php b/src/RepositoryHandlerInterface.php
index 916263f..a3a3994 100644
--- a/src/RepositoryHandlerInterface.php
+++ b/src/RepositoryHandlerInterface.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\workspace;
 
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Component\Plugin\DerivativeInspectionInterface;
 use Drupal\Component\Plugin\PluginInspectionInterface;
 
@@ -14,7 +15,7 @@ use Drupal\Component\Plugin\PluginInspectionInterface;
  * performing an external replication may need hostname, port, username,
  * password etc.
  */
-interface RepositoryHandlerInterface extends PluginInspectionInterface, DerivativeInspectionInterface {
+interface RepositoryHandlerInterface extends PluginInspectionInterface, DerivativeInspectionInterface, ConfigurablePluginInterface {
 
   /**
    * Default empty value for repository handler fields.
@@ -49,4 +50,17 @@ interface RepositoryHandlerInterface extends PluginInspectionInterface, Derivati
    */
   public function isRemote();
 
+  /**
+   * Returns a list of targets that the plugin can replicate content to.
+   *
+   * For example, in the "local_workspace" repository handler plugin, each
+   * workspace defined in the local Drupal installation is a potential target.
+   *
+   * @return array
+   *   An array of replication target labels, keyed by their ID. If an empty
+   *   array is returned, this plugin does not support replication to a specific
+   *   target.
+   */
+  public function getReplicationTargets();
+
 }
