diff --git a/src/EntityOperations.php b/src/EntityOperations.php
index d9d5f98..ad84343 100644
--- a/src/EntityOperations.php
+++ b/src/EntityOperations.php
@@ -54,13 +54,45 @@ class EntityOperations {
     // Create a new pointer to every Workspace that gets created.
     // This is mainly so that we can always backtrack from a Workspace to a
     // pointer to provide a consistent API to replicators.
+    $this->loadOrCreateWorkspacePointer($workspace);
+  }
 
-    /** @var WorkspacePointerInterface $pointer */
-    $pointer = $this->entityTypeManager->getStorage('workspace_pointer')->create();
-    $pointer->setWorkspace($workspace);
-    $pointer->save();
+  /**
+   * Hook bridge for hook_workspace_update()
+   *
+   * @see hook_ENTITY_TYPE_update()
+   *
+   * @param \Drupal\multiversion\Entity\WorkspaceInterface $workspace
+   *   The workspace entity that is being updated.
+   */
+  public function workspaceUpdate(WorkspaceInterface $workspace) {
+    $workspace_pointer = $this->loadOrCreateWorkspacePointer($workspace);
+    if (!$workspace->isPublished()) {
+      $workspace_pointer->delete();
+    }
   }
 
+  /**
+   * Load or create the workspace pointer for a workspace.
+   *
+   * @param \Drupal\multiversion\Entity\WorkspaceInterface $workspace
+   *   The workspace entity.
+   *
+   * @return \Drupal\workspace\WorkspacePointerInterface
+   *   The workspace pointer entity.
+   */
+  public function loadOrCreateWorkspacePointer(WorkspaceInterface $workspace) {
+    $storage = $this->entityTypeManager->getStorage('workspace_pointer');
+    $workspace_pointers = $storage->loadByProperties(['workspace_pointer' => $workspace->id()]);
+    if (empty($workspace_pointers)) {
+      /** @var \Drupal\workspace\WorkspacePointerInterface $pointer */
+      $pointer = $storage->create();
+      $pointer->setWorkspace($workspace);
+      $pointer->save();
+      return $pointer;
+    }
+    return reset($workspace_pointers);
+  }
 
   /**
    * Hook bridge for hook_workspace_delete()
diff --git a/src/Field/FieldWidget/OptionsUpstreamButtonsWidget.php b/src/Field/FieldWidget/OptionsUpstreamButtonsWidget.php
deleted file mode 100644
index f659404..0000000
--- a/src/Field/FieldWidget/OptionsUpstreamButtonsWidget.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Drupal\workspace\Field\Plugin\Field\FieldWidget;
-
-use Drupal\Core\Entity\FieldableEntityInterface;
-use Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget;
-
-/**
- * Plugin implementation of the 'options_upstream_buttons' widget.
- *
- * @FieldWidget(
- *   id = "options_upstream_buttons",
- *   label = @Translation("Check boxes/radio buttons"),
- *   field_types = {
- *     "entity_reference",
- *   },
- *   multiple_values = TRUE
- * )
- */
-class UpstreamButtonsWidget extends OptionsButtonsWidget {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function getOptions(FieldableEntityInterface $entity) {
-    $options = parent::getOptions($entity);
-    return $options;
-  }
-
-}
diff --git a/src/Toolbar.php b/src/Toolbar.php
index d3473c9..9a43a23 100644
--- a/src/Toolbar.php
+++ b/src/Toolbar.php
@@ -203,7 +203,7 @@ class Toolbar {
    */
   protected function allWorkspaces() {
     return array_filter($this->entityTypeManager->getStorage('workspace')->loadMultiple(), function(WorkspaceInterface $workspace) {
-      return $workspace->access('view', $this->currentUser);
+      return $workspace->isPublished() && $workspace->access('view', $this->currentUser);
     });
   }
 }
diff --git a/src/WorkspaceListBuilder.php b/src/WorkspaceListBuilder.php
index 0cec37e..90e0dc7 100644
--- a/src/WorkspaceListBuilder.php
+++ b/src/WorkspaceListBuilder.php
@@ -104,4 +104,23 @@ class WorkspaceListBuilder extends EntityListBuilder {
     return $operations;
   }
 
+  /**
+   * Loads entity IDs using a pager sorted by the entity id.
+   *
+   * @return array
+   *   An array of entity IDs.
+   */
+  protected function getEntityIds() {
+    $query = $this->getStorage()
+      ->getQuery()
+      ->sort($this->entityType->getKey('id'))
+      ->condition('published', TRUE);
+
+    // Only add the pager if a limit is specified.
+    if ($this->limit) {
+      $query->pager($this->limit);
+    }
+    return $query->execute();
+  }
+
 }
diff --git a/tests/src/Functional/WorkspaceSwitcherTest.php b/tests/src/Functional/WorkspaceSwitcherTest.php
index 329924a..42e13d2 100644
--- a/tests/src/Functional/WorkspaceSwitcherTest.php
+++ b/tests/src/Functional/WorkspaceSwitcherTest.php
@@ -47,7 +47,18 @@ class WorkspaceSwitcherTest extends BrowserTestBase {
     $page = $session->getPage();
     $page->findButton(t('Activate'))->click();
 
-    $session->getPage()->findLink($gravity->label());
+    $this->drupalGet('<front>');
+    $assert_session = $this->assertSession();
+    $assert_session->buttonExists($vultures->label());
+    $assert_session->buttonExists($gravity->label());
+
+    $vultures->setUnpublished();
+    $vultures->save();
+
+    $this->drupalGet('<front>');
+    $assert_session = $this->assertSession();
+    $assert_session->buttonNotExists($vultures->label());
+    $assert_session->buttonExists($gravity->label());
   }
   
 }
diff --git a/workspace.module b/workspace.module
index 90a1ea0..dee3b1f 100644
--- a/workspace.module
+++ b/workspace.module
@@ -53,6 +53,15 @@ function workspace_workspace_insert(WorkspaceInterface $workspace) {
   \Drupal::service('workspace.entity_operations')->workspaceInsert($workspace);
 }
 
+/**
+ * Implements hook_ENTITY_TYPE_update()
+ *
+ * @param \Drupal\multiversion\Entity\WorkspaceInterface $workspace
+ */
+function workspace_workspace_update(WorkspaceInterface $workspace) {
+  \Drupal::service('workspace.entity_operations')->workspaceUpdate($workspace);
+}
+
 /**
  * Implements hook_ENTITY_TYPE_delete()
  *
