diff --git a/tour/css/tour-rtl.css b/tour/css/tour-rtl.css
new file mode 100644
index 0000000..cef3d00
--- /dev/null
+++ b/tour/css/tour-rtl.css
@@ -0,0 +1,13 @@
+/**
+ * @file
+ * RTL styling for tour module.
+ */
+
+.js .toolbar .tour-toolbar-tab.tab {
+  float: left;
+}
+
+.tour-progress {
+  right: 0;
+  left: 15px;
+}
diff --git a/tour/css/tour.css b/tour/css/tour.css
new file mode 100644
index 0000000..7a59134
--- /dev/null
+++ b/tour/css/tour.css
@@ -0,0 +1,42 @@
+/**
+ * @file
+ * Styling for tour module.
+ */
+
+/* Tab appearance. */
+.js .toolbar .tour-toolbar-tab.tab {
+  float: right; /* LTR */
+}
+.js .toolbar .tour-toolbar-tab button {
+  padding-bottom: 1em;
+  padding-top: 1em;
+  color: #fff;
+  font-weight: bold;
+  cursor: pointer;
+}
+.js .toolbar .tour-toolbar-tab button.active {
+  background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+}
+.js .tour-toolbar-tab button:focus {
+  outline: thin dotted;
+}
+
+/* Joyride tips should always be on top of everything else. */
+.joyride-tip-guide {
+  z-index: 999;
+  width: auto;
+  height: auto;
+}
+
+/* Override placement of the tour progress indicator. */
+.tour-progress {
+  position: absolute;
+  bottom: 10px;
+  right: 15px; /* LTR */
+}
+
+/* @todo Remove once http://drupal.org/node/1916690 is resolved. */
+.js .toolbar .tour-toolbar-tab.tab.element-hidden {
+  display: none;
+}
\ No newline at end of file
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/css/tour.module-rtl.css" "b/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/css/tour.module-rtl.css"
deleted file mode 100644
index 5e19f7b..0000000
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/css/tour.module-rtl.css"
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * @file
- * RTL styling for tour module.
- */
-
-.js .toolbar .bar .tour-toolbar-tab.tab {
-  float: left;
-}
-
-.tour-progress {
-  right: 0;
-  left: 15px;
-}
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/css/tour.module.css" "b/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/css/tour.module.css"
deleted file mode 100644
index 945e9e3..0000000
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/css/tour.module.css"
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * @file
- * Styling for tour module.
- */
-
-/* Tab appearance. */
-.js .toolbar .bar .tour-toolbar-tab.tab {
-  float: right; /* LTR */
-}
-.js .toolbar .tour-toolbar-tab button {
-  padding-bottom: 1em;
-  padding-top: 1em;
-  color: #fff;
-  font-weight: bold;
-}
-.js .toolbar .tour-toolbar-tab button.active {
-  background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
-  background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
-}
-.js .tour-toolbar-tab button:focus {
-  outline: thin dotted;
-}
-
-/* Joyride tips should always be on top of everything else. */
-.joyride-tip-guide {
-  z-index: 999;
-}
-
-/* Override placement of the tour progress indicator. */
-.tour-progress {
-  position: absolute;
-  bottom: 10px;
-  right: 15px; /* LTR */
-}
-
-/* @todo Remove once http://drupal.org/node/1916690 is resolved. */
-.js .toolbar .tour-toolbar-tab.tab.element-hidden {
-  display: none;
-}
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/Annotation/Tip.php" b/tour/lib/Drupal/tour/Annotation/Tip.php
index d693c17..2351095 100644
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/Annotation/Tip.php"
+++ b/tour/lib/Drupal/tour/Annotation/Tip.php
@@ -7,14 +7,14 @@
 
 namespace Drupal\tour\Annotation;
 
-use Drupal\Component\Annotation\PluginID;
+use Drupal\Component\Annotation\Plugin;
 
 /**
  * Defines a Tip annotation object.
  *
  * @Annotation
  */
-class Tip extends PluginID {
+class Tip extends Plugin {
 
   /**
    * The plugin ID.
@@ -22,5 +22,18 @@ class Tip extends PluginID {
    * @var string
    */
   public $id;
+  
+  /**
+   * The title of the plugin.
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   *
+   * @ingroup plugin_translatable
+   */
+  public $title;
+  
+  
+
+  
 
 }
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php" b/tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php
index 0154c84..2d36c71 100644
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php"
+++ b/tour/lib/Drupal/tour/Plugin/Core/Entity/Tour.php
@@ -105,17 +105,18 @@ class Tour extends ConfigEntityBase implements TourInterface {
   public function getTips() {
     $tips = array();
     foreach ($this->tips as $id => $tip) {
-      $tips[] = $this->getTip($id);
+      $tips[$id] = $this->getTip($id);
     }
     uasort($tips, function ($a, $b) {
-      if ($a->getWeight() == $b->getWeight()) {
+      if ($a->get('weight') == $b->get('weight')) {
         return 0;
       }
-      return ($a->getWeight() < $b->getWeight()) ? -1 : 1;
+      return ($a->get('weight') < $a->get('weight')) ? -1 : 1;
     });
 
-    \Drupal::moduleHandler()->alter('tour_tips', $tips, $this);
-    return array_values($tips);
+   \Drupal::service('module_handler')->alter('tour_tips', $tips, $this);
+    return $tips;
+
   }
 
   /**
diff --git a/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginImageLocal.php b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginImageLocal.php
new file mode 100644
index 0000000..7c4da28
--- /dev/null
+++ b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginImageLocal.php
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tour_test\Plugin\tour\tip\TipPluginImageLocal.
+ */
+
+namespace Drupal\tour\Plugin\tour\tip;
+
+use Drupal\tour\Annotation\Tip;
+use Drupal\tour\TipPluginBase;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Displays an image as a tip.
+ *
+ * @Tip(id = "imagelocal",
+ *		title = @Translation("Image-local")
+ * )
+ */
+class TipPluginImageLocal extends TipPluginBase {
+
+  /**
+   * The url which is used for the image in this Tip.
+   *
+   * @var string
+   *   A url used for the image.
+   */
+  protected $imagelocal;
+
+  /**
+   * The alt text which is used for the image in this Tip.
+   *
+   * @var string
+   *   Alt text used for the image.
+   */
+  protected $alt;
+    
+    
+ /**
+   * Returns a ID that is guaranteed uniqueness.
+   *
+   * @return string
+   *   A unique id to be used to generate aria attributes.
+   */
+  public function getAriaId() {
+    static $id;
+    if (!isset($id)) {
+      $id = drupal_html_id($this->get('id'));
+    }
+    return $id;
+  } 
+    
+  /**
+   * Overrides \Drupal\tour\TipPluginBase::getAttributes().
+   */
+  public function getAttributes() {
+    $attributes = parent::getAttributes();
+    $attributes['data-aria-describedby'] = 'tour-tip-' . $this->getAriaId() . '-contents';
+    $attributes['data-aria-labelledby'] = 'tour-tip-' . $this->getAriaId() . '-label';
+    if ($location = $this->get('location')) {
+      $attributes['data-options'] = 'tipLocation:' . $location;
+    }
+    return $attributes;
+  }
+
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::export();
+   */
+  public function export() {
+    $properties = parent::export();
+    $names = array(
+      'imagelocal',
+	  'alt',
+      'location',
+    );	
+	
+    foreach ($names as $name) {
+      $properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
+
+  
+   public function arrayToStringNum($tmp){
+	$glop = (string)$tmp[0];
+	return $glop;
+   }
+   
+   public function stringNumToArray($tmp){
+	$glop = array((int)$tmp);
+	return $glop;
+   }
+  
+  
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::optionsForm().
+   */
+  public function optionsForm() {
+    $form = parent::optionsForm();
+    $form['location'] = array(
+      '#type' => 'select',
+      '#title' => t('Location'),
+      '#options' => array(
+        'top' => t('Top'),
+        'bottom' => t('Bottom'),
+        'left' => t('Left'),
+        'right' => t('Right'),
+      ),
+      '#default_value' => $this->get('location'),
+    );
+	
+	// Use the #managed_file FAPI element to upload an image file.
+	$form['imagelocal'] = array(
+	'#title' => t('Local Computer Image'),
+	'#type' => 'managed_file',
+	'#description' => t('The uploaded image will be displayed on this page using the image style choosen below.'),
+	'#default_value' => $this->get('imagelocal'),
+	'#upload_location' => 'public://images/',
+	'#required' => TRUE,
+	);
+	
+	$form['alt'] = array(
+      '#type' => 'textfield',
+	  '#size' => 80,
+      '#title' => t('Alt Text'),
+      '#required' => FALSE,
+      '#default_value' => $this->get('alt'),
+	  '#description' => t('The alt text which is used for the image in this Tip'),
+    );
+    return $form;
+  }
+   
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TipPluginInterface::getOutput().
+   */
+  public function getOutput() {
+	global $base_url;
+	$file = file_load($this->get('imagelocal'));
+    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->get('ariaId') . '-label">' . check_plain($this->get('label')) . '</h2>';
+    $output .= '<p class="tour-tip-image" id="tour-tip-' . $this->get('ariaId') . '-contents">' . theme('image', array('uri' => $base_url . '/sites/default/files/images/' . $file->filename, 'alt' => $this->get('alt'))) . '</p>';
+    return array('#markup' => $output);
+  }
+
+}
+
diff --git a/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginImageURL.php b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginImageURL.php
new file mode 100644
index 0000000..7c35a3b
--- /dev/null
+++ b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginImageURL.php
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tour\Plugin\tour\tip\TipPluginImageURL.
+ */
+
+namespace Drupal\tour\Plugin\tour\tip;
+
+use Drupal\tour\Annotation\Tip;
+use Drupal\tour\TipPluginBase;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Displays an image as a tip.
+ *
+ * @Tip(id = "imageURL",
+ *		title = @Translation("ImageURL")
+ * )
+ */
+class TipPluginImageURL extends TipPluginBase {
+
+  /**
+   * The url which is used for the image in this Tip.
+   *
+   * @var string
+   *   A url used for the image.
+   */
+  protected $imageURL;
+
+  /**
+   * The alt text which is used for the image in this Tip.
+   *
+   * @var string
+   *   Alt text used for the image.
+   */
+  protected $alt;
+    
+    
+ /**
+   * Returns a ID that is guaranteed uniqueness.
+   *
+   * @return string
+   *   A unique id to be used to generate aria attributes.
+   */
+  public function getAriaId() {
+    static $id;
+    if (!isset($id)) {
+      $id = drupal_html_id($this->get('id'));
+    }
+    return $id;
+  } 
+    
+  /**
+   * Overrides \Drupal\tour\TipPluginBase::getAttributes().
+   */
+  public function getAttributes() {
+    $attributes = parent::getAttributes();
+    $attributes['data-aria-describedby'] = 'tour-tip-' . $this->getAriaId() . '-contents';
+    $attributes['data-aria-labelledby'] = 'tour-tip-' . $this->getAriaId() . '-label';
+    if ($location = $this->get('location')) {
+      $attributes['data-options'] = 'tipLocation:' . $location;
+    }
+    return $attributes;
+  }
+
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::export();
+   */
+  public function export() {
+    $properties = parent::export();
+    $names = array(
+      'imageURL',
+	  'alt',
+      'location',
+    );	
+	
+    foreach ($names as $name) {
+      $properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
+
+  
+   public function arrayToStringNum($tmp){
+	$glop = (string)$tmp[0];
+	return $glop;
+   }
+   
+   public function stringNumToArray($tmp){
+	$glop = array((int)$tmp);
+	return $glop;
+   }
+  
+  
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::optionsForm().
+   */
+  public function optionsForm() {
+    $form = parent::optionsForm();
+    $form['location'] = array(
+      '#type' => 'select',
+      '#title' => t('Location'),
+      '#options' => array(
+        'top' => t('Top'),
+        'bottom' => t('Bottom'),
+        'left' => t('Left'),
+        'right' => t('Right'),
+      ),
+      '#default_value' => $this->get('location'),
+    );
+	
+	$form['imageURL'] = array(
+	  '#type' => 'textfield',
+	  '#size' => 80,
+      '#title' => t('Image URL'),
+      '#required' => TRUE,
+      '#default_value' => $this->get('imageURL'),
+	  '#description' => t('The URL which is used for the image in this Tip'),
+	);
+	
+	$form['alt'] = array(
+      '#type' => 'textfield',
+	  '#size' => 80,
+      '#title' => t('Alt Text'),
+      '#required' => FALSE,
+      '#default_value' => $this->get('alt'),
+	  '#description' => t('The alt text which is used for the image in this Tip'),
+    );
+    return $form;
+  }
+   
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TipPluginInterface::getOutput().
+   */
+  public function getOutput() {
+	global $base_url;
+    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->get('ariaId') . '-label">' . check_plain($this->get('label')) . '</h2>';
+    $output .= '<p class="tour-tip-image" id="tour-tip-' . $this->get('ariaId') . '-contents">' . theme('image', array('uri' => $this->get('imageURL'), 'alt' => $this->get('alt'))) . '</p>';
+    return array('#markup' => $output);
+  }
+
+}
+
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginText.php" b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginText.php
index 8f6d40c..3f88300 100644
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginText.php"
+++ b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginText.php
@@ -9,11 +9,15 @@ namespace Drupal\tour\Plugin\tour\tip;
 
 use Drupal\tour\Annotation\Tip;
 use Drupal\tour\TipPluginBase;
+use Drupal\Core\Annotation\Translation;
 
 /**
  * Displays some text as a tip.
  *
- * @Tip("text")
+ * @Tip(id = "text", 
+ *      title = @Translation("Text")
+ * )
+ *
  */
 class TipPluginText extends TipPluginBase {
 
@@ -46,26 +50,6 @@ class TipPluginText extends TipPluginBase {
   }
 
   /**
-   * Returns body of the text tip.
-   *
-   * @return string
-   *   The tip body.
-   */
-  public function getBody() {
-    return $this->get('body');
-  }
-
-  /**
-   * Returns location of the text tip.
-   *
-   * @return string
-   *   The tip location.
-   */
-  public function getLocation() {
-    return $this->get('location');
-  }
-
-  /**
    * Overrides \Drupal\tour\TipPluginBase::getAttributes().
    */
   public function getAttributes() {
@@ -79,11 +63,52 @@ class TipPluginText extends TipPluginBase {
   }
 
   /**
-   * Implements \Drupal\tour\TipPluginInterface::getOutput().
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::getOutput();
    */
   public function getOutput() {
-    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->getAriaId() . '-label">' . check_plain($this->getLabel()) . '</h2>';
-    $output .= '<p class="tour-tip-body" id="tour-tip-' . $this->getAriaId() . '-contents">' . filter_xss_admin($this->getBody()) . '</p>';
+    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->getAriaId() . '-label">' . check_plain($this->get('label')) . '</h2>';
+    $output .= '<p class="tour-tip-body" id="tour-tip-' . $this->getAriaId() . '-contents">' . filter_xss_admin($this->get('body')) . '</p>';
     return array('#markup' => $output);
   }
+
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::export();
+   */
+  public function export() {
+    $properties = parent::export();
+    $names = array(
+      'body',
+      'location',
+    );
+    foreach ($names as $name) {
+      $properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
+
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::optionsForm().
+   */
+  public function optionsForm() {
+    $form = parent::optionsForm();
+    $form['location'] = array(
+      '#type' => 'select',
+      '#title' => t('Location'),
+      '#options' => array(
+        'top' => t('Top'),
+        'bottom' => t('Bottom'),
+        'left' => t('Left'),
+        'right' => t('Right'),
+      ),
+      '#default_value' => $this->get('location'),
+    );
+    $form['body'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Body'),
+      '#required' => TRUE,
+      '#default_value' => $this->get('body'),
+    );
+    return $form;
+  }
+
 }
diff --git a/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginYouTube.php b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginYouTube.php
new file mode 100644
index 0000000..fdd8a86
--- /dev/null
+++ b/tour/lib/Drupal/tour/Plugin/tour/tip/TipPluginYouTube.php
@@ -0,0 +1,145 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tour\Plugin\tour\tip\TipPluginYouTube.
+ */
+
+namespace Drupal\tour\Plugin\tour\tip;
+
+use Drupal\tour\Annotation\Tip;
+use Drupal\tour\TipPluginBase;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Displays a Youtube Video as a tip.
+ *
+ * @Tip(id = "youtube",
+ *      title = @Translation("YouTube")
+ * )
+ */
+class TipPluginYouTube extends TipPluginBase {
+
+  /**
+   * The url which is used for the image in this Tip.
+   *
+   * @var string
+   *   A url used for the image.
+   */
+  protected $ytID;
+
+  /**
+   * The alt text which is used for the image in this Tip.
+   *
+   * @var string
+   *   A alt text used for the image.
+   */
+  protected $alt;
+
+ /**
+   * The width of video in this Tip.
+   *
+   * @var string
+   *   Width used for the video.
+   */
+  protected $width;
+  
+  
+  /**
+   * The height for the image in this Tip.
+   *
+   * @var string
+   *   Height used for the video.
+   */
+  
+  protected $height;
+ 
+ 
+ 
+ /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::export();
+   */
+  public function export() {
+    $properties = parent::export();
+    $names = array(
+      'ytID',
+	  'video',
+      'location',
+    );
+	
+    foreach ($names as $name) {
+		$properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
+
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginBase::optionsForm().
+   */
+  public function optionsForm() {
+    $form = parent::optionsForm();
+	
+    $form['location'] = array(
+      '#type' => 'select',
+      '#title' => t('Location'),
+      '#options' => array(
+        'top' => t('Top'),
+        'bottom' => t('Bottom'),
+        'left' => t('Left'),
+        'right' => t('Right'),
+      ),
+      '#default_value' => $this->get('location'),
+    );
+	
+	
+	$form['ytID'] = array(
+      '#type' => 'textfield',
+	  '#size' => 30,
+      '#title' => t('YouTube Video Identifier'),
+      '#required' => TRUE,
+      '#default_value' => $this->get('ytID'),
+	  '#description' => t('The YouTube Identifier for the<br /> video in this Tip. ie.( DeLT0g0t25Q )'),
+    );
+	
+	$form['video'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Video Details'),
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+      '#tree' => TRUE,
+	  '#description' => t('Default dimensions have 1.78:1 Aspect Ratio, (16x9)'),
+    );
+
+	$form['video']['width'] = array(
+      '#type' => 'textfield',
+	  '#size' => 20,
+      '#title' => t('Video Width'),
+      '#required' => FALSE,
+      '#default_value' => $this->get('video')['width'],
+	  '#description' => t('The width for the video in this Tip'),
+    );
+
+	$form['video']['height'] = array(
+      '#type' => 'textfield',
+	  '#size' => 20,
+      '#title' => t('Video Height'),
+      '#required' => FALSE,
+      '#default_value' => $this->get('video')['height'],
+	  '#description' => t('The height for the video in this Tip'),
+    );
+
+	return $form;
+ }
+ 
+ 
+ /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TipPluginInterface::getOutput().
+   */
+  public function getOutput() {
+ 
+    $output = '<h2 class="tour-tip-label" id="tour-tip-' . $this->get('ariaId') . '-label">' . check_plain($this->get('label')) . '</h2>';
+    $output .= '<p class="tour-tip-youtube" id="tour-tip-' . $this->get('ariaId') . '-contents">' . '<iframe class="YouTube" style="width:' . $this->get('video')['width'] . 'px;height:' . $this->get('video')['height'] . 'px" frameborder="0" allowfullscreen="1" title="YouTube video player" width="100%" height="100%" src="http://www.youtube.com/embed/' . $this->get('ytID')  . '?wmode=transparent&enablejsapi=1&origin=http://localhost"></iframe></p>';
+    return array('#markup' => $output);
+  }
+
+}
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/TipPluginBase.php" b/tour/lib/Drupal/tour/TipPluginBase.php
index a77e3f5..e3a0b81 100644
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/TipPluginBase.php"
+++ b/tour/lib/Drupal/tour/TipPluginBase.php
@@ -72,4 +72,167 @@ abstract class TipPluginBase extends PluginBase implements TipPluginInterface {
   public function set($key, $value) {
     $this->configuration[$key] = $value;
   }
+  
+  
+  
+  /**
+   * Implements \Drupal\tour\Plugin\tour\tour\TourPluginInterface::export().
+   */
+  public function export() {
+    $names = array(
+      'id',
+      'plugin',
+      'label',
+      'weight',
+      'attributes',
+    );
+    foreach ($names as $name) {
+      $properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
+
+  /**
+   * Overrides \Drupal\tour\Plugin\tour\tour\TourPluginInterface::optionsForm().
+   */
+  public function optionsForm() {
+    $form = array();
+    $id = $this->get('id');
+    $form['label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Label'),
+      '#required' => TRUE,
+      '#default_value' => $this->get('label'),
+    );
+    $form['id'] = array(
+      '#type' => 'machine_name',
+      '#machine_name' => array(
+        'exists' => '_tour_load',
+        'replace_pattern' => '[^a-z0-9-]+',
+        'replace' => '-',
+      ),
+      '#default_value' => $id,
+      '#disabled' => !empty($id),
+    );
+    $form['plugin'] = array(
+      '#type' => 'value',
+      '#value' => $this->get('plugin'),
+    );
+    $form['weight'] = array(
+      '#type' => 'weight',
+      '#title' => t('Weight'),
+      '#default_value' => $this->get('weight'),
+      '#attributes' => array(
+        'class' => array('tip-order-weight'),
+      ),
+    );
+
+    $attributes = $this->getAttributes();
+    $form['attributes'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Attributes'),
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+      '#tree' => TRUE,
+    );
+
+    // Determine the type identifier of the tip.
+    if (!empty($attributes['data-id'])) {
+      $tip_type = 'data-id';
+    }
+    else if (!empty($attributes['data-class'])) {
+      $tip_type = 'data-class';
+    }
+    else {
+      $tip_type = 'modal';
+    }
+    $form['attributes']['selector_type'] = array(
+      '#type' => 'select',
+      '#title' => t('Selector type'),
+      '#description' => t('The type of selector this tip will target.'),
+      '#options' => array(
+        'data-id' => t('Data ID'),
+        'data-class' => t('Data Class'),
+        'modal' => t('Modal'),
+      ),
+      '#default_value' => $tip_type,
+      '#element_validate' => array(array($this, 'optionsFormValidate')),
+    );
+    $form['attributes']['data-id'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Data id'),
+      '#description' => t('Provide the ID of the page element.'),
+      '#field_prefix' => '#',
+      '#default_value' => !empty($attributes['data-id']) ? $attributes['data-id'] : '',
+      '#states' => array(
+        'visible' => array(
+          'select[name="attributes[selector_type]"]' => array('value' => 'data-id'),
+        ),
+        'enabled' => array(
+          'select[name="attributes[selector_type]"]' => array('value' => 'data-id'),
+        ),
+      ),
+    );
+    $form['attributes']['data-class'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Data class'),
+      '#description' => t('Provide the Class of the page element.'),
+      '#field_prefix' => '.',
+      '#default_value' => !empty($attributes['data-class']) ? $attributes['data-class'] : '',
+      '#states' => array(
+        'visible' => array(
+          'select[name="attributes[selector_type]"]' => array('value' => 'data-class'),
+        ),
+        'enabled' => array(
+          'select[name="attributes[selector_type]"]' => array('value' => 'data-class'),
+        ),
+      ),
+    );
+    return $form;
+  }
+
+  /**
+   * Validates the tip optionsForm().
+   *
+   * @param $element
+   *   The form element that has the validate attached.
+   *
+   * @param $form_state
+   *   The state of the form after submission.
+   *
+   * @param $form
+   *   The form array.
+   */
+  function optionsFormValidate($element, &$form_state, $form) {
+    $values = $form_state['values'];
+    $selector_type = $values['attributes']['selector_type'];
+    unset($form_state['values']['attributes']['selector_type']);
+
+    // If modal we need to ensure that there is no data-id or data-class specified.
+    if ($selector_type == 'modal') {
+      unset($form_state['values']['attributes']['data-id']);
+      unset($form_state['values']['attributes']['data-class']);
+    }
+
+    // If data-id was selected and no id provided.
+    if ($selector_type == 'data-id' && empty($values['attributes']['data-id'])) {
+      form_error($form['attributes']['data-id'], t('Please provide a data id.'));
+    }
+
+    // If data-class was selected and no class provided.
+    if ($selector_type == 'data-class' && empty($values['attributes']['data-class'])) {
+      form_error($form['attributes']['data-class'], t('Please provide a data class.'));
+    }
+
+    // Remove the data-class value if data-id is provided.
+    if ($selector_type == 'data-id') {
+      unset($form_state['values']['attributes']['data-class']);
+    }
+
+    // Remove the data-id value is data-class is provided.
+    if ($selector_type == 'data-class') {
+      unset($form_state['values']['attributes']['data-id']);
+    }
+  }
+
 }
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/TourRenderController.php" b/tour/lib/Drupal/tour/TourRenderController.php
index e1bf15d..ba96c49 100644
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/lib/Drupal/tour/TourRenderController.php"
+++ b/tour/lib/Drupal/tour/TourRenderController.php
@@ -24,7 +24,9 @@ class TourRenderController extends EntityRenderController {
       $tips = $entity->getTips();
       $count = count($tips);
       $list_items = array();
+	  $tipcount = 0;
       foreach ($tips as $index => $tip) {
+	    $tipcount++;
         if ($output = $tip->getOutput()) {
           $attributes = array(
             'class' => array(
@@ -42,7 +44,7 @@ class TourRenderController extends EntityRenderController {
                   'tour-progress',
                 ),
               ),
-              '#children' => t('!tour_item of !total', array('!tour_item' => $index + 1, '!total' => $count)),
+              '#children' => t('!tour_item of !total', array('!tour_item' => $tipcount, '!total' => $count)),
             ),
             '#wrapper_attributes' => $tip->getAttributes() + $attributes,
           );
diff --git "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/tour.module" b/tour/tour.module
index 8d96cfd..fe9bc1a 100644
--- "a/c:\\\\wamp\\www\\d8_tour_virgin\\core\\modules\\tour/tour.module"
+++ b/tour/tour.module
@@ -45,7 +45,7 @@ function tour_library_info() {
     'title' => 'Tour',
     'version' => VERSION,
     'css' => array(
-      $path . '/css/tour.module.css' => array('media' => 'screen'),
+      $path . '/css/tour.css' => array('media' => 'screen'),
     )
   );
 
