diff --git a/views_example/config/install/views.view.views_example.yml b/views_example/config/install/views.view.views_example.yml
new file mode 100644
index 0000000..7ad8445
--- /dev/null
+++ b/views_example/config/install/views.view.views_example.yml
@@ -0,0 +1,433 @@
+uuid: 9938c742-df7c-43af-8260-967faae49a27
+langcode: en
+status: true
+dependencies:
+  module:
+    - views_example
+id: views_example
+label: 'Views example'
+module: views
+description: 'Example view showing entries from views_example_table.'
+tag: ''
+base_table: views_example_table
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    provider: views
+    display_options:
+      access:
+        type: none
+        options: {  }
+        provider: views
+        dependencies: {  }
+      cache:
+        type: none
+        options: {  }
+        provider: views
+        dependencies: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: false
+          query_tags: {  }
+        provider: views
+        dependencies: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+        provider: views
+        dependencies: {  }
+      pager:
+        type: full
+        options:
+          items_per_page: 10
+          offset: 0
+          id: 0
+          total_pages: null
+          expose:
+            items_per_page: false
+            items_per_page_label: 'Items per page'
+            items_per_page_options: '5, 10, 25, 50'
+            items_per_page_options_all: false
+            items_per_page_options_all_label: '- All -'
+            offset: false
+            offset_label: Offset
+          tags:
+            previous: '‹ previous'
+            next: 'next ›'
+            first: '« first'
+            last: 'last »'
+          quantity: 9
+      style:
+        type: table
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          override: true
+          sticky: false
+          caption: ''
+          summary: ''
+          description: ''
+          columns:
+            string: string
+            boolean: boolean
+            number: number
+            serialized: serialized
+            timestamp: timestamp
+          info:
+            string:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            boolean:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            number:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            serialized:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            timestamp:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+          default: '-1'
+          empty_table: false
+        provider: views
+      row:
+        type: fields
+      fields:
+        string:
+          table: views_example_table
+          field: string
+          id: string
+          relationship: none
+          group_type: group
+          admin_label: ''
+          dependencies: {  }
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: ''
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+        boolean:
+          id: boolean
+          table: views_example_table
+          field: boolean
+          relationship: none
+          group_type: group
+          admin_label: ''
+          dependencies:
+            module:
+              - views
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: ''
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          type: unicode-yes-no
+          type_custom_true: ''
+          type_custom_false: ''
+          not: '0'
+          plugin_id: boolean
+          provider: views
+        number:
+          id: number
+          table: views_example_table
+          field: number
+          relationship: none
+          group_type: group
+          admin_label: ''
+          dependencies:
+            module:
+              - views
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: ''
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          set_precision: false
+          precision: 0
+          decimal: .
+          separator: ','
+          format_plural: false
+          format_plural_singular: '1'
+          format_plural_plural: '@count'
+          prefix: ''
+          suffix: ''
+          plugin_id: numeric
+          provider: views
+        serialized:
+          id: serialized
+          table: views_example_table
+          field: serialized
+          relationship: none
+          group_type: group
+          admin_label: ''
+          dependencies:
+            module:
+              - views
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: ''
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          format: unserialized
+          key: ''
+          plugin_id: serialized
+          provider: views
+        timestamp:
+          id: timestamp
+          table: views_example_table
+          field: timestamp
+          relationship: none
+          group_type: group
+          admin_label: ''
+          dependencies:
+            module:
+              - views
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: ''
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          date_format: html_date
+          custom_date_format: ''
+          timezone: ''
+          plugin_id: date
+          provider: views
+      filters: {  }
+      sorts: {  }
+      title: 'Views example view'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      field_langcode: '***LANGUAGE_language_content***'
+      field_langcode_add_to_query: null
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: 1
+    provider: views
+    display_options:
+      field_langcode: '***LANGUAGE_language_content***'
+      field_langcode_add_to_query: null
+      path: examples/views_example/views-example
diff --git a/views_example/views_example.info.yml b/views_example/views_example.info.yml
new file mode 100644
index 0000000..abdccfe
--- /dev/null
+++ b/views_example/views_example.info.yml
@@ -0,0 +1,9 @@
+name: Views Example Module
+description: Code examples for views module.
+package: Example modules
+type: module
+version: 1.0
+core: 8.x
+dependencies:
+  - views
+  - examples
\ No newline at end of file
diff --git a/views_example/views_example.install b/views_example/views_example.install
new file mode 100644
index 0000000..269b2a5
--- /dev/null
+++ b/views_example/views_example.install
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Implements hook_schema().
+ */
+function views_example_schema() {
+  $schema['views_example_table'] = array(
+    'description' => 'The base table for views example.',
+    'fields' => array(
+      'nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE
+      ),
+      'string' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'number' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0
+      ),
+      'boolean' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0
+      ),
+      'timestamp' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0
+      ),
+      'serialized' => array(
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+      ),
+    ),
+    'foreign keys' => array(
+      'node' => array(
+        'table' => 'node',
+        'columns' => array('nid' => 'nid'),
+      ),
+     ),
+    'primary key' => array('nid'),
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_install().
+ */
+function views_example_install() {
+  db_insert('views_example_table')
+    ->fields(array(
+      'nid' => 1,
+      'string' => 'Test string',
+      'number' => 99,
+      'boolean' => 1,
+      'timestamp' => time(),
+      'serialized' => serialize(array('serialized' => 'field', 'unserialized' => 'display'))))
+    ->execute();
+}
diff --git a/views_example/views_example.views.inc b/views_example/views_example.views.inc
new file mode 100644
index 0000000..d808ae7
--- /dev/null
+++ b/views_example/views_example.views.inc
@@ -0,0 +1,231 @@
+<?php
+
+/**
+ * Implements hook_views_data().
+ */
+function views_example_views_data() {
+  // Define the return array.
+  $data = array();
+
+  // The outermost keys of $data are Views table names, which should usually
+  // be the same as the hook_schema() table names.
+  $data['views_example_table'] = array();
+
+  // The value corresponding to key 'table' gives properties of the table
+  // itself.
+  $data['views_example_table']['table'] = array();
+
+  // Within 'table', the value of 'group' (translated string) is used as a
+  // prefix in Views UI for this table's fields, filters, etc. When adding
+  // a field, filter, etc. you can also filter by the group.
+  $data['views_example_table']['table']['group'] = t('Examples');
+
+  // Some tables are "base" tables, meaning that they can be the base tables
+  // for views. Non-base tables can only be brought in via relationships in
+  // views based on other tables. To define a table to be a base table, add
+  // key 'base' to the 'table' array:
+  $data['views_example_table']['table']['base'] = array(
+    // Identifier (primary) field in this table for Views.
+    'field' => 'nid',
+    // Label in the UI.
+    'title' => t('Views example table'),
+    // Longer description in the UI. Required.
+    'help' => t('Example table contains example content and can be related to nodes.'),
+    'weight' => -10,
+  );
+
+  // Some tables have an implicit, automatic relationship to other tables,
+  // meaning that when the other table is available in a view (either as the
+  // base table or through a relationship), this table's fields, filters, etc.
+  // are automatically made available without having to add an additional
+  // relationship. To define an implicit relationship that will make your
+  // table automatically available when another table is present, add a 'join'
+  // section to your 'table' section. Note that it is usually only a good idea
+  // to do this for one-to-one joins, because otherwise your automatic join
+  // will add more rows to the view. It is also not a good idea to do this if
+  // most views won't need your table -- if that is the case, define a
+  // relationship instead (see the field section below).
+  //
+  // If you've decided an automatic join is a good idea, here's how to do it:
+  $data['views_example_table']['table']['join'] = array(
+    // Within the 'join' section, list one or more tables to automatically
+    // join to. In this example, every time 'node' is available in a view,
+    // 'views_example_table' will be too. The array keys here are the array keys
+    // for the other tables, given in their hook_views_data() implementations.
+    // If the table listed here is from another module's hook_views_data()
+    // implementation, make sure your module depends on that other module.
+    'node' => array(
+      // Primary key field in node to use in the join.
+      'left_field' => 'nid',
+      // Foreign key field in views_example_table to use in the join.
+      'field' => 'nid',
+    ),
+  );
+
+  // Other array elements at the top level of your table's array describe
+  // individual database table fields made available to Views. The array keys
+  // are the names (unique within the table) used by Views for the fields,
+  // usually equal to the database field names.
+  //
+  // Each field entry must have the following elements:
+  // - title: Translated label for the field in the UI.
+  // - help: Description of the field in the UI.
+  //
+  // Each field entry may also have one or more of the following elements,
+  // describing "handlers" (plugins) for the field:
+  // - relationship: Specifies a handler that allows this field to be used
+  //   to define a relationship to another table in Views.
+  // - field: Specifies a handler to make it available to Views as a field.
+  // - filter: Specifies a handler to make it available to Views as a filter.
+  // - sort: Specifies a handler to make it available to Views as a sort.
+  // - argument: Specifies a handler to make it available to Views as an
+  //   argument, or contextual filter as it is known in the UI.
+  // - area: Specifies a handler to make it available to Views to add content
+  //   to the header, footer, or as no result behavior.
+  //
+  // Note that when specifying handlers, you must give the handler plugin ID
+  // and you may also specify overrides for various settings that make up the
+  // plugin definition. See examples below; the Boolean example demonstrates
+  // setting overrides.
+
+  // Node ID field, exposed as relationship only, since it is a foreign key
+  // in this table.
+  $data['views_example_table']['nid'] = array(
+    'title' => t('Node'),
+    'help' => t('Relate views_example_table content to the node content'),
+
+    // Define a relationship to the node table, so views whose base table is
+    // views_example_table can add a relationship to the node table. To make a
+    // relationship in the other direction, you can:
+    // - Use hook_views_data_alter() -- see the function body example on that
+    //   hook for details.
+    // - Use the implicit join method described above.
+    'relationship' => array(
+      // Views name of the table to join to for the relationship.
+      'base' => 'node',
+      // Database field name in the other table to join on.
+      'base field' => 'nid',
+      // ID of relationship handler plugin to use.
+      'id' => 'standard',
+      // Default label for relationship in the UI.
+      'label' => t('Example node'),
+    ),
+  );
+
+  // Plain text field, exposed as a field, sort, filter, and argument.
+  $data['views_example_table']['string'] = array(
+    'title' => t('String'),
+    'help' => t('Simple string field.'),
+
+    'field' => array(
+      // ID of field handler plugin to use.
+      'id' => 'standard',
+    ),
+
+    'sort' => array(
+      // ID of sort handler plugin to use.
+      'id' => 'standard',
+    ),
+
+    'filter' => array(
+      // ID of filter handler plugin to use.
+      'id' => 'string',
+    ),
+
+    'argument' => array(
+      // ID of argument handler plugin to use.
+      'id' => 'string',
+    ),
+  );
+
+  // Numeric field, exposed as a field, sort, filter, and argument.
+  $data['views_example_table']['number'] = array(
+    'title' => t('Number'),
+    'help' => t('Just a numeric field.'),
+
+    'field' => array(
+      // ID of field handler plugin to use.
+      'id' => 'numeric',
+    ),
+
+    'sort' => array(
+      // ID of sort handler plugin to use.
+      'id' => 'standard',
+    ),
+
+    'filter' => array(
+      // ID of filter handler plugin to use.
+      'id' => 'numeric',
+    ),
+
+    'argument' => array(
+      // ID of argument handler plugin to use.
+      'id' => 'numeric',
+    ),
+  );
+
+  // Boolean field, exposed as a field, sort, and filter. The filter section
+  // illustrates overriding various settings.
+  $data['views_example_table']['boolean'] = array(
+    'title' => t('Boolean'),
+    'help' => t('Just an on/off field.'),
+
+    'field' => array(
+      // ID of field handler plugin to use.
+      'id' => 'boolean',
+    ),
+
+    'sort' => array(
+      // ID of sort handler plugin to use.
+      'id' => 'standard',
+    ),
+
+    'filter' => array(
+      // ID of filter handler plugin to use.
+      'id' => 'boolean',
+      // Override the generic field title, so that the filter uses a different
+      // label in the UI.
+      'label' => t('Published'),
+      // Override the default BooleanOperator filter handler's 'type' setting,
+      // to display this as a "Yes/No" filter instead of a "True/False" filter.
+      'type' => 'yes-no',
+      // Override the default Boolean filter handler's 'use_equal' setting, to
+      // make the query use 'boolean_field = 1' instead of 'boolean_field <> 0'.
+      'use_equal' => TRUE,
+    ),
+  );
+
+  // Integer timestamp field, exposed as a field, sort, and filter.
+  $data['views_example_table']['timestamp'] = array(
+    'title' => t('Timestamp'),
+    'help' => t('Just a timestamp field.'),
+
+    'field' => array(
+      // ID of field handler plugin to use.
+      'id' => 'date',
+    ),
+
+    'sort' => array(
+      // ID of sort handler plugin to use.
+      'id' => 'date',
+    ),
+
+    'filter' => array(
+      // ID of filter handler plugin to use.
+      'id' => 'date',
+    ),
+  );
+
+  // Integer timestamp field, exposed as a field, sort, and filter.
+  $data['views_example_table']['serialized'] = array(
+    'title' => t('Serialized'),
+    'help' => t('Just a serialized field.'),
+
+    'field' => array(
+      // ID of field handler plugin to use.
+      'id' => 'serialized',
+    ),
+  );
+
+  return $data;
+}
