diff --git a/core/modules/tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php b/core/modules/tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php
index 89a7e76..0f621ce 100644
--- a/core/modules/tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php
+++ b/core/modules/tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php
@@ -66,7 +66,7 @@ class Tour extends ConfigEntityBase {
    *
    * @var array
    */
-  protected $tips;
+  protected $tips = array();
 
   /**
    * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::__construct();
diff --git a/core/modules/tour_ui/lib/Drupal/tour_ui/Routing/TourUIController.php b/core/modules/tour_ui/lib/Drupal/tour_ui/Routing/TourUIController.php
new file mode 100644
index 0000000..16a8d3c
--- /dev/null
+++ b/core/modules/tour_ui/lib/Drupal/tour_ui/Routing/TourUIController.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tour_ui\Routing\TourUIController.
+ */
+
+namespace Drupal\tour_ui\Routing;
+
+use Drupal\Core\Entity\EntityManager;
+use Drupal\tour\Plugin\Core\Entity\Tour;
+
+/**
+ * @todo.
+ */
+class TourUIController {
+
+  /**
+   * @todo.
+   *
+   * @var \Drupal\Core\Entity\EntityManager
+   */
+  protected $manager;
+
+  /**
+   * @todo.
+   */
+  public function __construct(EntityManager $manager) {
+    $this->manager = $manager;
+  }
+
+  /**
+   * @todo.
+   */
+  public function listing() {
+    return $this->manager->getListController('tour')->render();
+  }
+
+  public function add() {
+    $tour = $this->manager->getStorageController('tour')->create(array());
+    return entity_get_form($tour);
+  }
+
+  public function edit(Tour $tour) {
+    return entity_get_form($tour);
+  }
+
+}
diff --git a/core/modules/tour_ui/lib/Drupal/tour_ui/TourFormController.php b/core/modules/tour_ui/lib/Drupal/tour_ui/TourFormController.php
new file mode 100644
index 0000000..a998ce1
--- /dev/null
+++ b/core/modules/tour_ui/lib/Drupal/tour_ui/TourFormController.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tour_ui\TourFormController.
+ */
+
+namespace Drupal\tour_ui;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityFormController;
+
+/**
+ * Form controller for the tour set entity edit forms.
+ */
+class TourFormController extends EntityFormController {
+
+  /**
+   * Overrides \Drupal\Core\Entity\EntityFormController::form().
+   */
+  public function form(array $form, array &$form_state, EntityInterface $entity) {
+    $form = parent::form($form, $form_state, $entity);
+
+    $form['label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Tour name'),
+      '#required' => TRUE,
+      '#default_value' => $entity->label(),
+    );
+    $form['id'] = array(
+      '#type' => 'machine_name',
+      '#machine_name' => array(
+        'exists' => '_tour_load',
+        'replace_pattern' => '[^a-z0-9-]+',
+        'replace' => '-',
+      ),
+      '#default_value' => $entity->id(),
+      '#disabled' => !$entity->isNew(),
+    );
+
+    return $form;
+  }
+
+  /**
+   * Overrides \Drupal\Core\Entity\EntityFormController::submit().
+   */
+  public function submit(array $form, array &$form_state) {
+    $entity = parent::submit($form, $form_state);
+    $is_new = $entity->isNew();
+    $entity->save();
+
+    if ($is_new) {
+      drupal_set_message(t('The %tour tour has been created.', array('%tour' => $entity->label())));
+    }
+    else {
+      drupal_set_message(t('Updated the %tour tour.', array('%tour' => $entity->label())));
+    }
+
+    $form_state['redirect'] = 'admin/config/user-interface/tour';
+    return $entity;
+  }
+
+  /**
+   * Overrides \Drupal\Core\Entity\EntityFormController::actions().
+   */
+  protected function actions(array $form, array &$form_state) {
+    $actions = parent::actions($form, $form_state);
+    unset($actions['delete']);
+    return $actions;
+  }
+
+}
diff --git a/core/modules/tour_ui/lib/Drupal/tour_ui/TourUiBundle.php b/core/modules/tour_ui/lib/Drupal/tour_ui/TourUiBundle.php
new file mode 100644
index 0000000..719757b
--- /dev/null
+++ b/core/modules/tour_ui/lib/Drupal/tour_ui/TourUiBundle.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\tour_ui\TourUiBundle.
+ */
+
+namespace Drupal\tour_ui;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+/**
+ * Tour UI dependency injection container.
+ */
+class TourUiBundle extends Bundle {
+
+  /**
+   * Overrides Symfony\Component\HttpKernel\Bundle\Bundle::build().
+   */
+  public function build(ContainerBuilder $container) {
+    $container->register('tour_ui.controller', 'Drupal\tour_ui\Routing\TourUIController')
+      ->addArgument(new Reference('plugin.manager.entity'));
+  }
+
+}
diff --git a/core/modules/tour_ui/tour_ui.info b/core/modules/tour_ui/tour_ui.info
new file mode 100644
index 0000000..e52f5ed
--- /dev/null
+++ b/core/modules/tour_ui/tour_ui.info
@@ -0,0 +1,6 @@
+name = Tour UI
+description = Provides a UI to manage guided tours.
+package = Core
+version = VERSION
+core = 8.x
+dependencies[] = tour
diff --git a/core/modules/tour_ui/tour_ui.module b/core/modules/tour_ui/tour_ui.module
new file mode 100644
index 0000000..68ada6a
--- /dev/null
+++ b/core/modules/tour_ui/tour_ui.module
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @file
+ * @todo.
+ */
+
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Implements hook_entity_info().
+ */
+function tour_ui_entity_info(&$entity_info) {
+  $entity_info['tour']['list_controller_class'] = 'Drupal\Core\Config\Entity\ConfigEntityListController';
+  $entity_info['tour']['form_controller_class']['default'] = 'Drupal\tour_ui\TourFormController';
+  $entity_info['tour']['uri_callback'] = 'tour_ui_uri';
+}
+
+/**
+ * Implements hook_menu().
+ */
+function tour_ui_menu() {
+  $items['admin/config/user-interface/tour'] = array(
+    'title' => 'Tour',
+    'description' => 'Add and modify guided tours.',
+    'page callback' => 'NOT_USED',
+    'access callback' => TRUE,
+  );
+  $items['admin/config/user-interface/tour/add'] = array(
+    'title' => 'Add tour',
+    'type' => MENU_LOCAL_ACTION,
+    'page callback' => 'NOT_USED',
+    'access callback' => TRUE,
+  );
+  $items['admin/config/user-interface/tour/manage/%/edit'] = array(
+    'title' => 'Edit tour',
+    'page callback' => 'NOT_USED',
+    'access callback' => TRUE,
+  );
+  return $items;
+}
+
+/**
+ * Callback for the entity URI.
+ */
+function tour_ui_uri(EntityInterface $entity) {
+  return array(
+    'path' => 'admin/config/user-interface/tour/manage/' . $entity->id,
+    'options' => array(
+      'entity_type' => $entity->entityType(),
+      'entity' => $entity,
+    ),
+  );
+}
+
+/**
+ * Callback for machine_name exists.
+ */
+function _tour_load($tour) {
+  return entity_load('tour', $tour);
+}
diff --git a/core/modules/tour_ui/tour_ui.routing.yml b/core/modules/tour_ui/tour_ui.routing.yml
new file mode 100644
index 0000000..edd842e
--- /dev/null
+++ b/core/modules/tour_ui/tour_ui.routing.yml
@@ -0,0 +1,18 @@
+tour_ui_listing:
+  pattern: '/admin/config/user-interface/tour'
+  defaults:
+    _controller: 'tour_ui.controller:listing'
+  requirements:
+    _access: 'TRUE'
+tour_ui_add:
+  pattern: '/admin/config/user-interface/tour/add'
+  defaults:
+    _controller: 'tour_ui.controller:add'
+  requirements:
+    _access: 'TRUE'
+tour_ui_edit:
+  pattern: '/admin/config/user-interface/tour/manage/{tour}/edit'
+  defaults:
+    _controller: 'tour_ui.controller:edit'
+  requirements:
+    _access: 'TRUE'
