diff --git a/rest_example/config/install/node.type.rest_example_test.yml b/rest_example/config/install/node.type.rest_example_test.yml
new file mode 100644
index 0000000..ad134a0
--- /dev/null
+++ b/rest_example/config/install/node.type.rest_example_test.yml
@@ -0,0 +1,17 @@
+uuid: 193dbae8-6c06-48bd-b70c-123356112304
+langcode: en
+status: true
+dependencies:
+  module:
+    - menu_ui
+name: 'Rest Example Test'
+type: rest_example_test
+description: 'This content is created through the REST API'
+help: ''
+new_revision: false
+preview_mode: 0
+display_submitted: false
+third_party_settings:
+  menu_ui:
+    available_menus: {  }
+    parent: 'main:'
diff --git a/rest_example/config/install/views.view.rest_service.yml b/rest_example/config/install/views.view.rest_service.yml
new file mode 100644
index 0000000..1846474
--- /dev/null
+++ b/rest_example/config/install/views.view.rest_service.yml
@@ -0,0 +1,938 @@
+uuid: f246767d-dff1-4377-b000-f6fcf854087d
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+  module:
+    - field
+    - node
+    - rest
+    - text
+    - user
+id: rest_service
+label: 'REST Service'
+module: views
+description: ''
+tag: ''
+base_table: node
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'restful get entity:node'
+      cache:
+        type: none
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: false
+          query_tags: {  }
+      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
+      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: serializer
+      row:
+        type: fields
+        options:
+          inline: {  }
+          separator: ''
+          hide_empty: false
+          default_field_elements: true
+      fields:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: false
+            ellipsis: false
+            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
+          link_to_node: false
+          entity_type: node
+          entity_field: title
+          plugin_id: node
+        uid:
+          id: uid
+          table: node_field_data
+          field: uid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          link_to_user: false
+          entity_type: node
+          entity_field: uid
+          plugin_id: user
+        created:
+          id: created
+          table: node_field_data
+          field: created
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: fallback
+          custom_date_format: ''
+          timezone: ''
+          entity_type: node
+          entity_field: created
+          plugin_id: date
+        body:
+          id: body
+          table: node__body
+          field: body
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          click_sort_column: value
+          type: text_default
+          settings: {  }
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: all
+          delta_offset: '0'
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          plugin_id: field
+        changed:
+          id: changed
+          table: node_field_data
+          field: changed
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: fallback
+          custom_date_format: ''
+          timezone: ''
+          entity_type: node
+          entity_field: changed
+          plugin_id: date
+        view_node:
+          id: view_node
+          table: node
+          field: view_node
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          text: ''
+          entity_type: node
+          plugin_id: node_link
+        delete_node:
+          id: delete_node
+          table: node
+          field: delete_node
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          text: ''
+          entity_type: node
+          plugin_id: node_link_delete
+        edit_node:
+          id: edit_node
+          table: node
+          field: edit_node
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          text: ''
+          entity_type: node
+          plugin_id: node_link_edit
+        nid:
+          id: nid
+          table: node_field_data
+          field: nid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: ''
+          entity_type: node
+          entity_field: nid
+          plugin_id: numeric
+        status:
+          id: status
+          table: node_field_data
+          field: status
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: yes-no
+          type_custom_true: ''
+          type_custom_false: ''
+          not: '0'
+          entity_type: node
+          entity_field: status
+          plugin_id: boolean
+        vid:
+          id: vid
+          table: node_field_data
+          field: vid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: ''
+          entity_type: node
+          entity_field: vid
+          plugin_id: numeric
+        sticky:
+          id: sticky
+          table: node_field_data
+          field: sticky
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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: yes-no
+          type_custom_true: ''
+          type_custom_false: ''
+          not: '0'
+          entity_type: node
+          entity_field: sticky
+          plugin_id: boolean
+        type:
+          id: type
+          table: node_field_data
+          field: type
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          link_to_node: false
+          machine_name: '0'
+          entity_type: node
+          entity_field: type
+          plugin_id: node_type
+        uuid:
+          id: uuid
+          table: node
+          field: uuid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          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
+          entity_type: node
+          entity_field: uuid
+          plugin_id: standard
+      filters: {  }
+      sorts:
+        created:
+          id: created
+          table: node_field_data
+          field: created
+          order: DESC
+          entity_type: node
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments:
+        nid:
+          id: nid
+          table: node_field_data
+          field: nid
+          relationship: none
+          group_type: group
+          admin_label: 'Node ID filter'
+          default_action: ignore
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: false
+          title: ''
+          default_argument_type: fixed
+          default_argument_options:
+            argument: ''
+          default_argument_skip_url: false
+          summary_options:
+            base_path: ''
+            count: true
+            items_per_page: 25
+            override: false
+          summary:
+            sort_order: asc
+            number_of_records: 0
+            format: default_summary
+          specify_validation: true
+          validate:
+            type: 'entity:node'
+            fail: empty
+          validate_options:
+            operation: view
+            multiple: '1'
+            bundles: {  }
+            access: 0
+          break_phrase: false
+          not: false
+          entity_type: node
+          entity_field: nid
+          plugin_id: numeric
+      display_extenders: {  }
+      field_langcode: '***LANGUAGE_language_content***'
+      field_langcode_add_to_query: null
+      title: 'Node index'
+  rest_export_1:
+    display_plugin: rest_export
+    id: rest_export_1
+    display_title: 'REST export'
+    position: 1
+    display_options:
+      display_extenders: {  }
+      field_langcode: '***LANGUAGE_language_content***'
+      field_langcode_add_to_query: null
+      path: rest/node
+      pager:
+        type: none
+        options:
+          offset: 0
+      style:
+        type: serializer
+        options:
+          grouping: {  }
+          uses_fields: false
+          formats: {  }
+      row:
+        type: data_field
+        options:
+          field_options:
+            title:
+              alias: ''
+              raw_output: false
diff --git a/rest_example/rest_example.info.yml b/rest_example/rest_example.info.yml
new file mode 100644
index 0000000..b2ea60f
--- /dev/null
+++ b/rest_example/rest_example.info.yml
@@ -0,0 +1,11 @@
+name: REST Example
+type: module
+description: An example outlining how a module can use the RESTful Web Services to communicate with another Drupal instance.
+package: Example modules
+core: 8.x
+dependencies:
+  - rest
+  - basic_auth
+  - hal
+  - views
+  - examples
diff --git a/rest_example/rest_example.links.action.yml b/rest_example/rest_example.links.action.yml
new file mode 100644
index 0000000..3e8805d
--- /dev/null
+++ b/rest_example/rest_example.links.action.yml
@@ -0,0 +1,5 @@
+rest_example.create_node:
+  route_name: rest_example.client_actions_create
+  title: 'Create node'
+  appears_on:
+    - rest_example.client_actions_index
\ No newline at end of file
diff --git a/rest_example/rest_example.links.menu.yml b/rest_example/rest_example.links.menu.yml
new file mode 100644
index 0000000..e721527
--- /dev/null
+++ b/rest_example/rest_example.links.menu.yml
@@ -0,0 +1,9 @@
+rest_example.settings:
+  title: 'REST Example: Client Settings'
+  description: 'Callback for REST client settings form.'
+  route_name: rest_example.client_settings
+
+rest_example.actions:
+  title: 'REST Example: Client Actions'
+  description: 'Callback for REST client action form.'
+  route_name: rest_example.client_actions_index
\ No newline at end of file
diff --git a/rest_example/rest_example.module b/rest_example/rest_example.module
new file mode 100644
index 0000000..57a2f38
--- /dev/null
+++ b/rest_example/rest_example.module
@@ -0,0 +1,5 @@
+<?php
+/**
+ * @file
+ * An example outlining how a module use the RESTful Web Services.
+ */
\ No newline at end of file
diff --git a/rest_example/rest_example.routing.yml b/rest_example/rest_example.routing.yml
new file mode 100644
index 0000000..0efcadd
--- /dev/null
+++ b/rest_example/rest_example.routing.yml
@@ -0,0 +1,39 @@
+rest_example.client_settings:
+  path: 'examples/rest_client_settings'
+  defaults:
+    _title: 'Connect to a remote Drupal site'
+    _form: '\Drupal\rest_example\Form\RestExampleClientSettings'
+  requirements:
+    _access: 'TRUE'
+
+rest_example.client_actions_index:
+  path: 'examples/rest_client_actions'
+  defaults:
+    _title: 'Nodes on the remote Drupal server'
+    _controller: '\Drupal\rest_example\Controller\RestExampleClientController::indexAction'
+  requirements:
+    _access: 'TRUE'
+    
+rest_example.client_actions_create:
+  path: 'examples/rest_client_actions/create'
+  defaults:
+    _title: 'Create node on remote Drupal server'
+    _form: '\Drupal\rest_example\Form\RestExampleClientEdit'
+  requirements:
+    _access: 'TRUE'
+    
+rest_example.client_actions_edit:
+  path: 'examples/rest_client_actions/edit/{id}'
+  defaults:
+    _title: 'Edit node on remote Drupal server'
+    _form: '\Drupal\rest_example\Form\RestExampleClientEdit'
+  requirements:
+    _access: 'TRUE'
+    
+rest_example.client_actions_delete:
+  path: 'examples/rest_client_actions/delete/{id}'
+  defaults:
+    _title: 'Delete node on remote Drupal server'
+    _form: '\Drupal\rest_example\Form\RestExampleClientDelete'
+  requirements:
+    _access: 'TRUE'
\ No newline at end of file
diff --git a/rest_example/src/Controller/RestExampleClientController.php b/rest_example/src/Controller/RestExampleClientController.php
new file mode 100644
index 0000000..fbecff8
--- /dev/null
+++ b/rest_example/src/Controller/RestExampleClientController.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rest_example\Controller\RestExampleClientController.
+ */
+
+namespace Drupal\rest_example\Controller;
+
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\rest_example\RestExampleClientCalls;
+use Drupal\Component\Utility\String;
+use Drupal\Core\Url;
+
+class RestExampleClientController extends ControllerBase {
+
+  /**
+   * Return a list of all nodes.
+   */
+  public function indexAction() {
+
+    $build = array();
+
+    $client = new RestExampleClientCalls(\Drupal::httpClient());
+    $nodes = $client->index();
+
+    $build['intro'] = array(
+      '#markup' => $this->t('Introduction'),
+    );
+
+    $build['node_table'] = array(
+      '#type' => 'table',
+      '#header' => array($this->t('Title'), $this->t('Type'), $this->t('Publish date'), $this->t('Edit'), $this->t('Delete')),
+      '#empty' => t('There are no items on the remote system yet'),
+    );
+
+    foreach ($nodes as $delta => $node) {
+      $build['node_table'][$delta]['title']['#markup'] = String::checkPlain($node['title']);
+      $build['node_table'][$delta]['type']['#markup'] = String::checkPlain($node['type']);
+      $build['node_table'][$delta]['publish_date']['#markup'] = String::checkPlain($node['created']);
+      $build['node_table'][$delta]['edit']['#markup'] = $this->l($this->t('Edit'), new Url('rest_example.client_actions_edit', array('id' => String::checkPlain($node['nid']))));
+      $build['node_table'][$delta]['delete']['#markup'] = $this->l($this->t('Delete'), new Url('rest_example.client_actions_delete', array('id' => String::checkPlain($node['nid']))));
+    }
+
+    return $build;
+  }
+
+  /**
+   * Create a new node.
+   */
+  public function createAction() {
+
+  }
+
+  /**
+   * Edit a node.
+   */
+  public function editAction($id) {
+
+  }
+
+  /**
+   * Delete a node.
+   */
+  public function deleteAction($id) {
+
+  }
+}
\ No newline at end of file
diff --git a/rest_example/src/Form/RestExampleClientDelete.php b/rest_example/src/Form/RestExampleClientDelete.php
new file mode 100644
index 0000000..068ada1
--- /dev/null
+++ b/rest_example/src/Form/RestExampleClientDelete.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rest_example\Form\RestExampleClientSettings.
+ */
+
+namespace Drupal\rest_example\Form;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\ConfirmFormBase;
+use Drupal\rest_example\RestExampleClientCalls;
+
+/**
+ * @ingroup rest_example
+ *
+ * Deete a new node on a remote Drupal site.
+ */
+class RestExampleClientDelete extends ConfirmFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'rest_example_client_delete';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuestion() {
+    return $this->t('Are you sure that you want to delete this content.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCancelUrl() {
+    return new \Drupal\Core\Url('rest_example.client_actions_index');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConfirmText() {
+    return t('Delete');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state, $id = NULL) {
+    $form = parent::buildForm($form, $form_state);
+
+    if (!is_null($id) && !is_numeric($id)) {
+      return new \Symfony\Component\HttpFoundation\Response('The ID passed in the URL is not an integer', 500);
+    }
+    $form_state->set('node_id', $id);
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $node_id = $form_state->get('node_id');
+    $node = array(
+      'nid' => $node_id,
+    );
+    $client = new RestExampleClientCalls(\Drupal::httpClient());
+    $client->delete($node);
+    $form_state->setRedirect('rest_example.client_actions_index');
+  }
+
+}
diff --git a/rest_example/src/Form/RestExampleClientEdit.php b/rest_example/src/Form/RestExampleClientEdit.php
new file mode 100644
index 0000000..480d1ba
--- /dev/null
+++ b/rest_example/src/Form/RestExampleClientEdit.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rest_example\Form\RestExampleClientSettings.
+ */
+
+namespace Drupal\rest_example\Form;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\FormBase;
+use Drupal\rest_example\RestExampleClientCalls;
+
+/**
+ * @ingroup rest_example
+ *
+ * Edit or create a new node on a remote Drupal site.
+ */
+class RestExampleClientEdit extends FormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'rest_example_client_edit';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state, $id = NULL) {
+    if (!is_null($id) && !is_numeric($id)) {
+      return new \Symfony\Component\HttpFoundation\Response('The ID passed in the URL is not an integer', 500);
+    }
+
+    $title = '';
+    $form_state->set('node_id', NULL);
+    $form_state->set('node_type', 'rest_example_test');
+
+
+    // If this an existing node, we pull the data from the remote and set the
+    // variables that we use as default values later on.
+    if (is_numeric($id)) {
+      $client = new RestExampleClientCalls(\Drupal::httpClient());
+      $node = $client->index($id);
+      if (isset($node[0])) {
+        $title = $node[0]['title'];
+        $form_state->set('node_id', $id);
+        $form_state->set('node_type', $node[0]['type']);
+      }
+    }
+
+    $form['title'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Node title'),
+      '#default_value' => $title,
+    );
+
+    $form['submit'] = array(
+      '#type' => 'submit',
+      '#value' => $this->t('Save'),
+    );
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $node_id = $form_state->get('node_id');
+    $node_type = $form_state->get('node_type');
+    $form_values = $form_state->getValues();
+
+    $node = array(
+      'nid' => $node_id,
+      'title' => $form_values['title'],
+      'type' => $node_type,
+    );
+
+    $client = new RestExampleClientCalls(\Drupal::httpClient());
+    if (is_null($node_id)) {
+      $client->create($node);
+    }
+    else {
+      $client->update($node);
+    }
+
+    $form_state->setRedirect('rest_example.client_actions_index');
+  }
+
+}
diff --git a/rest_example/src/Form/RestExampleClientSettings.php b/rest_example/src/Form/RestExampleClientSettings.php
new file mode 100644
index 0000000..faffd0b
--- /dev/null
+++ b/rest_example/src/Form/RestExampleClientSettings.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rest_example\Form\RestExampleClientSettings.
+ */
+
+namespace Drupal\rest_example\Form;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\ConfigFormBase;
+
+/**
+ * @ingroup rest_example
+ *
+ * Setup form for a Drupal REST client.
+ *
+ * Here you configure what the other Drupal installation.
+ */
+class RestExampleClientSettings extends ConfigFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'rest_example_client_settings';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form['intro'] = array(
+      '#markup' => t('Set here the remote server options.'),
+    );
+    $form['server_url'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Remote server URL'),
+      '#description' => $this->t('Format like this: http://www.example.com'),
+      '#default_value' => $this->config('rest_example.settings')->get('server_url'),
+      '#required' => TRUE,
+    );
+    $form['server_username'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Remote server username'),
+      '#default_value' => $this->config('rest_example.settings')->get('server_username'),
+      '#description' => $this->t('A user on the remote system that has the proper rights to use the REST service'),
+      '#required' => TRUE,
+    );
+    $form['server_password'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Remote server password'),
+      '#default_value' => $this->config('rest_example.settings')->get('server_password'),
+      '#description' => $this->t('Remote users password'),
+      '#required' => TRUE,
+    );
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $form_values = $form_state->getValues();
+    $this->config('rest_example.settings')
+        ->set('server_url', $form_values['server_url'])
+        ->set('server_username', $form_values['server_username'])
+        ->set('server_password', $form_values['server_password'])
+        ->save();
+
+    parent::submitForm($form, $form_state);
+  }
+}
diff --git a/rest_example/src/RestExampleClientCalls.php b/rest_example/src/RestExampleClientCalls.php
new file mode 100644
index 0000000..99f7cad
--- /dev/null
+++ b/rest_example/src/RestExampleClientCalls.php
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\rest_example\RestExampleClientCalls.
+ */
+
+namespace Drupal\rest_example;
+
+/**
+ * Here we interact with the remote service.
+ *
+ * We use Guzzle (what else ;-) ).
+ */
+class RestExampleClientCalls {
+
+  protected $client;
+  protected $remote_password;
+  protected $remote_username;
+  protected $remote_url;
+
+  public function __construct(\GuzzleHttp\ClientInterface $client) {
+    $client->setDefaultOption('headers/Accept', 'application/hal+json');
+    $client->setDefaultOption('headers/Content-Type', 'application/hal+json');
+    $this->client = $client;
+
+    $rest_config = \Drupal::config('rest_example.settings');
+    $this->remote_password = $rest_config->get('server_password');
+    $this->remote_username = $rest_config->get('server_username');
+    $this->remote_url = $rest_config->get('server_url');
+  }
+
+  /**
+   * Retrieve a list of nodes from the remote server.
+   *
+   * When we retrive entities we use GET.
+   *
+   * @param integer $node_id
+   *   The ID of the remote node, if needed. If the ID is NULL, all nodes will
+   *   be fetched.
+   *
+   * @return string
+   *   JSON formatted string with the nodes from the remote server.
+   */
+  public function index($node_id = NULL) {
+
+    $id = '';
+    if (!empty($node_id) && is_numeric($node_id)) {
+      $id = '/' . $node_id;
+    }
+
+    $response = $this->client->get($this->remote_url . '/rest/node' . $id, array('auth' => array($this->remote_username, $this->remote_password)));
+
+    return $response->json();
+  }
+
+  /**
+   * Create a node on the remote server.
+   *
+   * @param array $node
+   *   Contains the data of the node we want to create.
+   */
+  public function create($node) {
+
+    // Build an array of options telling the remote server what type of content
+    // we want to create, and give it a title. After that, we encode it all
+    // to JSON.
+    //$request_body = new \GuzzleHttp\Stream\Stream($stream);
+    $request_body = json_encode(array(
+      '_links' => array(
+        'type' => array(
+          'href' => $this->remote_url . '/rest/type/node/' . $node['type'],
+        )
+      ),
+      'title' => array(0 => array('value' => $node['title'])),
+    ));
+    $response = $this->client->post($this->remote_url . '/entity/node', array('auth' => array($this->remote_username, $this->remote_password), 'body' => $request_body));
+
+    // Validate the response from the remote server.
+    if ($response->getStatusCode() != 201) {
+      return new \Symfony\Component\HttpFoundation\Response('An error occured while creating the node.', 500);
+    }
+  }
+
+  /**
+   * Update (patch) a node on the remote server.
+   *
+   * You are encuraged to read the code and the comments in
+   * RestExampleClientCalls::create() first.
+   *
+   * @param array $node
+   *   Contains the data of the node we want to create.
+   */
+  public function update($node) {
+    $request_body = json_encode(array(
+      '_links' => array(
+        'type' => array(
+          'href' => $this->remote_url . '/rest/type/node/' . $node['type'],
+        )
+      ),
+      'title' => array(0 => array('value' => $node['title'])),
+    ));
+    $response = $this->client->patch($this->remote_url . '/node/' . $node['nid'], array('auth' => array($this->remote_username, $this->remote_password), 'body' => $request_body));
+
+    if ($response->getStatusCode() != 204) {
+      return new \Symfony\Component\HttpFoundation\Response('An error occured while patching the node.', 500);
+    }
+  }
+
+  /**
+   * Delete a node on the remote server.
+   *
+   * You are encuraged to read the code and the comments in
+   * RestExampleClientCalls::create() first.
+   *
+   * @param array $node
+   *   Contains the data of the node we want to create.
+   */
+  public function delete($node) {
+    $response = $this->client->delete($this->remote_url . '/node/' . $node['nid'], array('auth' => array($this->remote_username, $this->remote_password)));
+
+    if ($response->getStatusCode() != 204) {
+      return new \Symfony\Component\HttpFoundation\Response('An error occured while patching the node.', 500);
+    }
+  }
+
+}
