diff --git a/.gitlab-ci/aggregated-entity-fields-cause-schema-exception-2976616-11.patch b/.gitlab-ci/aggregated-entity-fields-cause-schema-exception-2976616-11.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d9a407ebf2b3d558f01686a3e61ac9629af15695
--- /dev/null
+++ b/.gitlab-ci/aggregated-entity-fields-cause-schema-exception-2976616-11.patch
@@ -0,0 +1,36 @@
+diff --git a/core/modules/views/config/schema/views.data_types.schema.yml b/core/modules/views/config/schema/views.data_types.schema.yml
+index 708e12f..bb5c107 100644
+--- a/core/modules/views/config/schema/views.data_types.schema.yml
++++ b/core/modules/views/config/schema/views.data_types.schema.yml
+@@ -574,6 +574,31 @@ views_field:
+     plugin_id:
+       type: string
+       label: 'Plugin ID'
++    # In case of using aggregation, field has numeric settings.
++    set_precision:
++      type: boolean
++      label: 'Round'
++    precision:
++      type: integer
++      label: 'Precision'
++    decimal:
++      type: string
++      label: 'Decimal point'
++    separator:
++      type: string
++      label: 'Thousands marker'
++    format_plural:
++      type: boolean
++      label: 'Format plural'
++    format_plural_string:
++      type: plural_label
++      label: 'Plural variants'
++    prefix:
++      type: label
++      label: 'Prefix'
++    suffix:
++      type: label
++      label: 'Suffix'
+ 
+ views_pager:
+   type: mapping
diff --git a/.gitlab-ci/build.php b/.gitlab-ci/build.php
index f1c8e4489189d8827b4070695f34de63b9be306c..d091f65dc6dc1fc2c3b10b44b45ba140e19edeb8 100644
--- a/.gitlab-ci/build.php
+++ b/.gitlab-ci/build.php
@@ -40,50 +40,82 @@ $this->taskComposerConfig()
   ->noInteraction()
   ->noAnsi()
   ->workingDir($this->docRoot)
-  ->repository("0", "https://packages.startx.be", "composer")
+  ->repository("1", "https://packages.startx.be", "composer")
   ->run();
 
 $this->taskComposerConfig()
   ->noInteraction()
   ->noAnsi()
   ->workingDir($this->docRoot)
-  ->repository("1", "https://packages.drupal.org/8", "composer")
+  ->repository("0", "https://packages.drupal.org/8", "composer")
   ->run();
 
+$this->taskComposerConfig()
+  ->noInteraction()
+  ->noAnsi()
+  ->workingDir($this->docRoot)
+  ->args(["minimum-stability", "dev"])
+  ->run();
+
+$repo = <<<EOT
+{
+  "type": "package",
+  "package": {
+    "name": "google/charts",
+    "version": "45",
+    "type": "drupal-library",
+    "extra": {
+      "installer-name": "google_charts"
+    },
+    "dist": {
+      "url": "https://www.gstatic.com/charts/loader.js",
+      "type": "file"
+    },
+    "require": {
+      "composer/installers": "~1.0"
+    }
+  }
+}
+EOT;
+
+$this->_exec("composer config --working-dir {$this->docRoot} repositories.100 '{$repo}' --no-interaction --no-ansi");
+
 $this->composerRequire()
-  ->dependency("drupal/accounting", "^1.0.10")
+  ->dependency("drupal/accounting", "^1.0.11")
   ->dependency('drupal/address', '^1.8')
-  ->dependency("drupal/admin_toolbar", "^2.2")
   ->dependency("drupal/advanced_help", "^1.0@alpha")
   ->dependency("drupal/charts", "3.x-dev")
   ->dependency("drupal/cleave_js", "^1.0")
   ->dependency("drupal/currency", "^3.2")
   ->dependency("drupal/drush_language", "^1.0@RC")
-  ->dependency("drupal/dsr", "^1.0")
+  ->dependency("drupal/dsr", "^1.0.21")
   ->dependency("drupal/formtips", "^1.1")
   ->dependency("drupal/banking", "^v1.0.20")
   ->dependency("drupal/banking_import_coda", "^1.0.2")
   ->dependency("drupal/banking_import_myponto", "^1.0.0")
   ->dependency("drupal/banking_orders", "^1.0.2")
-  ->dependency("drupal/banking_orders_accounting", "^1.0.2")
+  ->dependency("drupal/banking_orders_accounting", "^1.0.3")
   ->dependency("drupal/iban_bic_field", "^1.0")
   ->dependency('drupal/inline_entity_form', '^1.0')
   ->dependency("drupal/mail_template", "^1.0.7")
-  ->dependency("drupal/mollie_payment", "^2.0@RC")
+  ->dependency("drupal/mollie_payment", "^3.0")
   ->dependency("drupal/page_manager", "4.x-dev")
   ->dependency("drupal/panels", "^4.3")
   ->dependency("drupal/payment", "^2.0")
   ->dependency("drupal/shareholder_register", "^1.0.21")
   ->dependency("drupal/shareholder_register_accounting", "^1.0.21")
   ->dependency("drupal/simple_workflows", "^1.0.3")
-  ->dependency('drupal/views_bulk_operations', '^2.6.0')
+  ->dependency("drupal/swiftmailer", "^2.0")
+  ->dependency('drupal/views_bulk_operations', '^4.0')
   ->dependency("drupal/vbo_export", "~3.0")
   ->dependency("drupal/webform", "^6.0")
   ->dependency("drupal/webform_views", "^5.0@alpha")
   // ->dependency("google/charts", "45")
-  ->dependency("drupal/swiftmailer", "^1.0")
   ->dependency("drupal/twig_tweak", "^2.0")
   ->dependency("drupal/drush_language", "1.x-dev")
+  ->dependency("drupal/email_registration", "^1.1")
   ->run();
 
-$this->_exec("cat /builds/DAR/dsr_demo/.gitlab-ci/webform_views-schema.patch | patch -p 1 -d {$this->webRoot}/modules/contrib/webform_views/");
+$this->_exec("cat /builds/DAR/dsr_portal/.gitlab-ci/webform_views-schema.patch | patch -p 1 -d {$this->webRoot}/modules/contrib/webform_views/");
+$this->_exec("cat /builds/DAR/dsr_portal/.gitlab-ci/vbo_export-schema.patch | patch -p 1 -d {$this->webRoot}/modules/contrib/vbo_export/");
+$this->_exec("cat /builds/DAR/dsr_portal/.gitlab-ci/aggregated-entity-fields-cause-schema-exception-2976616-11.patch | patch -p 1 -d {$this->webRoot}/");
diff --git a/.gitlab-ci/vbo_export-schema.patch b/.gitlab-ci/vbo_export-schema.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ff257c7dc160e614e9f3119f54b22aeec51845d9
--- /dev/null
+++ b/.gitlab-ci/vbo_export-schema.patch
@@ -0,0 +1,15 @@
+diff --git a/config/schema/vbo_export.schema.yml b/config/schema/vbo_export.schema.yml
+index 5b4eaa9..e64e1dc 100644
+--- a/config/schema/vbo_export.schema.yml
++++ b/config/schema/vbo_export.schema.yml
+@@ -17,6 +17,9 @@ views_bulk_operations.action_config.vbo_export_generate_xlsx_action:
+   type: views_bulk_operations_action_config
+   label: 'Export to xlsx'
+   mapping:
++    strip_tags:
++      type: boolean
++      label: 'Should HTML be stripped?'
+     field_override:
+       type: boolean
+     field_config:
+
diff --git a/composer.json b/composer.json
index 50efdcb6fbd1dd7bdcc0d52a63752cc13b00ecd5..f2f2b9310a710e6d720000e97f10f656d1cbf1f8 100644
--- a/composer.json
+++ b/composer.json
@@ -11,7 +11,8 @@
     "source": "http://cgit.drupalcode.org/dsr_portal"
   },
   "require": {
-    "drupal/dsr": "^1.0.21"
+    "drupal/dsr": "^1.0.21",
+    "drupal/email_registration": "^1.1"
   },
   "extra": {
     "drush": {
diff --git a/config/install/core.entity_view_mode.shareholder.portal.yml b/config/install/core.entity_view_mode.shareholder.portal.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cc3ae7e68201483b36e5a6caacd8d9787f6f2577
--- /dev/null
+++ b/config/install/core.entity_view_mode.shareholder.portal.yml
@@ -0,0 +1,10 @@
+uuid: d1f93f0a-c2ce-4ad3-b776-10125eccc130
+langcode: en
+status: true
+dependencies:
+  module:
+    - shareholder_register
+id: shareholder.portal
+label: Portal
+targetEntityType: shareholder
+cache: true
diff --git a/config/install/user.role.shareholder_register_portal.yml b/config/install/user.role.shareholder_register_portal.yml
new file mode 100644
index 0000000000000000000000000000000000000000..61c6e3a0f716a1553f0bef2da327eb262242d0fb
--- /dev/null
+++ b/config/install/user.role.shareholder_register_portal.yml
@@ -0,0 +1,13 @@
+langcode: en
+status: true
+dependencies: {  }
+id: shareholder_register_portal
+label: 'Shareholder register portal'
+weight: 6
+is_admin: null
+permissions:
+  - 'access user profiles'
+  - 'edit own shareholder entities'
+  - 'view all share issue entities'
+  - 'view own share transaction entities'
+  - 'view own shareholder entities'
diff --git a/config/install/views.view.portal_share_transactions.yml b/config/install/views.view.portal_share_transactions.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1eef7b4c3d338db9def2e5c5a3f06c6d949767b3
--- /dev/null
+++ b/config/install/views.view.portal_share_transactions.yml
@@ -0,0 +1,509 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - datetime
+    - shareholder_register
+    - user
+id: portal_share_transactions
+label: 'portal share transactions'
+module: views
+description: ''
+tag: ''
+base_table: users_field_data
+base_field: uid
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access user profiles'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          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: some
+        options:
+          items_per_page: 5
+          offset: 0
+      style:
+        type: table
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          override: true
+          sticky: false
+          caption: ''
+          summary: ''
+          description: ''
+          columns:
+            id: id
+            date: date
+            quantity: quantity
+            share_issue_id: share_issue_id
+          info:
+            id:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            date:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            quantity:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            share_issue_id:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+          default: '-1'
+          empty_table: false
+      row:
+        type: fields
+      fields:
+        id:
+          id: id
+          table: share_transaction
+          field: id
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          label: ID
+          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: 0
+            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: number_integer
+          settings:
+            thousand_separator: ''
+            prefix_suffix: true
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: id
+          plugin_id: field
+        date:
+          id: date
+          table: share_transaction
+          field: date
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          label: Date
+          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: 0
+            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: datetime_default
+          settings:
+            timezone_override: ''
+            format_type: shareholder_register_date
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: date
+          plugin_id: field
+        quantity:
+          id: quantity
+          table: share_transaction
+          field: quantity
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          label: Quantity
+          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: 0
+            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: number_integer
+          settings:
+            thousand_separator: ''
+            prefix_suffix: true
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: quantity
+          plugin_id: field
+        share_issue_id:
+          id: share_issue_id
+          table: share_transaction
+          field: share_issue_id
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          label: 'Share Issue'
+          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: 0
+            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: target_id
+          type: entity_reference_label
+          settings:
+            link: false
+          group_column: target_id
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: share_issue_id
+          plugin_id: field
+      filters:
+        status:
+          value: '1'
+          table: users_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: user
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+          group: 1
+        state:
+          id: state
+          table: share_transaction
+          field: state
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          operator: '='
+          value: valid
+          group: 1
+          exposed: false
+          expose:
+            operator_id: ''
+            label: ''
+            description: ''
+            use_operator: false
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+            identifier: ''
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+            placeholder: ''
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+          entity_type: share_transaction
+          entity_field: state
+          plugin_id: string
+      sorts: {  }
+      title: 'Portal shares'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships:
+        shareholders_target_id:
+          id: shareholders_target_id
+          table: user__shareholders
+          field: shareholders_target_id
+          relationship: none
+          group_type: group
+          admin_label: Shareholder
+          required: true
+          entity_type: user
+          entity_field: shareholders
+          plugin_id: standard
+        transactions:
+          id: transactions
+          table: shareholder
+          field: transactions
+          relationship: shareholders_target_id
+          group_type: group
+          admin_label: 'Share Transactions'
+          required: false
+          entity_type: shareholder
+          plugin_id: standard
+      arguments:
+        uid:
+          id: uid
+          table: users_field_data
+          field: uid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: default
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: false
+          title: ''
+          default_argument_type: current_user
+          default_argument_options: {  }
+          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: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          break_phrase: false
+          not: false
+          entity_type: user
+          entity_field: uid
+          plugin_id: user_uid
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - user.permissions
+      tags: {  }
+  block_1:
+    display_plugin: block
+    id: block_1
+    display_title: Block
+    position: 1
+    display_options:
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - user.permissions
+      tags: {  }
diff --git a/config/install/views.view.portal_shares.yml b/config/install/views.view.portal_shares.yml
new file mode 100644
index 0000000000000000000000000000000000000000..102cd8e03f9467d3dc298f907cacf8a675abb29b
--- /dev/null
+++ b/config/install/views.view.portal_shares.yml
@@ -0,0 +1,549 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - shareholder_register
+    - user
+id: portal_shares
+label: 'Portal shares'
+module: views
+description: ''
+tag: ''
+base_table: users_field_data
+base_field: uid
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access user profiles'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          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: some
+        options:
+          items_per_page: 5
+          offset: 0
+      style:
+        type: table
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          override: true
+          sticky: false
+          caption: ''
+          summary: ''
+          description: ''
+          columns:
+            payment_date: payment_date
+            id: id
+            field_project: field_project
+            quantity: quantity
+            share_issue_id: share_issue_id
+            share_numbers_field: share_numbers_field
+            shares_total_value: shares_total_value
+            share_value: share_value
+            state: state
+            date: date
+          info:
+            payment_date:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            id:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            field_project:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            quantity:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            share_issue_id:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            share_numbers_field:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            shares_total_value:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            share_value:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            state:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            date:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+          default: '-1'
+          empty_table: false
+      row:
+        type: fields
+      fields:
+        share_issue_id:
+          id: share_issue_id
+          table: share_transaction
+          field: share_issue_id
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          label: 'Share Issue'
+          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: 0
+            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: target_id
+          type: entity_reference_label
+          settings:
+            link: false
+          group_column: target_id
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: share_issue_id
+          plugin_id: field
+        quantity:
+          id: quantity
+          table: share_transaction
+          field: quantity
+          relationship: transactions
+          group_type: sum
+          admin_label: ''
+          label: Quantity
+          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: 0
+            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_string: !!binary MQNAY291bnQ=
+          prefix: ''
+          suffix: ''
+          click_sort_column: value
+          type: number_integer
+          settings:
+            thousand_separator: ''
+            prefix_suffix: true
+          group_column: null
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: quantity
+          plugin_id: field
+        share_value:
+          id: share_value
+          table: share_transaction
+          field: share_value
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          label: 'Share Value'
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: true
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: true
+            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
+          click_sort_column: value
+          type: number_decimal
+          settings:
+            thousand_separator: ''
+            prefix_suffix: false
+            decimal_separator: .
+            scale: 2
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: share_transaction
+          entity_field: share_value
+          plugin_id: field
+        nothing:
+          id: nothing
+          table: views
+          field: nothing
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: 'Share Total Value'
+          exclude: false
+          alter:
+            alter_text: true
+            text: '{{quantity|number_format * share_value|striptags}} ( {{ quantity }} x {{ share_value }} )'
+            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: 0
+            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: false
+          plugin_id: custom
+      filters:
+        status:
+          value: '1'
+          table: users_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: user
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+          group: 1
+        state:
+          id: state
+          table: share_transaction
+          field: state
+          relationship: transactions
+          group_type: group
+          admin_label: ''
+          operator: '='
+          value: valid
+          group: 1
+          exposed: false
+          expose:
+            operator_id: ''
+            label: ''
+            description: ''
+            use_operator: false
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+            identifier: ''
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+            placeholder: ''
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+          entity_type: share_transaction
+          entity_field: state
+          plugin_id: string
+      sorts: {  }
+      title: 'Portal share transactions'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships:
+        shareholders_target_id:
+          id: shareholders_target_id
+          table: user__shareholders
+          field: shareholders_target_id
+          relationship: none
+          group_type: group
+          admin_label: Shareholder
+          required: true
+          entity_type: user
+          entity_field: shareholders
+          plugin_id: standard
+        transactions:
+          id: transactions
+          table: shareholder
+          field: transactions
+          relationship: shareholders_target_id
+          group_type: group
+          admin_label: 'Share Transactions'
+          required: false
+          entity_type: shareholder
+          plugin_id: standard
+      arguments:
+        uid:
+          id: uid
+          table: users_field_data
+          field: uid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: default
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: false
+          title: ''
+          default_argument_type: current_user
+          default_argument_options: {  }
+          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: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          break_phrase: false
+          not: false
+          entity_type: user
+          entity_field: uid
+          plugin_id: user_uid
+      display_extenders: {  }
+      group_by: true
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - user.permissions
+      tags: {  }
+  block_1:
+    display_plugin: block
+    id: block_1
+    display_title: Block
+    position: 1
+    display_options:
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - user.permissions
+      tags: {  }
diff --git a/config/install/views.view.portal_user.yml b/config/install/views.view.portal_user.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a36c99604c9d09455e01778e672965196e3c5083
--- /dev/null
+++ b/config/install/views.view.portal_user.yml
@@ -0,0 +1,333 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - shareholder_register
+    - user
+id: portal_user
+label: 'Portal user'
+module: views
+description: ''
+tag: ''
+base_table: users_field_data
+base_field: uid
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access user profiles'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          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: some
+        options:
+          items_per_page: 5
+          offset: 0
+      style:
+        type: default
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+      row:
+        type: fields
+      fields:
+        shareholders_target_id:
+          id: shareholders_target_id
+          table: user__shareholders
+          field: shareholders_target_id
+          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: 0
+            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: target_id
+          type: entity_reference_entity_view
+          settings:
+            view_mode: portal
+          group_column: target_id
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: user
+          entity_field: shareholders
+          plugin_id: field
+        id:
+          id: id
+          table: shareholder
+          field: id
+          relationship: shareholders_target_id
+          group_type: group
+          admin_label: ''
+          label: ID
+          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: 0
+            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
+          click_sort_column: value
+          type: number_integer
+          settings:
+            thousand_separator: ''
+            prefix_suffix: true
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+          entity_type: shareholder
+          entity_field: id
+          plugin_id: field
+        nothing:
+          id: nothing
+          table: views
+          field: nothing
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: true
+            text: '{{ ''Download certificate'' | t }}'
+            make_link: true
+            path: '/admin/shareholder_register/shareholder/{{ id }}/certificate'
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: button
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: 0
+            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: false
+          plugin_id: custom
+      filters:
+        status:
+          value: '1'
+          table: users_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: user
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+            operator_limit_selection: false
+            operator_list: {  }
+          group: 1
+      sorts: {  }
+      title: 'Portal user'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships:
+        shareholders_target_id:
+          id: shareholders_target_id
+          table: user__shareholders
+          field: shareholders_target_id
+          relationship: none
+          group_type: group
+          admin_label: Shareholder
+          required: true
+          entity_type: user
+          entity_field: shareholders
+          plugin_id: standard
+      arguments:
+        uid:
+          id: uid
+          table: users_field_data
+          field: uid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          default_action: default
+          exception:
+            value: all
+            title_enable: false
+            title: All
+          title_enable: false
+          title: ''
+          default_argument_type: current_user
+          default_argument_options: {  }
+          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: false
+          validate:
+            type: none
+            fail: 'not found'
+          validate_options: {  }
+          break_phrase: false
+          not: false
+          entity_type: user
+          entity_field: uid
+          plugin_id: user_uid
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - user.permissions
+      tags: {  }
+  block_1:
+    display_plugin: block
+    id: block_1
+    display_title: Block
+    position: 1
+    display_options:
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - user
+        - user.permissions
+      tags: {  }
diff --git a/dsr_portal.info.yml b/dsr_portal.info.yml
index 3a88ac586c74a39764f894e6adb5726a6e584743..73737f275fdea6c0d06d1e6a255c4b87fad62ec1 100644
--- a/dsr_portal.info.yml
+++ b/dsr_portal.info.yml
@@ -5,3 +5,4 @@ core_version_requirement: ^8.8 || ^9
 package: 'startx'
 dependencies:
   - dsr
+  - email_registration
diff --git a/dsr_portal.module b/dsr_portal.module
index 6dc178e340d2196382824087a7e5df4c1200cb14..730f7f8cc57b10aba9a0c1b3447ad1af56249e59 100644
--- a/dsr_portal.module
+++ b/dsr_portal.module
@@ -52,3 +52,18 @@ function dsr_portal_user_insert(EntityInterface $entity) {
     }
   }
 }
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function dsr_portal_form_user_form_alter(&$form, &$form_state) {
+  // Redirect users to their profile pages.
+  $form['actions']['submit']['#submit'][] = 'dsr_portal_user_edit_form_submit';
+}
+
+/**
+ * Redirect users to their profile pages when submitting the edit form.
+ */
+function dsr_portal_user_edit_form_submit($form, &$form_state) {
+  $form_state->setRedirect('entity.user.canonical', ['user' => \Drupal::currentUser()->id()]);
+}
diff --git a/tests/src/Functional/LoadTest.php b/tests/src/Functional/LoadTest.php
index 7c802c7b0e0590e35e57a300e7e287aeb3cc9592..4fd963e02a402776a72ae70336a0df3cec55b2af 100644
--- a/tests/src/Functional/LoadTest.php
+++ b/tests/src/Functional/LoadTest.php
@@ -19,6 +19,11 @@ class LoadTest extends BrowserTestBase {
    */
   public static $modules = ['dsr_portal'];
 
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
   /**
    * A user with permission to administer site configuration.
    *
@@ -31,7 +36,13 @@ class LoadTest extends BrowserTestBase {
    */
   protected function setUp() {
     parent::setUp();
-    $this->user = $this->drupalCreateUser(['administer site configuration']);
+    // $this->user = $this->drupalCreateUser(['administer site configuration']);
+    // Check if custom username stays the same when user is edited.
+    $this->container->get('config.factory')
+      ->getEditable('email_registration.settings')
+      ->set('login_with_username', TRUE)
+      ->save(TRUE);
+    $this->user = $this->createUser(['administer site configuration'], 'info@startx.be');
     $this->drupalLogin($this->user);
   }