diff --git a/modules/simplenews_demo/config/install/block.block.simplenewssubscription.yml b/modules/simplenews_demo/config/install/block.block.simplenewssubscription.yml
new file mode 100644
index 0000000..5c6e329
--- /dev/null
+++ b/modules/simplenews_demo/config/install/block.block.simplenewssubscription.yml
@@ -0,0 +1,26 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - simplenews
+  theme:
+    - bartik
+id: simplenewssubscription
+theme: bartik
+region: sidebar_first
+weight: -7
+provider: null
+plugin: simplenews_subscription_block
+settings:
+  id: simplenews_subscription_block
+  label: 'Simplenews subscription'
+  provider: simplenews
+  label_display: visible
+  cache:
+    max_age: 0
+    contexts: {  }
+  newsletters:
+    default: default
+  message: 'Stay informed - subscribe to our newsletter.'
+  unique_id: dbbcae7b-bb10-4cf8-8c3d-61e4990109b5
+visibility: {  }
diff --git a/modules/simplenews_demo/config/install/block.block.simplenewssubscription_all.yml b/modules/simplenews_demo/config/install/block.block.simplenewssubscription_all.yml
new file mode 100644
index 0000000..ffc1423
--- /dev/null
+++ b/modules/simplenews_demo/config/install/block.block.simplenewssubscription_all.yml
@@ -0,0 +1,29 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - simplenews
+  theme:
+    - bartik
+id: simplenewssubscription_all
+theme: bartik
+region: sidebar_first
+weight: -7
+provider: null
+plugin: simplenews_subscription_block
+settings:
+  id: simplenews_subscription_block
+  label: 'Simplenews multiple subscriptions'
+  provider: simplenews
+  label_display: visible
+  cache:
+    max_age: 0
+    contexts: {  }
+  newsletters:
+    weekly_content_update: weekly_content_update
+    special_offers: special_offers
+    press_releases: press_releases
+    default: default
+  message: 'Stay informed - subscribe to our newsletters.'
+  unique_id: d74b88af-9f36-4c5b-8122-34538c6b172c
+visibility: {  }
diff --git a/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_city.yml b/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_city.yml
new file mode 100644
index 0000000..998e624
--- /dev/null
+++ b/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_city.yml
@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.simplenews_subscriber.field_city
+id: simplenews_subscriber.simplenews_subscriber.field_city
+field_name: field_city
+entity_type: simplenews_subscriber
+bundle: simplenews_subscriber
+label: City
+description: ''
+required: false
+translatable: false
+default_value:
+  -
+    value: ''
+default_value_callback: ''
+settings: {  }
+field_type: string
diff --git a/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_first_name.yml b/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_first_name.yml
new file mode 100644
index 0000000..cbe0e92
--- /dev/null
+++ b/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_first_name.yml
@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.simplenews_subscriber.field_first_name
+id: simplenews_subscriber.simplenews_subscriber.field_first_name
+field_name: field_first_name
+entity_type: simplenews_subscriber
+bundle: simplenews_subscriber
+label: 'First name'
+description: ''
+required: false
+translatable: false
+default_value:
+  -
+    value: ''
+default_value_callback: ''
+settings: {  }
+field_type: string
diff --git a/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_last_name.yml b/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_last_name.yml
new file mode 100644
index 0000000..885cbe6
--- /dev/null
+++ b/modules/simplenews_demo/config/install/field.field.simplenews_subscriber.simplenews_subscriber.field_last_name.yml
@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.simplenews_subscriber.field_last_name
+id: simplenews_subscriber.simplenews_subscriber.field_last_name
+field_name: field_last_name
+entity_type: simplenews_subscriber
+bundle: simplenews_subscriber
+label: 'Last name'
+description: ''
+required: false
+translatable: false
+default_value:
+  -
+    value: ''
+default_value_callback: ''
+settings: {  }
+field_type: string
diff --git a/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_city.yml b/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_city.yml
new file mode 100644
index 0000000..cb9e8ea
--- /dev/null
+++ b/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_city.yml
@@ -0,0 +1,18 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - simplenews
+id: simplenews_subscriber.field_city
+field_name: field_city
+entity_type: simplenews_subscriber
+type: string
+settings:
+  max_length: 50
+  case_sensitive: false
+module: core
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
diff --git a/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_first_name.yml b/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_first_name.yml
new file mode 100644
index 0000000..a085daf
--- /dev/null
+++ b/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_first_name.yml
@@ -0,0 +1,18 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - simplenews
+id: simplenews_subscriber.field_first_name
+field_name: field_first_name
+entity_type: simplenews_subscriber
+type: string
+settings:
+  max_length: 50
+  case_sensitive: false
+module: core
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
diff --git a/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_last_name.yml b/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_last_name.yml
new file mode 100644
index 0000000..fec648f
--- /dev/null
+++ b/modules/simplenews_demo/config/install/field.storage.simplenews_subscriber.field_last_name.yml
@@ -0,0 +1,18 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - simplenews
+id: simplenews_subscriber.field_last_name
+field_name: field_last_name
+entity_type: simplenews_subscriber
+type: string
+settings:
+  max_length: 50
+  case_sensitive: false
+module: core
+locked: false
+cardinality: 1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
diff --git a/modules/simplenews_demo/config/install/simplenews.newsletter.press_releases.yml b/modules/simplenews_demo/config/install/simplenews.newsletter.press_releases.yml
new file mode 100644
index 0000000..9584d31
--- /dev/null
+++ b/modules/simplenews_demo/config/install/simplenews.newsletter.press_releases.yml
@@ -0,0 +1,16 @@
+id: press_releases
+name: 'Press releases'
+description: 'This is the press release.'
+format: plain
+priority: 0
+receipt: 0
+from_name: ''
+subject: '[[simplenews-newsletter:name]] [node:title]'
+from_address: 'replace@example.org'
+hyperlinks: 1
+new_account: none
+opt_inout: double
+weight: 0
+status: true
+langcode: en
+dependencies: {  }
diff --git a/modules/simplenews_demo/config/install/simplenews.newsletter.special_offers.yml b/modules/simplenews_demo/config/install/simplenews.newsletter.special_offers.yml
new file mode 100644
index 0000000..f05e7b4
--- /dev/null
+++ b/modules/simplenews_demo/config/install/simplenews.newsletter.special_offers.yml
@@ -0,0 +1,16 @@
+id: special_offers
+name: 'Special offers'
+description: 'Special offers newsletter.'
+format: plain
+priority: 0
+receipt: 0
+from_name: ''
+subject: '[[simplenews-newsletter:name]] [node:title]'
+from_address: 'replace@example.org'
+hyperlinks: 1
+new_account: none
+opt_inout: double
+weight: 0
+status: true
+langcode: en
+dependencies: {  }
diff --git a/modules/simplenews_demo/config/install/simplenews.newsletter.weekly_content.yml b/modules/simplenews_demo/config/install/simplenews.newsletter.weekly_content.yml
new file mode 100644
index 0000000..8f07cb2
--- /dev/null
+++ b/modules/simplenews_demo/config/install/simplenews.newsletter.weekly_content.yml
@@ -0,0 +1,16 @@
+id: weekly_content_update
+name: 'Weekly content update'
+description: 'Weekly content update newsletter.'
+format: plain
+priority: 0
+receipt: 0
+from_name: ''
+subject: '[[simplenews-newsletter:name]] [node:title]'
+from_address: 'replace@example.org'
+hyperlinks: 1
+new_account: none
+opt_inout: double
+weight: 0
+status: true
+langcode: en
+dependencies: {  }
diff --git a/modules/simplenews_demo/simplenews_demo.info.yml b/modules/simplenews_demo/simplenews_demo.info.yml
new file mode 100644
index 0000000..80e2519
--- /dev/null
+++ b/modules/simplenews_demo/simplenews_demo.info.yml
@@ -0,0 +1,9 @@
+description: Demo module for simplenews.
+core: 8.x
+dependencies:
+  - simplenews
+  - simplenews_scheduler
+hidden: false
+name: Simplenews demo
+package: Simplenews
+type: module
diff --git a/modules/simplenews_demo/simplenews_demo.install b/modules/simplenews_demo/simplenews_demo.install
new file mode 100644
index 0000000..117e910
--- /dev/null
+++ b/modules/simplenews_demo/simplenews_demo.install
@@ -0,0 +1,203 @@
+<?php
+use Drupal\node\Entity\Node;
+use Drupal\simplenews\Entity\Newsletter;
+use Drupal\user\Entity\User;
+
+/**
+ * @file
+ * Simplenews_demo base install file.
+ */
+
+
+/*
+ * Implements hook_install().
+ *
+ * Declares initial configuration for simplenews_demo.
+ */
+function simplenews_demo_install() {
+
+  \Drupal::service('router.builder')->rebuild();
+  module_load_include('inc', 'simplenews', 'includes/simplenews.mail');
+
+  // Set the default values for test_address, from_address and from_name.
+  $site_mail = \Drupal::config('system.site')->get('mail');
+  $site_name = \Drupal::config('system.site')->get('name');
+
+  // Init the demo newsletter.
+  $newsletters = Newsletter::loadMultiple();
+  foreach ($newsletters as $newsletter) {
+    $newsletter->from_name = $site_name;
+    $newsletter->from_address = $site_mail;
+    $newsletter->save();
+  }
+
+  // add subscriber fields to the form display.
+  entity_get_form_display('simplenews_subscriber', 'simplenews_subscriber', 'default')
+    ->setComponent('field_first_name', array(
+      'type' => 'string_textfield',
+      'weight' => '2',
+      'settings' => array(
+        'size' => 60,
+        'placeholder' => ''
+      ),
+      'third_party_settings' => array(),
+    ))
+    ->setComponent('field_last_name', array(
+      'type' => 'string_textfield',
+      'weight' => '3',
+      'settings' => array(
+        'size' => 60,
+        'placeholder' => ''
+      ),
+      'third_party_settings' => array(),
+    ))
+    ->setComponent('field_city', array(
+      'type' => 'string_textfield',
+      'weight' => '4',
+      'settings' => array(
+        'size' => 60,
+        'placeholder' => ''
+      ),
+      'third_party_settings' => array(),
+    ))
+    ->save();
+
+  // Create some subscribers.
+  // Subscriber subscribed to only one newsletter.
+  simplenews_subscribe('a@example.com', $newsletters['special_offers']->id(), FALSE);
+  // Subscriber subscribed to all newsletters.
+  simplenews_subscribe('b@example.com', $newsletters['special_offers']->id(), FALSE);
+  simplenews_subscribe('b@example.com', $newsletters['press_releases']->id(), FALSE);
+  simplenews_subscribe('b@example.com', $newsletters['weekly_content_update']->id(), FALSE);
+  // Unsubscribed subscriber.
+  simplenews_subscribe('c@example.com', $newsletters['press_releases']->id(), FALSE);
+  simplenews_unsubscribe('c@example.com', $newsletters['press_releases']->id(), FALSE);
+
+  // Create a demo user.
+  $demo_user = User::create(array(
+    'name' => 'demo user',
+    'mail' => 'demouser@example.com',
+    'status' => FALSE,
+  ));
+  $demo_user->activate();
+  $demo_user->save();
+  // subscribe user to both newsletters.
+  simplenews_subscribe($demo_user->getEmail(), $newsletters['press_releases']->id(), FALSE);
+  simplenews_subscribe($demo_user->getEmail(), $newsletters['special_offers']->id(), FALSE);
+
+  // Create an issue for scheduled sending.
+  $scheduled_issue = Node::create(array(
+    'type' => 'simplenews_issue',
+    'id' => 'simplenews_issue_scheduled',
+    'title' => 'Scheduled weekly content newsletter issue',
+    'body' => 'Scheduled weekly content newsletter issue will be sent to subscribers every week',
+    'created' => time(),
+    'uid' => 0,
+    'status' => 1,
+    'simplenews_issue' => array(
+      'target_id' => 'weekly_content_update',
+      'handler' => 'simplenews_all',
+      'handler_settings' => array()
+    ),
+  ));
+  $scheduled_issue->save();
+  // Write a record for the demo newsletter scheduler configuration.
+  $nid = $scheduled_issue->id();
+  $record = array(
+    'nid' => $nid,
+    'next_run' => strtotime('yesterday, 8:00'),
+    'activated' => 1,
+    'send_interval' => 'week',
+    'interval_frequency' => 1,
+    'start_date' => strtotime('yesterday, 8:00'),
+    'stop_type' => 0,
+    'stop_date' => 0,
+    'stop_edition' => 0,
+    'title' => '[node:title] - [node:created:custom:\W\e\e\k W,Y ]',
+  );
+
+  // Update scheduler record.
+  db_merge('simplenews_scheduler')
+    ->key(array(
+      'nid' => $nid,
+    ))
+    ->fields($record)
+    ->execute();
+
+  // A newsletter to send.
+  $node = Node::create(array(
+    'type' => 'simplenews_issue',
+    'id' => 'simplenews_issue_sent',
+    'title' => 'Sent press releases',
+    'body' => 'This press release is already sent to subscribers!',
+    'uid' => 0,
+    'status' => 1,
+    'simplenews_issue' => array(
+      'target_id' => 'press_releases',
+      'handler' => 'simplenews_all',
+      'handler_settings' => array()
+    ),
+  ));
+  $node->save();
+  // Send the node.
+  simplenews_add_node_to_spool($node);
+  $node->save();
+  // Send mails.
+  simplenews_mail_spool();
+  // Run cron.
+  \Drupal::service('cron')->run();
+  // Update send status of newsletter issues.
+  simplenews_send_status_update();
+
+  // Create a newsletter issues with different send status.
+  // Published newsletter, not yet sent.
+  $node = Node::create(array(
+    'type' => 'simplenews_issue',
+    'id' => 'simplenews_issue_pending',
+    'title' => 'Pending special offers',
+    'body' => 'Grab them while you can, limited availability! These offers can often only be available for a short time, so take advantage of these special prices while you can.',
+    'uid' => 0,
+    'status' => 1,
+    'simplenews_issue' => array(
+      'target_id' => 'special_offers',
+      'handler' => 'simplenews_all',
+      'handler_settings' => array()
+    ),
+  ));
+  $node->save();
+  simplenews_issue_update_sent_status($node, SIMPLENEWS_STATUS_SEND_PENDING);
+
+  // Unpublished newsletter.
+  $node = Node::create(array(
+    'type' => 'simplenews_issue',
+    'id' => 'simplenews_issue_unpublished',
+    'title' => 'Unpublished press releases',
+    'body' => 'Unpublished press releases body',
+    'uid' => 0,
+    'status' => 0,
+    'simplenews_issue' => array(
+      'target_id' => 'press_releases',
+      'handler' => 'simplenews_all',
+      'handler_settings' => array()
+    ),
+  ));
+  $node->save();
+  simplenews_issue_update_sent_status($node, SIMPLENEWS_STATUS_SEND_PUBLISH);
+
+  // Newsletter that is stopped sending.
+  $node = Node::create(array(
+    'type' => 'simplenews_issue',
+    'id' => 'simplenews_issue_stopped',
+    'title' => 'Stopped special offers',
+    'body' => 'Upcoming special offers!',
+    'uid' => 0,
+    'status' => 1,
+    'simplenews_issue' => array(
+      'target_id' => 'special_offers',
+      'handler' => 'simplenews_all',
+      'handler_settings' => array()
+    ),
+  ));
+  $node->save();
+  simplenews_issue_update_sent_status($node, SIMPLENEWS_STATUS_SEND_NOT);
+}
