diff --git a/core/modules/tour/js/tour.js b/core/modules/tour/js/tour.js
index d8885be..a78169f 100644
--- a/core/modules/tour/js/tour.js
+++ b/core/modules/tour/js/tour.js
@@ -53,6 +53,17 @@ Drupal.behaviors.tour = {
         })
         // Initialization: check whether a tour is available on the current page.
         .set('tour', $(context).find('ol#tour'));
+
+      // Start the tour right away if toggled via query string.
+      var query = $.deparam.querystring();
+      if (query.tour) {
+        // Allow the page to load (needs a better solution).
+        setTimeout(
+          function() {
+            model.set('isActive', true);
+        }, 1000);
+      }
+
     });
   }
 };
@@ -171,13 +182,16 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
    */
   _removeIrrelevantTourItems: function ($tour, $document) {
     var removals = false;
+    var query = $.deparam.querystring();
+
     $tour
       .find('li')
       .each(function () {
         var $this = $(this);
         var itemId = $this.attr('data-id');
         var itemClass = $this.attr('data-class');
-        if ($document.find('#' + itemId + ', .' + itemClass).length === 0) {
+        if (($document.find('#' + itemId + ', .' + itemClass).length === 0) ||
+            (query.tips && !$(this).hasClass(query.tips))) {
           removals = true;
           $this.remove();
         }
@@ -201,4 +215,4 @@ Drupal.tour.views.ToggleTourView = Backbone.View.extend({
 
 });
 
-})(jQuery, Backbone, Drupal, document);
\ No newline at end of file
+})(jQuery, Backbone, Drupal, document);
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 12ca122..b26f9b8 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
@@ -39,6 +39,13 @@ class Tour extends ConfigEntityBase {
   public $id;
 
   /**
+   * The module which this tour is assigned to.
+   *
+   * @var string
+   */
+  public $module;
+
+  /**
    * The label of the tour.
    *
    * @var string
diff --git a/core/modules/tour/lib/Drupal/tour/Tests/TourTest.php b/core/modules/tour/lib/Drupal/tour/Tests/TourTest.php
index 6e45d3f..209fab5 100644
--- a/core/modules/tour/lib/Drupal/tour/Tests/TourTest.php
+++ b/core/modules/tour/lib/Drupal/tour/Tests/TourTest.php
@@ -40,9 +40,10 @@ protected function setUp() {
    * Test tour functionality.
    */
   public function testTourFunctionality() {
-    // Navigate to tour-test-1 and verify the tour_test_1 tip is found.
+    // Navigate to tour-test-1 and verify the tour_test_1 tip is found with appropriate classes.
     $this->drupalGet('tour-test-1');
-    $elements = $this->xpath('//li[@data-id=:data_id and ./h2[contains(., :text)]]', array(
+    $elements = $this->xpath('//li[@data-id=:data_id and @class=:classes and ./h2[contains(., :text)]]', array(
+      ':classes' => 'tip-module-tour-test tip-type-text tip-tour-test-1-en even last',
       ':data_id' => 'tour-test-1',
       ':text' => 'The first tip',
     ));
diff --git a/core/modules/tour/lib/Drupal/tour/TourRenderController.php b/core/modules/tour/lib/Drupal/tour/TourRenderController.php
index 0f61c24..e1bf15d 100644
--- a/core/modules/tour/lib/Drupal/tour/TourRenderController.php
+++ b/core/modules/tour/lib/Drupal/tour/TourRenderController.php
@@ -26,6 +26,13 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
       $list_items = array();
       foreach ($tips as $index => $tip) {
         if ($output = $tip->getOutput()) {
+          $attributes = array(
+            'class' => array(
+              'tip-module-' . drupal_clean_css_identifier($entity->get('module')),
+              'tip-type-' . drupal_clean_css_identifier($tip->get('plugin')),
+              'tip-' . drupal_clean_css_identifier($tip->get('id')),
+            ),
+          );
           $list_items[] = array(
             'output' => $output,
             'counter' => array(
@@ -37,7 +44,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
               ),
               '#children' => t('!tour_item of !total', array('!tour_item' => $index + 1, '!total' => $count)),
             ),
-            '#wrapper_attributes' => $tip->getAttributes(),
+            '#wrapper_attributes' => $tip->getAttributes() + $attributes,
           );
         }
       }
diff --git a/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-2-en.yml b/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-2-en.yml
index 6816aa7..4a88806 100644
--- a/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-2-en.yml
+++ b/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-2-en.yml
@@ -1,4 +1,5 @@
 id: tour-test-2-en
+module: tour_test
 label: Tour test english
 langcode: en
 paths:
diff --git a/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-en.yml b/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-en.yml
index 5271213..7c41a42 100644
--- a/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-en.yml
+++ b/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-en.yml
@@ -1,4 +1,5 @@
 id: tour-test-en
+module: tour_test
 label: Tour test english
 langcode: en
 paths:
diff --git a/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-it.yml b/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-it.yml
index 86f0a25..2ecb28f 100644
--- a/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-it.yml
+++ b/core/modules/tour/tests/tour_test/config/tour.tour.tour-test-it.yml
@@ -1,4 +1,5 @@
 id: tour-test-it
+module: tour_test
 label: Tour test italian
 langcode: it
 paths:
diff --git a/core/modules/tour/tour.module b/core/modules/tour/tour.module
index 9787190..d6d79ec 100644
--- a/core/modules/tour/tour.module
+++ b/core/modules/tour/tour.module
@@ -36,6 +36,7 @@ function tour_library_info() {
       array('system', 'jquery'),
       array('system', 'drupal'),
       array('system', 'backbone'),
+      array('system', 'jquery.bbq'),
       array('tour', 'jquery.joyride'),
       array('tour', 'tour-styling'),
     ),
diff --git a/core/modules/views/views_ui/config/tour.tour.views-ui-en.yml b/core/modules/views/views_ui/config/tour.tour.views-ui-en.yml
index 77f66f3..02e2917 100644
--- a/core/modules/views/views_ui/config/tour.tour.views-ui-en.yml
+++ b/core/modules/views/views_ui/config/tour.tour.views-ui-en.yml
@@ -1,4 +1,5 @@
 id: views-ui-en
+module: views_ui
 label: Views ui
 langcode: en
 paths:
