diff --git a/examples.module b/examples.module
index e866557..c60f841 100644
--- a/examples.module
+++ b/examples.module
@@ -46,6 +46,7 @@ function examples_toolbar() {
     'page_example' => 'page_example_description',
     'phpunit_example' => 'phpunit_example_description',
     'simpletest_example' => 'simpletest_example_description',
+    'session_example' => 'session_example.form',
     'tour_example' => 'tour_example_description',
   );
 
diff --git a/session_example/session_example.info.yml b/session_example/session_example.info.yml
new file mode 100644
index 0000000..780019c
--- /dev/null
+++ b/session_example/session_example.info.yml
@@ -0,0 +1,7 @@
+name: 'Session example'
+type: module
+description: 'An example of how to use session in Drupal 8.'
+package: Example modules
+core: 8.x
+dependencies:
+  - examples
diff --git a/session_example/session_example.links.menu.yml b/session_example/session_example.links.menu.yml
new file mode 100644
index 0000000..0d5077b
--- /dev/null
+++ b/session_example/session_example.links.menu.yml
@@ -0,0 +1,7 @@
+# Define the menu links for this module
+
+session_example.form:
+  title: 'Session Example'
+  route_name: session_example.form
+  description: 'Setting Form'
+  weight: 10
diff --git a/session_example/session_example.links.task.yml b/session_example/session_example.links.task.yml
new file mode 100644
index 0000000..3c1efe8
--- /dev/null
+++ b/session_example/session_example.links.task.yml
@@ -0,0 +1,8 @@
+session_example.form:
+  route_name: session_example.form
+  base_route: session_example.form
+  title: Form
+session_example.view:
+  route_name: session_example.view
+  base_route: session_example.form
+  title: View
diff --git a/session_example/session_example.routing.yml b/session_example/session_example.routing.yml
new file mode 100644
index 0000000..da22c65
--- /dev/null
+++ b/session_example/session_example.routing.yml
@@ -0,0 +1,18 @@
+session_example.form:
+  path: '/examples/session_example'
+  defaults:
+    _form: '\Drupal\session_example\Form\SessionExampleForm'
+    _title: 'Session Example'
+  requirements:
+    _access: 'TRUE'
+  options:
+    _admin_route: TRUE
+session_example.view:
+  path: '/examples/session_example/view'
+  defaults:
+    _controller: '\Drupal\session_example\Controller\SessionExampleController::showSession'
+    _title: 'Session Example: Current Values'
+  requirements:
+    _access: 'TRUE'
+  options:
+    _admin_route: TRUE
diff --git a/session_example/src/Controller/SessionExampleController.php b/session_example/src/Controller/SessionExampleController.php
new file mode 100644
index 0000000..3bb4b28
--- /dev/null
+++ b/session_example/src/Controller/SessionExampleController.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\session_example\Controller\SessionExampleController.
+ */
+
+namespace Drupal\session_example\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Symfony\Component\HttpFoundation\Request;
+
+class SessionExampleController extends ControllerBase {
+
+  /**
+   * A session controller example.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The request object.
+   *
+   * @return string
+   *   A rendered array containing name and mail from session.
+   */
+  public function showSession(Request $request) {
+    $session = $request->getSession();
+    $name = $session->get('session_example.name', $this->t('No Name'));
+    $email = $session->get('session_example.email', $this->t('No EMail'));
+    $quest = $session->get('session_example.quest', $this->t('No Quest'));
+    $color = $session->get('session_example.color', $this->t('No Color'));
+    return [
+      'description' => [
+        '#type' => 'item',
+        '#title' => $this->t('Saved Session Keys'),
+        '#markup' => $this->t('The example form lets you set some session keys.  This page lists what their current values are.'),
+      ],
+      'session_status' => [
+        '#markup' => $this->t('Name: @name, EMail: @email,  Quest: @quest, Color: @color', ['@name' => $name, '@email' => $email, '@quest' => $quest, '@color' => $color]),
+      ],
+      '#cache' => [
+      'max-age' => 0,
+      ]
+    ];
+  }
+}
diff --git a/session_example/src/Form/SessionExampleForm.php b/session_example/src/Form/SessionExampleForm.php
new file mode 100644
index 0000000..022f68f
--- /dev/null
+++ b/session_example/src/Form/SessionExampleForm.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\session_example\Form\SessionExampleForm.
+ */
+
+namespace Drupal\session_example\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Utility\LinkGeneratorInterface;
+use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+class SessionExampleForm extends FormBase {
+
+  /**
+   *  The request object.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $request;
+
+  /**
+   * The Link generator.
+   *
+   * @var \Drupal\Core\Utility\LinkGeneratorInterface
+   */
+  protected $link_generator;
+
+  /**
+   * Constructs a new SessionExampleForm object.
+   *
+   * @param \Symfony\Component\HttpFoundation\RequestStack
+   *   The request stack object.
+   * @param  \Drupal\Core\Utility\LinkGeneratorInterface
+   *   The link generator.
+   */
+  public function __construct(RequestStack $request, LinkGeneratorInterface $link_generator) {
+    $this->request = $request;
+    $this->link_generator = $link_generator;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('request_stack'),
+      $container->get('link_generator')
+    );
+  }
+
+  /**
+   * Get the session object from here.
+   *
+   * @return \Symfony\Component\HttpFoundation\Session\SessionInterface
+   */
+  public function getExampleSession() {
+    $request = $this->request->getCurrentRequest();
+    $session = $request->getSession();
+    return $session;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'session_example_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $session = $this->getExampleSession();
+    $form['description'] = [
+      '#type' => 'item',
+      '#title' => $this->t('Session Data Test Form'),
+      '#markup' => $this->t('In this example form, data that you enter into the form will be saved into your session data, which persists until you log out of Drupal.'),
+    ];
+    $form['name'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Name'),
+      '#placeholder' => $this->t('Your name.'),
+      '#default_value' => $session->get('session_example.name', ''),
+    ];
+    $form['email'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Email'),
+      '#placeholder' => $this->t('Your email address.'),
+      '#default_value' => $session->get('session_example.email', ''),
+    ];
+    $form['quest'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Quest'),
+      '#placeholder' => $this->t('What is your quest?'),
+      '#default_value' => $session->get('session_example.quest', ''),
+    ];
+    $form['color'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Favorite Color'),
+      '#options' => [
+        '' => $this->t('--'),
+        'red' => $this->t('Red'),
+        'blue' => $this->t('Blue'),
+        'yellow' => $this->t('Yellow'),
+        'argggh' => $this->t('Argggghhh!!'),
+      ],
+      '#default_value' => $session->get('session_example.color', ''),
+      '#description' => $this->t('What is your favorite color?'),
+    ];
+    $form['save'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Save'),
+    ];
+    $form['reset'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Clear Session'),
+      '#submit' => ['::submitClearSession']
+    ];
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $this->setSessionKeyIfChanged('session_example.name', $form_state->getValue('name'));
+    $this->setSessionKeyIfChanged('session_example.email', $form_state->getValue('email'));
+    $this->setSessionKeyIfChanged('session_example.quest', $form_state->getValue('quest'));
+    $this->setSessionKeyIfChanged('session_example.color', $form_state->getValue('color'));
+    $link = $this->link_generator->generate($this->t('Check here'), Url::fromRoute('session_example.view'));
+    drupal_set_message($this->t('The session has been saved successfully. @link', ['@link' => $link]));
+  }
+
+  /**
+   * Since we're using placeholders, do not write over an empty session key for an empty field.
+   */
+  protected function setSessionKeyIfChanged($key, $value) {
+    $session = $this->getExampleSession();
+    $old = $session->get($key, '');
+    if ($value !== $old) {
+      $session->set($key, $value);
+    }
+  }
+
+  /**
+   * Clears the name and email session.
+   */
+  public function submitClearSession(array &$form, FormStateInterface $form_state) {
+    $session = $this->getExampleSession();
+    $session->remove('session_example.name');
+    $session->remove('session_example.email');
+    $session->remove('session_example.quest');
+    $session->remove('session_example.color');
+    drupal_set_message($this->t('Session is cleared.'));
+  }
+}
diff --git a/session_example/src/Tests/SessionExampleTest.php b/session_example/src/Tests/SessionExampleTest.php
new file mode 100644
index 0000000..36d0a4f
--- /dev/null
+++ b/session_example/src/Tests/SessionExampleTest.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * @file
+ * Test cases for Session Example Module.
+ */
+
+namespace Drupal\session_example\Tests;
+
+use Drupal\simpletest\WebTestBase;
+use Drupal\block\Tests\BlockTestBase;
+
+/**
+ * Tests the basic functions of the Session Example module.
+ *
+ * @package Drupal\session_example\Tests
+ *
+ * @ingroup session_example
+ *
+ * @group session_example
+ * @group examples
+ */
+class SessionExampleTest extends WebTestBase {
+  public static $modules = array('session_example', 'block');
+
+  /**
+   * Basic tests for Session Example.
+   */
+  public function testSessionExample() {
+
+    $this->drupalPlaceBlock('local_tasks_block', array('region' => 'content'));
+    $this->drupalPlaceBlock('system_menu_block:tools', array());
+    $this->drupalGet('');
+    $this->assertLink(t('Session Example'));
+
+
+    $this->clickLink(t('Session Example'));
+    $this->assertRaw('placeholder="Your name."', 'Name placeholder contains Your name');
+    $this->assertRaw('placeholder="Your email address."', 'Email placeholder contains Your email address.');
+    $this->assertRaw('placeholder="What is your quest?"', 'Name placeholder contains What is your quest?');
+
+    $this->clickLink(t('View'));
+    $this->assertText('No Name');
+    $this->assertText('No EMail');
+    $this->assertText('No Quest');
+    $this->assertText('No Color');
+
+    $this->clickLink(t('Form'));
+    $this->drupalPostForm(NULL, array(), t('Save'));
+    $this->assertText('The session has been saved successfully.');
+    $this->assertLink(t('Check here'));
+
+    $this->clickLink(t('Check here'));
+    $this->assertText('No Name');
+    $this->assertText('No EMail');
+    $this->assertText('No Quest');
+    $this->assertText('No Color');
+
+    $form_data = [
+      'name' => 'Sir Lancelot',
+      // 'quest ' => 'To seek the Grail',
+      'color'  => 'blue',
+    ];
+    $this->clickLink(t('Form'));
+    $this->drupalPostForm(NULL, $form_data, t('Save'));
+
+    $this->clickLink(t('Check here'));
+    $this->assertText('Sir Lancelot');
+    // $this->assertText('To seek the Grail');
+    $this->assertText('blue');
+
+    $this->clickLink(t('Form'));
+    $this->drupalPostForm(NULL, array(), t('Clear Session'));
+    $this->assertText('Session is cleared.');
+
+    $this->clickLink(t('View'));
+    $this->assertText('No Name');
+    $this->assertText('No EMail');
+
+  }
+
+}
