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 1b749420ce01fc9617979490114e89ce14bdc662..6a47825fe2e19f5e97088dde874494a1c1d51181 100644
--- a/.gitlab-ci/build.php
+++ b/.gitlab-ci/build.php
@@ -82,6 +82,7 @@ $this->_exec("composer config --working-dir {$this->docRoot} repositories.100 '{
 
 $this->composerRequire()
   ->dependency("drupal/dsr", "^1.0.21")
+  ->dependency("drupal/dsr_portal", "^1.0")
   ->dependency("drupal/swiftmailer", "^2.2")
   ->dependency("drupal/telephone_international_widget", "^1.0")
   ->dependency("drupal/telephone_validation", "^2.0")
@@ -95,4 +96,5 @@ $this->composerRequire()
 
 $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_demo/.gitlab-ci/vbo_export-schema.patch | patch -p 1 -d {$this->webRoot}/modules/contrib/vbo_export/");
+$this->_exec("cat /builds/DAR/dsr_demo/.gitlab-ci/aggregated-entity-fields-cause-schema-exception-2976616-11.patch | patch -p 1 -d {$this->webRoot}/");
 
diff --git a/composer.json b/composer.json
index aad796646b6256a8132440f17c992021728ff4df..ac1b97d33bd1b6f3600307a535cdad01c61b57e0 100644
--- a/composer.json
+++ b/composer.json
@@ -31,6 +31,7 @@
     }
   ],
   "require": {
+    "drupal/dsr_portal": "^1.0",
     "drupal/dsr": "^1.0.21",
     "drupal/field_rrn_nrn": "^1.0",
     "drupal/swiftmailer": "^2.2",
diff --git a/config/install/core.entity_view_display.shareholder.natural_person.portal.yml b/config/install/core.entity_view_display.shareholder.natural_person.portal.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f08ad07a8f4022481d5ee3d3b6183aaec7289853
--- /dev/null
+++ b/config/install/core.entity_view_display.shareholder.natural_person.portal.yml
@@ -0,0 +1,110 @@
+uuid: 5b245ceb-0185-4c01-b503-5d6d4eead54b
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.shareholder.portal
+    - field.field.shareholder.natural_person.field_iban
+    - field.field.shareholder.natural_person.field_mobile
+    - field.field.shareholder.natural_person.field_no_dividend
+    - field.field.shareholder.natural_person.field_no_taxshelter
+    - field.field.shareholder.natural_person.field_phone
+    - field.field.shareholder.natural_person.field_tax_return_non_resident
+    - shareholder_register.shareholder_type.natural_person
+  module:
+    - datetime
+    - shareholder_register
+id: shareholder.natural_person.portal
+targetEntityType: shareholder
+bundle: natural_person
+mode: portal
+content:
+  address:
+    label: above
+    type: 'shareholder_address_property formatter'
+    weight: 5
+    region: content
+    settings:
+      property: given_name
+    third_party_settings: {  }
+  deceased_date:
+    label: above
+    type: datetime_default
+    weight: 6
+    region: content
+    settings:
+      format_type: medium
+      timezone_override: ''
+    third_party_settings: {  }
+  identifier:
+    label: above
+    type: string
+    weight: 2
+    region: content
+    settings:
+      link_to_entity: false
+    third_party_settings: {  }
+  mail:
+    label: above
+    type: email_mailto
+    weight: 4
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  name:
+    label: above
+    type: string
+    weight: 0
+    region: content
+    settings:
+      link_to_entity: false
+    third_party_settings: {  }
+  number:
+    label: above
+    type: string
+    weight: 1
+    region: content
+    settings:
+      link_to_entity: false
+    third_party_settings: {  }
+  registration_date:
+    label: above
+    type: datetime_default
+    weight: 3
+    region: content
+    settings:
+      format_type: medium
+      timezone_override: ''
+    third_party_settings: {  }
+  share_count:
+    label: above
+    weight: 7
+    region: content
+    settings:
+      thousand_separator: ''
+      prefix_suffix: true
+    third_party_settings: {  }
+    type: number_integer
+  share_value:
+    label: above
+    weight: 8
+    region: content
+    settings:
+      thousand_separator: ''
+      decimal_separator: .
+      scale: 2
+      prefix_suffix: true
+    third_party_settings: {  }
+    type: number_decimal
+hidden:
+  dividends: true
+  field_iban: true
+  field_mobile: true
+  field_no_dividend: true
+  field_no_taxshelter: true
+  field_phone: true
+  field_tax_return_non_resident: true
+  journal_entries: true
+  preferred_langcode: true
+  transactions: true
+  user_id: true
diff --git a/config/optional/shareholder_register.settings.yml b/config/optional/shareholder_register.settings.yml
index 97ba91c04274717b4091c26533c459e3701c6927..fd0c084cd495da550bf415ff009d467d8fb97827 100644
--- a/config/optional/shareholder_register.settings.yml
+++ b/config/optional/shareholder_register.settings.yml
@@ -6,3 +6,5 @@ company_zip: '2018'
 company_locality: Antwerpen
 company_id: BE0894.092.649
 company_date_of_incorporation: '2014-03-20'
+limit_automatic_mail_extract_upon_validation: FALSE
+limit_automatic_mail_extract_upon_validation_types: {}
diff --git a/dsr_demo.info.yml b/dsr_demo.info.yml
index 416a36196ab5921c8d16617b141f25c05005673c..c02455f0f423d32784e9bb4a2bccadde92280add 100644
--- a/dsr_demo.info.yml
+++ b/dsr_demo.info.yml
@@ -15,6 +15,7 @@ dependencies:
   - dsr_sign_up_form
   - dsr_dashboard
   - dsr_gift_certificates
+  - dsr_portal
   - field_rrn_nrn
   - iban_field
   - locale
diff --git a/tests/src/Functional/LoadTest.php b/tests/src/Functional/LoadTest.php
index bdbb134a6cf9d39d17a5a72d0d78fb787ab2d734..7008d5333227d6ef80151c41f26734fb2090aaf1 100644
--- a/tests/src/Functional/LoadTest.php
+++ b/tests/src/Functional/LoadTest.php
@@ -38,7 +38,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);
   }