diff --git a/src/EventSubscriber/WorkbenchModerationSubscriber.php b/src/EventSubscriber/WorkbenchModerationSubscriber.php
new file mode 100644
index 0000000..6e4276f
--- /dev/null
+++ b/src/EventSubscriber/WorkbenchModerationSubscriber.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Drupal\workspace\EventSubscriber;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\multiversion\Entity\WorkspaceInterface;
+use Drupal\workbench_moderation\Entity\ModerationState;
+use Drupal\workbench_moderation\Event\WorkbenchModerationEvents;
+use Drupal\workbench_moderation\Event\WorkbenchModerationTransitionEvent;
+use Drupal\workspace\PointerInterface;
+use Drupal\workspace\ReplicatorManager;
+use Drupal\workspace\WorkspacePointerInterface;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Subscriber for workbench transitions.
+ */
+class WorkbenchModerationSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * @var \Drupal\workspace\WorkspacePointerInterface
+   */
+  protected $workspacePointer;
+
+  /**
+   * @var \Drupal\workspace\ReplicatorManager
+   */
+  protected $replicatorManager;
+
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, WorkspacePointerInterface $workspace_pointer, ReplicatorManager $replicator_manager) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->workspacePointer = $workspace_pointer;
+    $this->replicatorManager = $replicator_manager;
+  }
+
+  /**
+   * Listener for workbench moderation event transitions.
+   *
+   * @param \Drupal\workbench_moderation\Event\WorkbenchModerationTransitionEvent $event
+   *   The transition event that just fired.
+   */
+  public function onTransition(WorkbenchModerationTransitionEvent $event) {
+    $entity = $event->getEntity();
+
+    if ($entity->getEntityTypeId() == 'workspace' && $this->wasDefaultRevision($event)) {
+      /** @var WorkspaceInterface $entity */
+      $this->mergeWorkspaceToParent($entity);
+    }
+  }
+
+  /**
+   * Determines if the transition is to a "default revision" state.
+   *
+   * @param \Drupal\workbench_moderation\Event\WorkbenchModerationTransitionEvent $event
+   *   The transition event.
+   *
+   * @return bool
+   *   TRUE if the event is moving an entity to a default-revision state.
+   */
+  protected function wasDefaultRevision(WorkbenchModerationTransitionEvent $event) {
+    /** @var ModerationState $post_state */
+    $post_state = $this->entityTypeManager->getStorage('moderation_state')->load($event->getStateAfter());
+
+    // @todo should this look for the Published flag instead? Published means
+    // nothing else for Workspaces.
+    return $post_state->isDefaultRevisionState();
+  }
+
+  /**
+   * Merges a workspace to its parent workspace, if any.
+   *
+   * @param \Drupal\multiversion\Entity\WorkspaceInterface $workspace
+   *   The workspace entity to merge.
+   */
+  protected function mergeWorkspaceToParent(WorkspaceInterface $workspace) {
+    // This may be insufficient for handling a missing parent.
+    /** @var WorkspaceInterface $parent_workspace */
+    $parent_workspace = $workspace->get('upstream')->entity;
+    if (!$parent_workspace) {
+      // @todo Should we silently ignore this, or throw an error, or...?
+      return;
+    }
+
+    /** @var PointerInterface $source_pointer */
+    $source_pointer = $this->workspacePointer->get('workspace:' . $workspace->id());
+    /** @var PointerInterface $target_pointer */
+    $target_pointer = $this->workspacePointer->get('workspace:' . $parent_workspace->id());
+
+    $this->replicatorManager->replicate($source_pointer, $target_pointer);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  static function getSubscribedEvents() {
+    $events[WorkbenchModerationEvents::STATE_TRANSITION][] = ['onTransition'];
+
+    return $events;
+  }
+}
diff --git a/workspace.services.yml b/workspace.services.yml
index 9270bb2..cd81b43 100644
--- a/workspace.services.yml
+++ b/workspace.services.yml
@@ -9,4 +9,9 @@ services:
       - {name: workspace_replicator, priority: 10}
   workspace.pointer:
     class: Drupal\workspace\WorkspacePointer
-    arguments: ['@keyvalue']
\ No newline at end of file
+    arguments: ['@keyvalue']
+  workspace.workbench_moderation_subscriber:
+    class: Drupal\workspace\EventSubscriber\WorkbenchModerationSubscriber
+    arguments: ['@entity_type.manager', '@workspace.pointer', '@replicator.manager']
+    tags:
+      - { name: event_subscriber }
